PHP简单实现“相关文章推荐”功能的方法


Posted in PHP onJuly 19, 2014

通常在做内容网站的时候,需要在每一篇文章中出现与该文章相关的文章列表。对于大多数人来说,使用的方法通常是:建立一个关键词列表,判断每篇文章包含有那些关键词,最后根据关键词找出与某篇文章最相关的文章。对于内容比较复杂的网站,确定关键列表词显然会比较麻烦。

本文介绍了与以往方法不同的similar_text(php4,php5)函数来方便的达到我们的预期要求。具体的思路是:从文章列表中取出所有的文章标题,将所有的文章标题都同当前标题对比,将对比结果生成一个数组,按照相似度的大小由大到标题,利用similar_text将这些文章标题同原文章标题做对比,按标题的相似程度重新排列标题,就得到了与原文章相似的文章列表

这个思路用到的关键函数是:

int similar_text ( string $first, string $second[, float $percent] )

它返回的是两个字根串的相同字节数。

按照这个思路,我们建立如下的函数,这个函数的功能是把$arr_title数组按照同$title相似的的顺序重新排列数组。

<?php 
$demo_title= "简明现代魔法"; 
$demo_arr_title= array("简单易懂的现代魔法","简单明了的现代魔法","简明扼要的古代魔法","不简单的现代魔法","很难懂的现代魔法"); 
$new_array= getSimilar($demo_title,$demo_arr_title); 
//print_r($new_array); 
echo"与[$demo_title]最相关的前三个文章是:<br/>"; 
for($j=0; $j<=2; $j++) 
{ 
echo($j+1).":".$new_array[$j]."<br/>"; 
} 
//$title当前标题,$arrayTitle为需要查找的数组 
functiongetSimilar($title,$arr_title) 
{ 
$arr_len= count($arr_title); 
for($i=0; $i<=($arr_len-1); $i++) 
{ 
//取得两个字符串相似的字节数 
$arr_similar[$i] = similar_text($arr_title[$i],$title); 
} 
arsort($arr_similar); //按照相似的字节数由高到低排序 
reset($arr_similar); //将指针移到数组的第一单元 
$index= 0; 
foreach($arr_similaras$old_index=>$similar) 
{ 
$new_title_array[$index] = $arr_title[$old_index]; 
$index++; 
} 
return$new_title_array; 
} 
?>

程序运行结果:

与[简明现代魔法]最相关的前三个文章是: 
1:简单明了的现代魔法 
2:简单易懂的现代魔法 
3:简明扼要的古代魔法

有些需要注意的地方

关于similar_text速度,有人做过这个一个测试,结果是:

The speed issues for similar_text seem to be only an issue for long sections of text (>20000 chars).

I found a huge performance improvement in my application by just testing if the string to be tested was less than 20000 chars before calling similar_text.

20000+ took 3-5 secs to process, anything else (10000 and below) took a fraction of a second. Fortunately for me, there was only a handful of instances with >20000 chars which I couldn't get a comparison % for.

如果要直接使用正文作对比速度可能会比较慢。

据说这个函数用于英文的效果不太好(感兴趣的读者可以自行尝试)。用于英文时可以将英文句子用空格分开成多个单词后再写一个类似于similar_text的函数。

另外,如果句子中含有比较多“的”、“了”等非关键词字符时,得到的结果可能会不太理想。

PHP 相关文章推荐
php将数据库导出成excel的方法
May 07 PHP
php GUID生成函数和类
Mar 10 PHP
php中函数前加&amp;符号的作用分解
Jul 08 PHP
PHP 读取和编写 XML
Nov 19 PHP
php获取指定范围内最接近数的方法
Jun 02 PHP
使用PHP实现下载CSS文件中的图片
Dec 06 PHP
遍历指定目录,并存储目录内所有文件属性信息的php代码
Oct 28 PHP
highchart数据源纵轴json内的值必须是int(详解)
Feb 20 PHP
ajax+php实现无刷新验证手机号的实例
Dec 22 PHP
PDO::prepare讲解
Jan 29 PHP
详解PHP变量传值赋值和引用赋值变量销毁
Mar 23 PHP
Yii框架Session与Cookie使用方法示例
Oct 14 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
Jul 18 #PHP
CodeIgniter中使用cookie的三种方式详解
Jul 18 #PHP
CodeIgniter采用config控制的多语言实现根据浏览器语言自动转换功能
Jul 18 #PHP
简单实用的网站PHP缓存类实例
Jul 18 #PHP
ThinkPHP表单自动提交验证实例教程
Jul 18 #PHP
ThinkPHP采用实现三级循环代码实例
Jul 18 #PHP
ThinkPHP字符串函数及常用函数汇总
Jul 18 #PHP
You might like
改进的IP计数器
2006/10/09 PHP
CentOS 6.2使用yum安装LAMP以及phpMyadmin详解
2013/06/17 PHP
php通过session防url攻击方法
2014/12/10 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
Javascript 的addEventListener()及attachEvent()区别分析
2009/05/21 Javascript
jQuery随机切换图片的小例子
2013/04/18 Javascript
js截取中英文字符串、标点符号无乱码示例解读
2014/04/17 Javascript
获取中文字符串的实际长度代码
2014/06/05 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
js强制把网址设为默认首页
2015/09/29 Javascript
jquery 获取select数组与name数组长度的实现代码
2016/06/20 Javascript
浅析Javascript ES6中的原生Promise
2016/08/25 Javascript
jQuery EasyUI编辑DataGrid用combobox实现多级联动
2016/08/29 Javascript
jquery实现图片上传前本地预览
2017/04/28 jQuery
在vue中使用vuex,修改state的值示例
2019/11/08 Javascript
Vue-cli 移动端布局和动画使用详解
2020/08/10 Javascript
[02:57]2014DOTA2国际邀请赛 选手辛苦解说更辛苦
2014/07/10 DOTA
[56:46]Liquid vs IG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python自动化工具日志查询分析脚本代码实现
2013/11/26 Python
python2.7读取文件夹下所有文件名称及内容的方法
2018/02/24 Python
python使用tornado实现简单爬虫
2018/07/28 Python
numpy:np.newaxis 实现将行向量转换成列向量
2019/11/30 Python
pandas实现DataFrame显示最大行列,不省略显示实例
2019/12/26 Python
意大利珠宝店:Luxury Zone
2019/01/05 全球购物
装潢设计专业推荐信模板
2013/11/26 职场文书
生物医学工程专业学生求职信范文分享
2013/12/14 职场文书
商铺租赁意向书
2014/04/01 职场文书
《金色的脚印》教后反思
2014/04/23 职场文书
员工考核评语大全
2014/04/26 职场文书
竞选大队干部演讲稿
2014/09/11 职场文书
祖国在我心中演讲稿(小学生)
2014/09/23 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
春节随笔
2015/08/15 职场文书
小学校园广播稿
2015/08/18 职场文书
Python音乐爬虫完美绕过反爬
2021/08/30 Python