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反弹shell实现代码
Apr 22 PHP
php 中文和编码判断代码
May 16 PHP
PHP中使用CURL伪造来路抓取页面或文件
May 04 PHP
$_GET['goods_id']+0 的使用详解
Jun 06 PHP
一致性哈希算法以及其PHP实现详细解析
Aug 24 PHP
php用正则表达式匹配中文实例详解
Nov 06 PHP
ThinkPHP学习笔记(一)ThinkPHP部署
Jun 22 PHP
laravel安装zend opcache加速器教程
Mar 02 PHP
PHP文件与目录操作示例
Dec 24 PHP
php 常用的系统函数
Feb 07 PHP
PHP实现的数组和XML文件相互转换功能示例
Mar 15 PHP
PHP验证类的封装与使用方法详解
Jan 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
PHP Curl多线程原理实例详解
2013/11/06 PHP
php程序内部post数据的方法
2015/03/31 PHP
php中strlen和mb_strlen用法实例分析
2016/11/12 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
php连接mysql数据库
2017/03/21 PHP
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
2018/04/20 PHP
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
由Javascript实现的页面日历
2011/11/04 Javascript
jQuery去掉字符串起始和结尾的空格(多种方法实现)
2013/04/01 Javascript
用函数模板,写一个简单高效的 JSON 查询器的方法介绍
2013/04/17 Javascript
javascript学习笔记(五)原型和原型链详解
2014/10/08 Javascript
用js判断是否为360浏览器的实现代码
2015/01/15 Javascript
js密码强度检测
2016/01/07 Javascript
Vue.Draggable实现拖拽效果
2020/07/29 Javascript
微信小程序模拟cookie的实现
2018/06/20 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
vue中的双向数据绑定原理与常见操作技巧详解
2020/03/16 Javascript
element-plus一个vue3.xUI框架(element-ui的3.x 版初体验)
2020/12/02 Vue.js
python正常时间和unix时间戳相互转换的方法
2015/04/23 Python
Python爬虫模拟登录带验证码网站
2016/01/22 Python
python相似模块用例
2016/03/04 Python
Django使用HttpResponse返回图片并显示的方法
2018/05/22 Python
Python基本数据结构之字典类型dict用法分析
2019/06/08 Python
基于python-opencv3的图像显示和保存操作
2019/06/27 Python
python中的垃圾回收(GC)机制
2020/09/21 Python
澳洲最大的时尚奢侈品电商平台:Cettire
2020/06/15 全球购物
给实习单位的感谢信
2014/02/01 职场文书
一年级数学教学反思
2014/02/01 职场文书
《美丽的彩虹》教学反思
2014/02/25 职场文书
社区党建工作汇报材料
2014/08/14 职场文书
解除劳动合同协议书范本
2014/09/13 职场文书
2014年党建工作总结
2014/11/11 职场文书
百万英镑观后感
2015/06/09 职场文书
高中物理教学反思
2016/02/19 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
你知道Java Spring的两种事务吗
2022/03/16 Java/Android