中文短句子相似度比较(PHP版本UTF8)

[php]  view plain  copy
  1. <?php  
  2. #中文短句子相似度比较  
  3. #参考文献 http://www.doc88.com/p-2055556399236.html  
  4. header("Content-type: text/html; charset=utf-8");   
  5. class ShortTextCompare{  
  6.     #计算匹配文字$arr1[$i]的最小匹配偏移值  
  7.     public static function PosOffset($arr1$i$arr2){  
  8.         $len2 = count($arr2);  
  9.         $arr2_reverse = array_reverse($arr2);  
  10.         for($j = 0; $j < $len2$j++){  
  11.             $rev_num = abs($i-$j)-1;  
  12.             $rev_data = isset($arr2_reverse[$rev_num]) ? $arr2_reverse[$rev_num] : '';  
  13.             $notrev_data = isset($arr2[$i-$j]) ? $arr2[$i-$j] : '';  
  14.             if($i+$j >= 0 && $arr1[$i] == ($i-$j >=0 ? $notrev_data : $rev_data)){  
  15.                 return $j;  
  16.             }  
  17.             if($i+$j < $len2 && $arr1[$i] == $arr2[$i+$j]){  
  18.                 return $j;  
  19.             }  
  20.         }  
  21.         return $len2;  
  22.     }  
  23.       
  24.     #计算匹配文字$arr1[$i]对于整体相似度的贡献量  
  25.     public static function CC($arr1$i$arr2){  
  26.         $len2 = count($arr2);  
  27.         $len2_float = sprintf("%.2f"$len2);  
  28.         $temp = self::PosOffset($arr1$i$arr2);  
  29.         $data = ($len2 - $temp) / $len2_float;  
  30.         return $data;  
  31.     }  
  32.       
  33.     #计算短语$arr1相对于短语$arr2的相似度sc  
  34.     public static function SC($arr1$arr2){  
  35.         $sc = 0.0;  
  36.         $len1 = count($arr1);  
  37.         for($i = 0; $i < $len1$i++){  
  38.             $sc += self::CC($arr1$i$arr2);  
  39.         }  
  40.         $sc /= $len1;  
  41.         return $sc;  
  42.     }  
  43.       
  44.     #计算短语$arr1与短语$arr2之间的相似度  
  45.     public static function S($arr1$arr2){  
  46.         $temp1 = self::SC($arr1$arr2);  
  47.         $temp2 = self::SC($arr2$arr1);  
  48.         return ($temp1 + $temp2)/2;  
  49.     }  
  50.       
  51.     #将字符串转换成数组存储  
  52.     public static function CharToArr($str){  
  53.          return preg_split('/(?<!^)(?!$)/u'$str );  
  54.     }  
  55. }  
  56. // $str1 = '大学化学实验';  
  57. // $str2 = '大学物理实验';  
  58. // $str1 = '大学生思想品德修养';  
  59. // $str2 = '毛泽东思想概论';  
  60. $str1 = '计算机专业英语';  
  61. $str2 = '大学英语';  
  62. // $str1 = '国中567';  
  63. // $str2 = '中国1';  
  64. $str_arr1 = ShortTextCompare::CharToArr($str1);  
  65. $str_arr2 = ShortTextCompare::CharToArr($str2);  
  66. $num = ShortTextCompare::S($str_arr1$str_arr2);  
  67. print $num;  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值