当前位置:首页> 编程笔记> PHP 开发
关键字
文章内容
php文本相似度计算
 
 
修改时间:[2012/06/27 09:41]    阅读次数:[5028]    发表者:[沩筱]
 

今天在验证用户所发表文章是否已经存在于数据库,

就想到了用PHP计算两字符串的相似度来处理,于是就在数据入库前进行了处理。

用到函数similar_text()

代码如下:

$ret = 0;
$r = $db->select("select content from article");
foreach ($r as $val){
    similar_text($message,$val[content], $ret);     
    if($ret>=50){
        echo "文章已经存在,请不要重复发表";
        break;
    }
}

加入上面代码后运行,发现总是超时。

于是在代码中打印重要语句的执行时间

时间大概是这样的:

查询数据库是0.4秒,比较一条相似度是0.1秒。

后来计算了一下,也就300条记录,PHP默认执行的30秒时间就不够了。

何况数据库存的文件不是300,可能是3000,3万条。

看来是不能添加这一功能了。

如果非要加上这一功能,也只能放在后台实现了。

在后台把PHP执行时间设长一点,就是用户发表的文章再慢慢去查询。

不过这样也不现实,随着数据越来越多,执行时间越来越长。

下面是该函数的详细信息:

similar_text
(PHP 4, PHP 5)
similar_text — 计算两个字符串的相似度
说明
int similar_text ( string $first , string $second [, float &$percent ] )
两个字符串的相似程度计算依据 Oliver [1993] 的描述进行。注意该实现没有使用 Oliver 虚拟码中的堆栈,但是却进行了递归调用,这个做法可能会导致整个过程变慢或变快。也请注意,该算法的复杂度是 O(N**3),N 是最长字符串的长度。

参数
first
第一个字符串。
second
第二个字符串。
percent
通过引用方式传递第三个参数, similar_text() 将计算相似程度百分数。
返回值
返回在两个字符串中匹配字符的数目。

最后介绍执行速度更快的函数levenshtein(),大家可以试试的。