首 页   · 站长博客 · 用户注册 · 会员登陆  · 会员排行  ·最新主题  ·最近回复  精华区  版权声明  ·论坛管理
  当前登录身份:游客,请先登录。  笔名: 口令: 验证码:   
楼 主  index »  PHP与模板与代码加密/优化 » [原创]php怎么获得与文章标题相关的文章?  


  作者:hsight
  注册时间:2007-05-20
  主题/回复:1/0
  积分:405
  等级:★★☆(五级)
  称号:略有小成

  ysight@gmail.com..
  未提供
  www.

 

 发表:2007-05-20 07:57:22 阅读 3798 次 回复 1 次 得分1  |   字号 字色
[原创]php怎么获得与文章标题相关的文章?
php怎么获得与文章标题相关的文章?
前一段时间想做个php网站,要求在一篇文章后面附带与该文章相关的文章列表。
在网上搜索了一下,多数人使用的方法大概是:建立一个关键词列表,判断每篇文章包含有那些关键词,最后根据关键词找出与某篇文章最相关的文章。对于内容比较复杂的网站,确定关键列表词显然比较麻烦。
后来我查阅了一些php函数,感觉similar_text(php4,php5)函数能够十分方便的达到我的要求。这个思路是:从文章列表中取出所有的文章标题,将所有的文章标题都同当前标题对比,将对比结果生成一个数组,按照相似度的大小由大到标题,利用similar_text将这些文章标题同原文章标题做对比,按标题的相似程度重新排列标题,就得到了与原文章相似的文章列表。
这个思路用到的关键函数是:
int similar_text ( string $first, string $second [, float $percent] )
它返回的是两个字根串的相同字节数。
按照这个思路,我们建立如下的函数,这个函数的功能是把$arr_title数组按照同$title相似的的顺序重新排列数组。
<?php
//***************************************************************
//作者:ysight@gmail.com
//主页:http://freelyweb.googlepages.com/
//日期:2007-5-18
//转载本程序请保留该以上信息!
//***************************************************************
function getSimilar($title,$arr_title)//$title当前标题,$arrayTitle为需要查找的数组
{
$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_similar as $old_index=>$similar)
{
$new_title_array[$index]=$arr_title[$old_index];
$index++;
}
return $new_title_array;
}
?>
演示:我们建立一个5个数据的数组,并取出与目标标题最相关的前三个标题。
<?php
$demo_title="php如何获得与文章标题相关的文章";
$demo_arr_title=array("php学习教程","asp学习教程","php如何实现上传文件","php学习教程","asp和php那个更容易学习");
$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/>";
}
?>
以上的代码将获得如下的结果:
与[php如何获得与文章标题相关的文章]最相关的前三个文章是:
1:php如何实现上传文件
2:asp和php那个更容易学习
3:php学习教程

注意:1、关于similar_text速度,有人做过这个一个测试(http://cn.php.net/manual/zh/function.similar-text.php):
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. 
如果要直接使用正文作对比速度可能会比较慢。
2、这个函数用于英文的效果可能不太好(本人没有尝试过)。用与英文时可以将英文句子用空格分开成多个单词后再写一个类似于similar_text的函数。
3、句子中含有比较多“的”、“了”等非关键词字符时,得到的结果可能不太理想。

由于本人是php初学者程序有什么不足之处或者有更好的解决办法请多多指教。
 
 1#楼  
 
  回复人:一起PHP
  注册时间:2004-02-27
  主题/回复:247/1521
  积分:4649
  等级:★★★★★☆(十一级)
  称号:论坛圣人

   
 1#楼 发表于2007-05-28 17:00:17  评分:1 

赫赫,你虽然自称初学者,不过研究的问题已经很高深了~~~先佩服一个!

其实大多数人都是用的你前面说到的方法,建立一个关键字列表。其实我觉得这种方法还是很科学的。字符串相似度的比较有时候未必能反映出字符串含义的相似。如“中国经济过热”和“中国气温过热”相似度很高,不过完全不是一个领域的话题,也不能算相似。如果关键字法,可以用“中国 经济”。这样反而更好些。 用关键字可以表达含义的接近,用字符串匹配有时候未必很好。

如果不是特别专门的应用,我感觉关键字法已经不错。当然你研究的方法也很好,不过效率问题确实堪忧。字符串比较本来就是一件时间复杂度很高的事情,如果数据库中的信息数量极大,用这种比较法是很痛苦的。
  页数1/1首页 « 1 » 末页
  发表回复:您还没有登陆,无法发表回复。请先[登陆]

一起PHP技术联盟 主办:一起PHP 联系方式:站长QQ:4304410 QQ群:8423742 20159565 站长博客 E-mail: nqp@nqp.me 执行时间:0.01sec
SimsmaBBS 2008 (v6.0) Developed by 17php.com,Copyright(C)2003-2010 All rights reserved. 副本授权:一起PHP官方专用版