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下用GD生成生成缩略图的两个选择和区别
Apr 17 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
PHP高自定义性安全验证码代码
Nov 27 PHP
PHPMYADMIN导入数据最大为2M的解决方法
Apr 23 PHP
PHP的PSR规范中文版
Sep 28 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
PHP实现简单的新闻发布系统实例
Jul 28 PHP
PHP自带方法验证邮箱是否存在
Feb 01 PHP
CI框架封装的常用图像处理方法(缩略图,水印,旋转,上传等)
Nov 22 PHP
php+ajax实现商品对比功能示例
Apr 13 PHP
关于Laravel-admin的基础用法总结和自定义model详解
Oct 08 PHP
PHP 枚举类型的管理与设计知识点总结
Feb 13 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与XML的PDF文档生成技术
2006/10/09 PHP
PHP制作图型计数器的例子
2006/10/09 PHP
使用PHP编写的SVN类
2013/07/18 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
PHP中使用Imagick读取pdf并生成png缩略图实例
2015/01/21 PHP
PHP JSON格式的中文显示问题解决方法
2015/04/09 PHP
PHP实现微信退款的方法示例
2019/03/26 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
推荐:极酷右键菜单
2006/11/29 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JSON无限折叠菜单编写实例
2013/12/16 Javascript
jQuery Validate 验证,校验规则写在控件中的具体实例
2014/02/27 Javascript
javascript实现对表格元素进行排序操作
2015/11/18 Javascript
jQuery实现页面点击后退弹出提示框的方法
2016/08/24 Javascript
常用的javascript设计模式
2017/01/11 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
vue-router 手势滑动触发返回功能
2018/09/30 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
Bootstrap实现省市区三级联动(亲测可用)
2019/07/26 Javascript
Layui弹框中数据表格中可双击选择一条数据的实现
2020/05/06 Javascript
element跨分页操作选择详解
2020/06/29 Javascript
Python 中 function(#) (X)格式 和 (#)在Python3.*中的注意事项
2018/11/30 Python
python 多线程爬取壁纸网站的示例
2021/02/20 Python
基于CSS3 animation动画属性实现轮播图效果
2017/09/12 HTML / CSS
美国乡村商店:Plow & Hearth
2016/09/12 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
广州喜创信息技术有限公司JAVA软件工程师笔试题
2012/10/17 面试题
甜品店的创业计划书范文
2014/01/02 职场文书
违纪检讨书2000字
2014/02/08 职场文书
初中班主任寄语
2014/04/04 职场文书
企业文化标语口号
2014/06/09 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
工作失职自我检讨书
2015/05/05 职场文书
飞屋环游记观后感
2015/06/08 职场文书
安全生产协议书
2016/03/22 职场文书