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

来源:互联网 发布:tomcat gzip js css 编辑:程序博客网 时间:2024/06/05 00:20

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


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


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


<?php
class LCS {
var$str1;
var$str2;
var$c = array();
/*返回串一和串二的最长公共子序列
*/
functiongetLCS($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);
}
/*返回两个串的相似度
*/
functiongetSimilar($str1,$str2) {
$len1= strlen($str1);
$len2= strlen($str2);
$len= strlen($this->getLCS($str1,$str2, $len1,$len2));
return$len * 2 / ($len1+ $len2);
}
functioninitC($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];
}
}
}
}
functionprintLCS($c,$i, $j) {
if($i == 0 || $j == 0) {
if($this->str1[$i] ==$this->str2[$j])return $this->str2[$j];
elsereturn "";
}
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,明显准确的多。


 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年染了7次头发怎么办 低头久了颈椎疼怎么办 一只眼睛磨得慌怎么办 没有睡好眼睛痛怎么办 好几天没休息好怎么办 血糖高睡不好觉怎么办 眼睛感觉磨的慌怎么办 痔疮手术后大便疼肛裂痛怎么办 肛裂排便困难痛怎么办 智齿导致的牙疼怎么办 肛裂一直不愈合怎么办 孕妇肛裂拉屎疼怎么办 产后50天小肚子突出怎么办 肚子像怀孕一样大怎么办 蹲厕所拉不出来怎么办 生气导致回奶了怎么办 老公每晚要吃奶才睡觉怎么办 分分钟想把老公杀掉怎么办 老公出轨闹的厉害离家出走怎么办? 儿子故意杀人一审判死刑怎么办 被家暴时妻子杀了丈夫该怎么办 丈夫挣钱不给妻子怎么办 白色皮鞋染了色怎么办 刺扎到手里拿不出来怎么办 军官证解锁片丢了怎么办 六安市人民医院药品停用了怎么办 信无法寄到该怎么办 5个月的宝宝光有屎沫怎么办 胸牌的别针坏了怎么办 工资表税金扣多了怎么办? 装修公司不发放工程怎么办 公司不给开收入证明怎么办 装修公司不付工人工资怎么办 收入证明少500元怎么办 dnf二级输错了怎么办 如果受到法律的伤害怎么办 86岁了还怕死怎么办 风衣的腰带丢了怎么办 成为伪娘身上的毛怎么办 军官升不上去了怎么办 王者荣耀代练封号怎么办