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实现用户认证及管理完全源码
Mar 11 PHP
PHP 数组教程 定义数组
Oct 23 PHP
解析PHP中如何将数组变量写入文件
Jun 06 PHP
Laravel 5 框架入门(二)构建 Pages 的管理功能
Apr 09 PHP
php远程下载类分享
Apr 13 PHP
各种快递查询--Api接口
Apr 26 PHP
PHP Mysqli 常用代码集合
Nov 12 PHP
php cli模式下获取参数的方法
May 05 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
Sep 15 PHP
PHP xpath()函数讲解
Feb 11 PHP
php扩展开发入门demo示例
Sep 23 PHP
PHP操作Redis常用命令的实例详解
Dec 23 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 结果集的分页实现代码
2009/03/10 PHP
PHP基于ICU扩展intl快速实现汉字转拼音及按拼音首字母分组排序的方法
2017/05/03 PHP
深入理解PHP的远程多会话调试
2017/09/21 PHP
Centos7安装swoole扩展操作示例
2020/03/26 PHP
代码生成器 document.write()
2007/04/15 Javascript
javascript 写类方式之三
2009/07/05 Javascript
js实现运动logo图片效果及运动元素对象sportBox使用方法
2012/12/25 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
一张表格告诉你windows.onload()与$(document).ready()的区别
2014/05/16 Javascript
javascript中实现兼容JAVA的hashCode算法代码分享
2020/08/11 Javascript
分享两段简单的JS代码防止SQL注入
2016/04/12 Javascript
动态加载css方法实现和深入解析
2017/01/18 Javascript
inner join 内联与left join 左联的实例代码
2017/09/18 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
Vue Cli3 创建项目的方法步骤
2018/10/15 Javascript
通过JavaScript下载文件到本地的方法(单文件)
2019/03/17 Javascript
layui自定义验证,用ajax查询后台是否有重复数据,form.verify的例子
2019/09/06 Javascript
Python3.2中的字符串函数学习总结
2015/04/23 Python
python爬虫_自动获取seebug的poc实例
2017/08/05 Python
python存储16bit和32bit图像的实例
2018/12/05 Python
Django之使用内置函数和celery发邮件的方法示例
2019/09/16 Python
python tkinter之 复选、文本、下拉的实现
2020/03/04 Python
CSS3 :default伪类选择器使用简介
2018/03/15 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
windeln官方海外旗舰店:德淘超人气母婴超市
2017/12/15 全球购物
中国汽车租赁行业头部企业:一嗨租车
2019/05/16 全球购物
财务人员个人自荐信范文
2013/09/26 职场文书
学校门卫管理制度
2014/01/30 职场文书
投资合作协议书
2014/04/17 职场文书
教师先进工作者事迹材料
2014/05/01 职场文书
英语教师自荐信
2014/05/26 职场文书
质量保证书怎么写
2015/02/27 职场文书
买卖合同纠纷代理词
2015/05/25 职场文书
团组织推荐意见
2015/06/05 职场文书
全民创业工作总结
2015/08/13 职场文书
Go语言带缓冲的通道实现
2021/04/26 Golang