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 相关文章推荐
Zend framework处理一个http请求的流程分析
Feb 08 PHP
PHP 函数学习简单小结
Jul 08 PHP
PHP5函数小全(分享)
Jun 06 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
Jun 18 PHP
PHP中imagick函数的中文解释
Jan 21 PHP
php绘制一个矩形的方法
Jan 24 PHP
PHP中常用的数组操作方法笔记整理
May 16 PHP
基于ThinkPHP实现的日历功能实例详解
Apr 15 PHP
PHP针对伪静态的注入总结【附asp与Python相关代码】
Aug 01 PHP
总结PHP代码规范、流程规范、git规范
Jun 18 PHP
PHP内置函数生成随机数实例
Jan 18 PHP
php加速缓存器opcache,apc,xcache,eAccelerator原理与配置方法实例分析
Mar 02 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中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
php对大文件进行读取操作的实现代码
2013/01/23 PHP
面向对象的Javascript之三(封装和信息隐藏)
2012/01/27 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
TypeScript具有的几个不同特质
2015/04/07 Javascript
CSS图片响应式 垂直水平居中
2015/08/14 Javascript
jquery+CSS3实现3D拖拽相册效果
2016/07/18 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
Vue响应式添加、修改数组和对象的值
2017/03/20 Javascript
vue v-model表单控件绑定详解
2017/05/17 Javascript
使用vue和datatables进行表格的服务器端分页实例代码
2017/06/07 Javascript
Angular6封装http请求的步骤详解
2018/08/13 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
vue中 this.$set的用法详解
2019/09/06 Javascript
vue实现淘宝购物车功能
2020/04/20 Javascript
Openlayers显示瓦片网格信息的方法
2020/09/28 Javascript
TensorFLow用Saver保存和恢复变量
2018/03/10 Python
Python读取excel中的图片完美解决方法
2018/07/27 Python
对python条件表达式的四种实现方法小结
2019/01/30 Python
Windows10+anacond+GPU+pytorch安装详细过程
2020/03/24 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
CSS3旋转——彩色扇子兼容firefox浏览器
2013/06/04 HTML / CSS
CSS3 Notes: -webkit-box-reflect实现倒影的实例
2016/12/08 HTML / CSS
Ibatis中如何提高SQL Map的性能
2013/05/11 面试题
南京某软件公司的.net面试题
2015/11/30 面试题
优质服务演讲稿
2014/05/14 职场文书
"9.18"国耻日演讲稿范文
2014/09/14 职场文书
团员个人总结
2015/02/26 职场文书
党校毕业个人总结
2015/02/28 职场文书
酒店人事主管岗位职责
2015/04/11 职场文书
社区党建工作总结2015
2015/05/13 职场文书
婚礼伴郎致辞
2015/07/28 职场文书
编写python程序的90条建议
2021/04/14 Python
手把手教你从零开始react+antd搭建项目
2021/06/03 Javascript
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技
VUE解决跨域问题Access to XMLHttpRequest at
2022/05/06 Vue.js