Heim  >  Artikel  >  php教程  >  php文章相似度计算similar_text()函数升级

php文章相似度计算similar_text()函数升级

WBOY
WBOYOriginal
2016-05-25 16:44:061486Durchsuche

有时我们希望调用相关文章时肯定调用相似度高的我先是使用了php的similar_text()函数,但是测试两个相同的标题得出结果只有40%左右啊,下面看实例.

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,明显准确的多,还有一种办法就是利用分词系统我们把标题分词,然后再进行会更准确一些.

教程网址:

欢迎收藏∩_∩但请保留本文链接。

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn