Heim >php教程 >php手册 >PHP改进计算字符串相似度的函数similar_text()、levenshtein()

PHP改进计算字符串相似度的函数similar_text()、levenshtein()

WBOY
WBOYOriginal
2016-06-06 20:18:482843Durchsuche

PHP 原生的similar_text()函数、levenshtein()函数对中文汉字支持不好,我自己写了一个,测试使用正常,推荐给大家,如果有什么问题,请留言

similar_text()中文汉字版

复制代码 代码如下:


          //拆分字符串 
     function split_str($str) { 
       preg_match_all("/./u", $str, $arr); 
       return $arr[0]; 
     } 
      
     //相似度检测 
     function similar_text_cn($str1, $str2) { 
       $arr_1 = array_unique(split_str($str1)); 
       $arr_2 = array_unique(split_str($str2)); 
       $similarity = count($arr_2) - count(array_diff($arr_2, $arr_1)); 
        
       return $similarity; 
     }  

levenshtein()中文汉字版
 

复制代码 代码如下:


          //拆分字符串 
     function mbStringToArray($string, $encoding = 'UTF-8') { 
         $arrayResult = array(); 
         while ($iLen = mb_strlen($string, $encoding)) { 
             array_push($arrayResult, mb_substr($string, 0, 1, $encoding)); 
             $string = mb_substr($string, 1, $iLen, $encoding); 
         } 
         return $arrayResult; 
     } 
     //编辑距离 
     function levenshtein_cn($str1, $str2, $costReplace = 1, $encoding = 'UTF-8') { 
         $count_same_letter = 0; 
         $d = array(); 
         $mb_len1 = mb_strlen($str1, $encoding); 
         $mb_len2 = mb_strlen($str2, $encoding); 
         $mb_str1 = mbStringToArray($str1, $encoding); 
         $mb_str2 = mbStringToArray($str2, $encoding); 
         for ($i1 = 0; $i1              $d[$i1] = array(); 
             $d[$i1][0] = $i1; 
         } 
         for ($i2 = 0; $i2              $d[0][$i2] = $i2; 
         } 
         for ($i1 = 1; $i1              for ($i2 = 1; $i2                  // $cost = ($str1[$i1 - 1] == $str2[$i2 - 1]) ? 0 : 1; 
                 if ($mb_str1[$i1 - 1] === $mb_str2[$i2 - 1]) { 
                     $cost = 0; 
                     $count_same_letter++; 
                 } else { 
                     $cost = $costReplace; //替换 
                 } 
                 $d[$i1][$i2] = min($d[$i1 - 1][$i2] + 1, //插入 
                 $d[$i1][$i2 - 1] + 1, //删除 
                 $d[$i1 - 1][$i2 - 1] + $cost); 
             } 
         } 
         return $d[$mb_len1][$mb_len2]; 
         //return array('distance' => $d[$mb_len1][$mb_len2], 'count_same_letter' => $count_same_letter); 
     }  


 
最长公共子序列LCS()
 

复制代码 代码如下:

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