发布时间:2020-06-23 14:39:42 人气:
大家好我是张海洋,擅长互联网SEO,今天再优化网站时忽然看到百度知道的相关推荐文章非常精准,百度采用的是分词精准调取,类似于我前面分享过采用关键词调用标题的方法,但是如果采用标题相似度方式调取文章标题也可以达到百度那种效果。
现在我把原理分析一下,首先获取本篇文章标题,再调取数据库所有文章标题进行挨个对比相似度,达到50%以上的相似度进行展现,其实这个值可以设置到80%或70%都可以,根据你站内文章多少而论,如果站内文章太少会有个别标题无法调取到数据。
<?php
$classname=$class_r[$navclassid][classname]; //获取当前栏目名称
$_class=$empire->fetch1("select * from {$dbtbpre}enewsclass where classid='$GLOBALS[navclassid]'"); //获取当前栏目副标题
$bname=$_class[bname];
$title=$bname?$bname:$classname; //如果副栏目为空则显示主栏目名称
//echo $title;
$sqlt=$empire->query("select * from {$dbtbpre}ecms_news"); //获取所有文章,如果你想获取当前栏目文章自行添加栏目id
while($r=$empire->fetch($sqlt))
{
$id=$r[id]; $arr_title= $r['title']; //遍历文章ID和标题
similar_text($arr_title,$title,$percent); //将所有标题和当前标题进行对比
$percent_arr[$id]=$percent; //获取对比度百分数合并成数组
//print_r($percent_arr);
}
arsort($percent_arr); //按照相似的百分比由高到低排序
reset($percent_arr); //将指针移到数组的第一单元
foreach($percent_arr as $key => $value){
if($value>=30){$keyarr[]=$key;}else{"";} //百分比大于等于30的数组ID值放入数组中,30可以自行设置
}
$newsid = implode(",", $keyarr); //将数组用逗号分隔
if($newsid==""){$newsid=2;} //如果数组为空,随机分配一个2,防止数据库id为空报错
//print_r($newsid);
$sql=$empire->query("select * from {$dbtbpre}ecms_news where id in ('$newsid') order by find_in_set(id,'$newsid') limit 20"); //将百分比高的排序id放入数据库查询,并且按查询id排序
while($bqr=$empire->fetch($sql))
{ ?>
<li><a href="<?=$bqr['titleurl']?>" target="_self" title="<?=$bqr['title']?>" <?php if($navinfor[id]==$bqr['id']){echo 'rel="nofollow"';} ?>><?=$bqr['title']?></a></li>
<? } ?>
<?php
$title=$navinfor['ftitle']?$navinfor['ftitle']:$navinfor['title']; //副标题为空则显示主标题
$classid=$GLOBALS[navclassid]; //获取当前栏目id 如果只获取本栏目文章下面查询中自行添加where
$sql=$empire->query("select * from {$dbtbpre}ecms_news"); //获取所有文章标题
while($r=$empire->fetch($sql))
{ $id=$r[id]; $arr_title= $r['title']; //获取文章id和标题,id是为了下面查询使用
similar_text($arr_title,$title,$percent); //主代码,将所有标题和现有标题进行相似度对比
$percent_arr[$id]=$percent; //对比度组成数组,数组采用ID做序
//print_r($percent_arr);
}
arsort($percent_arr); //按照相似的百分由高到低排序
reset($percent_arr); //将指针移到数组的第一单元
foreach($percent_arr as $key => $value){
if($value>=40){$keyarr[]=$key;}else{"";} //相似度40以上的加入数组
}
$newsid = implode(",", $keyarr); //将数组用逗号分隔
//print_r($newsid);
$sql=$empire->query("select * from {$dbtbpre}ecms_news where id in ($newsid) order by find_in_set(id,'$newsid') limit 20"); //进行查询高于40对比度的标题并按查询id排序
while($bqr=$empire->fetch($sql))
{ ?>
<li><a href="<?=$bqr['titleurl']?>" target="_self" title="<?=$bqr['title']?>" <?php if($navinfor[id]==$bqr['id']){echo 'rel="nofollow"';} ?>><?=$bqr['title']?></a></li> //这里有个判断是如果标题id和当前页面id相同加nofollow
<? }?>
上面代码适合帝国CMS系统,当然你用在其他的系统中可以自行少加修改一下,转载请加来源