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如何得到当前页和上一页的地址?
Nov 27 PHP
php生成缩略图的类代码
Oct 02 PHP
PHP实现多进程并行操作的详解(可做守护进程)
Jun 18 PHP
ThinkPHP中ajax使用实例教程
Aug 22 PHP
Nginx下配置codeigniter框架方法
Apr 07 PHP
PHP伪造来源HTTP_REFERER的方法实例详解
Jul 06 PHP
php生成动态验证码gif图片
Oct 19 PHP
PHP 读取文本文件内容并分页显示
Jan 02 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
Jan 11 PHP
thinkphp3.x中cookie方法的用法分析
May 19 PHP
php简单实现单态设计模式的方法分析
Jul 28 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 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
《神奇女侠:血脉》神力女超人大战犯罪公司
2020/04/09 欧美动漫
php for 循环语句使用方法详细说明
2010/05/09 PHP
php eval函数用法 PHP中eval()函数小技巧
2012/10/31 PHP
PHP中通过HTTP_USER_AGENT判断是否为手机移动终端的函数代码
2013/02/14 PHP
基于php验证码函数的使用示例
2013/05/03 PHP
PHP版本的选择5.2.17 5.3.27 5.3.28 5.4 5.5兼容性问题分析
2016/04/04 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
javascript学习笔记(十三) js闭包介绍(转)
2012/06/20 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
浅谈轻量级js模板引擎simplite
2015/02/13 Javascript
jQuery+ajax实现无刷新级联菜单示例
2015/05/21 Javascript
JavaScript面向对象编写购物车功能
2016/08/19 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
基于nodejs实现微信支付功能
2017/12/20 NodeJs
微信小程序实现省市区三级地址选择
2020/06/21 Javascript
layUI实现列表查询功能
2019/07/27 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
JS手写一个自定义Promise操作示例
2020/03/16 Javascript
JS实现时间校验的代码
2020/05/25 Javascript
vue-cli3中配置alias和打包加hash值操作
2020/09/04 Javascript
Node 使用express-http-proxy 做api网关的实现
2020/10/15 Javascript
vue mvvm数据响应实现
2020/11/11 Javascript
[34:56]Ti4冒泡赛LGD vs Liquid 1
2014/07/14 DOTA
[48:05]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VGJ.T vs VP
2018/03/31 DOTA
Python笔记(叁)继续学习
2012/10/24 Python
Python绑定方法与非绑定方法详解
2017/08/18 Python
解决python3中cv2读取中文路径的问题
2018/12/05 Python
150行Python代码实现带界面的数独游戏
2020/04/04 Python
深入理解HTML的FormData对象
2016/05/17 HTML / CSS
英国安全产品购物网站:The Safe Shop
2017/03/20 全球购物
印尼旅游网站:via
2017/11/12 全球购物
医院护士的求职信
2014/01/03 职场文书
迟到检讨书
2015/01/26 职场文书
信用卡工资证明范本
2015/06/19 职场文书
vue基于Teleport实现Modal组件
2021/05/31 Vue.js
spring cloud eureka 服务启动失败的原因分析及解决方法
2022/03/17 Java/Android