当前位置:首页 > 二营长SEO > 根据标题调取相关文章实现方法

根据标题调取相关文章实现方法

作者:帅气的安迪 发布时间:2016-12-11 点击:

很多网站在文章的最后,显示一些与本文章相关的标题链接,不但方便用户阅读,也有利于搜索引擎抓取,觉得效果不错。于是我用比较简单易行的方式,实现这个功能,实例见这个链接:http://www.k810.com/html/guide_details/86.htm,该文章的标题是"CORELDRAW印刷输出注重事项",在文章的最后


先说一下思路。分词以"简单易行"的方式,把"K810快精灵印艺坊",分为:">

数据库中搜索含有以上"关键词"的标题,含"关键词"越多的,则认为相关性越高而排在最前面。下面是实现的代码,含解释。

//包含全局文件,定义数据库的类 $$db ,连接数据库等 
include("global.php"); 
   
		 
//下面是中文分词函数 
function ChineseWordSegment($$str){ 
$$words = array(); 
   
		 
//utf-8 编码的正则,分别意思是: 英文符号与空格|英文及数字|汉字范围一|汉字范围二 
//汉字占三个字符 
$$pa = "/[[:punct:]|\\s_]+|[a-z0-9]+|\xe0[\xa0-\xbf][\x80-\xbf]|[\xe1-\xef][\x80-\xbf][\x80-\xbf]/mi";
   
		 
//若网站是 gb2312 编码,则汉字占两个字符,正则应改为 
//$$pa = "/[[:punct:]|\\s_]+|[a-z0-9]+|[\x80-\xff]{2}/mi"; 
   
		 
//排除汉字中的符号 
$$punctcn = "~!·#¥%…—*()—+{}[]|、;:‘’“”,。《》?/ "; 
   
		 
//按正则把$$str分割成数组 $$r 
//$$r元素的值可能为:一串英文符号与空格,一串英文及数字,一个汉字或汉字符号 
preg_match_all($$pa,$$str,$$r); 
   
		 
$$lv = ''; 
//把相临的2个汉字组成一个"词" 
foreach($$r[0] as $$k=>$$v) { 
//如果不是汉字 
//过滤掉英文符号或空格,单个字母或数字 
//不和前一个元素组合,而自成一个"词" 
if(ord($$v[0])<128){ 
if(preg_match('/^[a-z0-9]{2,}$$/i',$$v)) $$words[] = $$v; 
$$lv = ''; 
continue; 
} 
//如果是汉字符号,过滤掉,不组"词" 
if(strrchr($$punctcn,$$v)){ 
$$lv = ''; 
continue; 
} 
//汉字,和前一个汉字组成一个"词" 
if($$lv) $$words[] = $$lv.$$v; 
$$lv = $$v; 
} 
return $$words; 
} 
   
		 
//计算一个词语在内容中出现的次数 
function showtimes($$word,$$content){ 
$$nc = str_replace("$$word","",$$content); 
return (strlen($$content)-strlen($$nc))/strlen($$word); 
} 
   
		 
   
		 
$$articleid = 100; //设文章的ID为 100 
   
		 
$$query = $$db->query("select * from k810_article where articleid=$$articleid "); 
$$article = $$db->fetch_array($$query); //得到文章的记录 $$article 
   
		 
$$words = ChineseWordSegment($$article['title']); //把文章的标题进行分词 
   
		 
//print_r($$words); 
   
		 
//mysql 的 like 查询一语句,因为 like 会返回 1 或 0, 
//所以将后分词的 like 结果乘以权重,再进行相加, 
//相加的和越大记录的排在越前面,和相同的记录随机排序 
   
		 
$$sqlstr = '('; 
foreach($$words as $$k=>$$w){ 
// $$im 为该分词的权重. 
// 在文章内容中出现该词的次数越多,该词 like 匹配的结果数字会越大 
// 则含有该词的标题越容易排在前面 
$$im = 1 + showtimes($$w,strip_tags($$article['details'])); 
$$sqlstr .= ($$k?'+':'')."(`title` like '%".mysql_escape_string($$w)."%')*$$im"; 
} 
$$sqlstr .= ")"; 
   
		 
$$mysql = "select articleid,title,$$sqlstr as mylike from k810_article where articleid<>$$articleid and $$sqlstr order by mylike desc,rand() limit 5"; 
   
		 
//echo $$mysql; 
   
		 
//可以看到 $$sqlstr 这一串比较长的 like 语句,在查询中出现2次, 
//一次用来筛选结果,一次用来进行相关性排序. 
//但 mysql 优化器会注意到两串 like 语句是一样的,不会占用额外的资源计算2次. 
   
		 
   
		 
echo "您可以阅读与\"<strong>$$article[title]</strong>\"相关的教程:<br />"; 
   
		 
$$query = $$db->query($$mysql); 
while($$result = $$db->fetch_array($$query)){ 
echo "&middot; <a href=\"tech_details.php?articleid=$$result[articleid]\">$$result[title]</a><br />"; 
} 
   
		 
?>


邮箱:techseo.cn@gmail.com,欢迎交流。
上一篇:百度主动推送Python代码      下一篇:.htaccess301跳转,史上最全写法