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 5.0对象模型深度探索之绑定
Sep 05 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
thinkphp实现上一篇与下一篇的方法
Dec 08 PHP
PHP上传文件时自动分配路径的方法
Jan 09 PHP
PHP利用APC模块实现文件上传进度条的方法
Jan 26 PHP
php定义一个参数带有默认值的函数实例分析
Mar 16 PHP
php中smarty模板条件判断用法实例
Jun 11 PHP
PHP生成树的方法
Jul 28 PHP
windows下apache搭建php开发环境
Aug 27 PHP
php实现Session存储到Redis
Nov 11 PHP
php导出生成word的方法
Dec 25 PHP
Ubuntu server 11.04安装memcache及php使用memcache来存储session的方法
May 31 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+.htaccess实现全站静态HTML文件GZIP压缩传输(一)
2007/02/15 PHP
关于php程序报date()警告的处理(date_default_timezone_set)
2013/10/22 PHP
php定时执行任务设置详解
2015/02/06 PHP
php简单实现数组分页的方法
2016/04/30 PHP
php微信公众平台交互与接口详解
2016/11/28 PHP
PHP生成指定范围内的N个不重复的随机数
2019/03/18 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
jQuery(js)获取文字宽度(显示长度)示例代码
2013/12/31 Javascript
JavaScript编程的10个实用小技巧
2014/04/18 Javascript
详解js中class的多种函数封装方法
2016/01/03 Javascript
js 实现一些跨浏览器的事件方法详解及实例
2016/10/27 Javascript
d3.js实现立体柱图的方法详解
2017/04/28 Javascript
基于DOM节点删除之empty和remove的区别(详解)
2017/09/11 Javascript
基于vue 添加axios组件,解决post传参数为null的问题
2018/03/05 Javascript
JS实现图片懒加载(lazyload)过程详解
2020/04/02 Javascript
JavaScript JSON使用原理及注意事项
2020/07/30 Javascript
Python编写电话薄实现增删改查功能
2016/05/07 Python
Python爬虫:通过关键字爬取百度图片
2017/02/17 Python
Python求一批字符串的最长公共前缀算法示例
2019/03/02 Python
详解Python基础random模块随机数的生成
2019/03/23 Python
python 哈希表实现简单python字典代码实例
2019/09/27 Python
python 创建一维的0向量实例
2019/12/02 Python
python tkinter之顶层菜单、弹出菜单实例
2020/03/04 Python
keras中的History对象用法
2020/06/19 Python
Python趣味入门教程之循环语句while
2020/08/26 Python
美国受欢迎的眼影品牌:BH Cosmetics
2016/10/25 全球购物
捷克玩具商店:Bambule
2019/02/23 全球购物
什么是封装
2013/03/26 面试题
师范应届生教师求职信
2013/11/05 职场文书
4s店总经理岗位职责
2013/12/31 职场文书
俞敏洪励志演讲稿
2014/04/29 职场文书
初三新学期计划书
2014/05/03 职场文书
秋季校运会广播稿100字
2014/09/18 职场文书
交通事故协议书范文
2014/10/23 职场文书
工作违纪的检讨书范文
2019/07/09 职场文书
Java版 单机五子棋
2022/05/04 Java/Android