PHP中计算字符串相似度的函数代码

php默认有个函数similar_text()用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计)。不过这个函数感觉对中文计算很不准确比如:


echo similar_text("吉林禽业公司火灾已致112人遇难","吉林宝源丰禽业公司火灾已致112人遇难");


这两个新闻标题其实都是一样的,如果使用similar_text()相似对结果为:42,即只相似42%,所以这个感觉很不靠谱,今天刚好收集到一段PHP代码也是用于比较两个字符串的相似度,直接贴出代码:


<?php
class LCS {
var $str1 ;
var $str2 ;
var $c = array ();
/*返回串一和串二的最长公共子序列
*/
function getLCS( $str1 , $str2 , $len1 = 0, $len2 = 0) {
$this ->str1 = $str1 ;
$this ->str2 = $str2 ;
if ( $len1 == 0) $len1 = strlen ( $str1 );
if ( $len2 == 0) $len2 = strlen ( $str2 );
$this ->initC( $len1 , $len2 );
return $this ->printLCS( $this ->c, $len1 - 1, $len2 - 1);
}
/*返回两个串的相似度
*/
function getSimilar( $str1 , $str2 ) {
$len1 = strlen ( $str1 );
$len2 = strlen ( $str2 );
$len = strlen ( $this ->getLCS( $str1 , $str2 , $len1 , $len2 ));
return $len * 2 / ( $len1 + $len2 );
}
function initC( $len1 , $len2 ) {
for ( $i = 0; $i < $len1 ; $i ++) $this ->c[ $i ][0] = 0;
for ( $j = 0; $j < $len2 ; $j ++) $this ->c[0][ $j ] = 0;
for ( $i = 1; $i < $len1 ; $i ++) {
for ( $j = 1; $j < $len2 ; $j ++) {
if ( $this ->str1[ $i ] == $this ->str2[ $j ]) {
$this ->c[ $i ][ $j ] = $this ->c[ $i - 1][ $j - 1] + 1;
} else if ( $this ->c[ $i - 1][ $j ] >= $this ->c[ $i ][ $j - 1]) {
$this ->c[ $i ][ $j ] = $this ->c[ $i - 1][ $j ];
} else {
$this ->c[ $i ][ $j ] = $this ->c[ $i ][ $j - 1];
}
}
}
}
function printLCS( $c , $i , $j ) {
if ( $i == 0 || $j == 0) {
if ( $this ->str1[ $i ] == $this ->str2[ $j ]) return $this ->str2[ $j ];
else return "" ;
}
if ( $this ->str1[ $i ] == $this ->str2[ $j ]) {
return $this ->printLCS( $this ->c, $i - 1, $j - 1). $this ->str2[ $j ];
} else if ( $this ->c[ $i - 1][ $j ] >= $this ->c[ $i ][ $j - 1]) {
return $this ->printLCS( $this ->c, $i - 1, $j );
} else {
return $this ->printLCS( $this ->c, $i , $j - 1);
}
}
}
$lcs = new LCS();
//返回最长公共子序列
$lcs ->getLCS( "hello word" , "hello china" );
//返回相似度
echo $lcs ->getSimilar( "吉林禽业公司火灾已致112人遇难" , "吉林宝源丰禽业公司火灾已致112人遇难" );

同样输出结果为:0.90322580645161,明显准确的多。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值