发布时间:2021-08-31 10:01:21 阅读次数:197
在php中,默认有个函数similar_text()可以用于计算字符串之间的相似度,该函数也可以计算两个字符串的相似度(以百分比计)。
不过这个函数感觉对中文计算很不准确比如:
1 | echo similar_text( "吉林禽业公司火灾已致112人遇难" , "吉林宝源丰禽业公司火灾已致112人遇难" ); |
这两个新闻标题其实都是一样的,如果使用similar_text()相似对结果为:42,即只相似42%,所以这个感觉很不靠谱,今天刚好收集到一段PHP代码也是用于比较两个字符串的相似度,直接贴出代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | <?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人遇难" ); |