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 高级课程笔记 面向对象
Jun 21 PHP
PHP 透明水印生成代码
Aug 27 PHP
php对图像的各种处理函数代码小结
Jul 08 PHP
教你如何用php实现LOL数据远程获取
Jun 10 PHP
php判断两个浮点数是否相等的方法
Mar 14 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP二维数组排序简单实现方法
Feb 14 PHP
PHP将二维数组某一个字段相同的数组合并起来的方法
Feb 26 PHP
php反射类ReflectionClass用法分析
May 12 PHP
PHP模拟http请求的方法详解
Nov 09 PHP
thinkPHP框架中执行事务的方法示例
May 31 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
Jun 12 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
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP5下$_SERVER变量不再受magic_quotes_gpc保护的弥补方法
2012/10/31 PHP
PHP使用Redis实现防止大并发下二次写入的方法
2017/10/09 PHP
JavaScript 联动的无限级封装类,数据采用非Ajax方式,随意添加联动
2010/06/29 Javascript
JS重要知识点小结
2011/11/06 Javascript
JS中的public和private对象,即static修饰符
2012/01/18 Javascript
自己实现ajax封装示例分享
2014/04/01 Javascript
用jquery.sortElements实现table排序
2014/05/04 Javascript
jQuery知识点整理
2015/01/30 Javascript
深入理解JavaScript中的箭头函数
2015/07/28 Javascript
js表单提交和submit提交的区别实例分析
2015/12/10 Javascript
第七章之菜单按钮图标组件
2016/04/25 Javascript
纯js和css完成贪吃蛇小游戏demo
2016/09/01 Javascript
JS根据生日月份和日期计算星座的简单实现方法
2016/11/24 Javascript
ionic中的$ionicPlatform.ready事件中的通用设置
2017/06/11 Javascript
你有必要知道的10个JavaScript难点
2017/07/25 Javascript
js中自定义react数据验证组件实例详解
2018/10/19 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
使用vue引入maptalks地图及聚合效果的实现
2020/08/10 Javascript
[00:50]深扒TI7聊天轮盘语音出处6
2017/05/11 DOTA
python sqlobject(mysql)中文乱码解决方法
2008/11/14 Python
简单的Python抓taobao图片爬虫
2014/10/26 Python
python脚本设置超时机制系统时间的方法
2016/02/21 Python
利用python实现命令行有道词典的方法示例
2017/01/31 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
2019/05/27 Python
Python中模块(Module)和包(Package)的区别详解
2019/08/07 Python
用python3 urllib破解有道翻译反爬虫机制详解
2019/08/14 Python
python re模块匹配贪婪和非贪婪模式详解
2020/02/11 Python
python操作docx写入内容,并控制文本的字体颜色
2020/02/13 Python
Python 日期与时间转换的方法
2020/08/01 Python
医药代表个人的求职信分享
2013/12/08 职场文书
优秀大学生的自我评价
2014/01/16 职场文书
公司离职证明范本(5篇)
2014/09/17 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
紧急通知
2015/04/17 职场文书
美丽的大脚观后感
2015/06/03 职场文书