thinkphp tp php 检测中文文字相似度
public function cs(){ // $str1 = '大学化学实验'; // $str2 = '大学物理实验'; $str1 = '大学生思想品德修养'; $str2 = '思想概论'; // $str1 = '国中567'; // $str2 = '中国1'; $str_arr1 = $this->CharToArr($str1); $str_arr2 = $this->CharToArr($str2); $num = $this->S($str_arr1, $str_arr2); dump($num);die(); } //计算匹配文字$arr1[$i]的最小匹配偏移值 public function PosOffset($arr1, $i, $arr2){ $len2 = count($arr2); $arr2_reverse = array_reverse($arr2); for($j = 0; $j < $len2; $j++){ $rev_num = abs($i-$j)-1; $rev_data = isset($arr2_reverse[$rev_num]) ? $arr2_reverse[$rev_num] : ''; $notrev_data = isset($arr2[$i-$j]) ? $arr2[$i-$j] : ''; if($i+$j >= 0 && $arr1[$i] == ($i-$j >=0 ? $notrev_data : $rev_data)){ return $j; } if($i+$j < $len2 && $arr1[$i] == $arr2[$i+$j]){ return $j; } } return $len2; } //计算匹配文字$arr1[$i]对于整体相似度的贡献量 public function CC($arr1, $i, $arr2){ $len2 = count($arr2); $len2_float = sprintf("%.2f", $len2); $temp = self::PosOffset($arr1, $i, $arr2); $data = ($len2 - $temp) / $len2_float; return $data; } //计算短语$arr1相对于短语$arr2的相似度sc public function SC($arr1, $arr2){ $sc = 0.0; $len1 = count($arr1); for($i = 0; $i < $len1; $i++){ $sc += self::CC($arr1, $i, $arr2); } $sc /= $len1; return $sc; } //计算短语$arr1与短语$arr2之间的相似度 public function S($arr1, $arr2){ $temp1 = self::SC($arr1, $arr2); $temp2 = self::SC($arr2, $arr1); return ($temp1 + $temp2)/2; } //将字符串转换成数组存储 public function CharToArr($str){ return preg_split('/(?<!^)(?!$)/u', $str ); }