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

本文信息本文由方法SEO顾问发表于2014-08-21 10:03 星期四,共 2519字。转载请注明:根据标题调取相关文章实现方法一例_【方法SEO顾问】,如果我网站的文章对你有所帮助的话,来百度口碑给个好评呗!

相关的文章标题 — MySQL分词与相关性查询

很多网站在文章的最后,显示一些与本文章相关的标题链接,不但方便用户阅读,也有利于搜索引擎抓取,觉得效果不错。

于是我用比较简单易行的方式,实现这个功能,实例见这个链接:

http://www.k810.com/html/guide_details/86.htm

该文章的标题是"CORELDRAW印刷输出注重事项",在文章的最后,显示:

您可以阅读与"CORELDRAW印刷输出注重事项"相关的教程:

· 图片的印刷输出精度

· Corel Draw印刷输出的关键补遗

· 输出陷阱与解决方案(一)

· 输出菲林前应该做些什么

· 输出之前做些什么?

先说一下思路。分词以"简单易行"的方式,把"K810快精灵印艺坊",分为: K810/快精/精灵/灵印/印艺/艺坊,然后在数据库中搜索含有以上"关键词"的标题,含

"关键词"越多的,则认为相关性越高而排在最前面。

下面是实现的代码,含解释。

PHP code

<?
//包含全局文件,定义数据库的类 $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 />";
}
?>

虽然这样分词不是很科学, 但在这实现这个相关性查询与排序的功能中,不失为一种"简单易行"的方法.

在我做的网站的教程栏目中(http://www.k810.com/html/tech.htm),可以发现相关的文章匹配程度还是很高的.

如果你有什么更好的方法,可以一起讨论.

来源: <http://bbs.csdn.net/topics/330102333>

  • 版权声明:除非注明,本博客均为北京SEO方法的原创文章,转载或引用请以超链接形式标明本文地址,否则会在SEO圈内公开此种不尊重版权的行为,谢谢合作!本文地址:https://seofangfa.com/seo-basis/related-post.html

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

  1. avatar 11

    感谢楼主无私分享,学习了。我这里有一个新手学习网站优化交流群:481647222,也无私奉献给大家给大家,希望大家一起学习交流,早日成为大神。再次感谢博主的无私奉献,我天天来关注你哦.