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

<?php
#中文短句子相似度比较
#参考文献 http://www.doc88.com/p-2055556399236.html
header("Content-type: text/html; charset=utf-8"); 
class ShortTextCompare{
	#计算匹配文字$arr1[$i]的最小匹配偏移值
	public static 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 static 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 static 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 static function S($arr1, $arr2){
		$temp1 = self::SC($arr1, $arr2);
		$temp2 = self::SC($arr2, $arr1);
		return ($temp1 + $temp2)/2;
	}
	
	#将字符串转换成数组存储
	public static function CharToArr($str){
		 return preg_split('/(?<!^)(?!$)/u', $str );
	}
}
// $str1 = '大学化学实验';
// $str2 = '大学物理实验';
// $str1 = '大学生思想品德修养';
// $str2 = '毛泽东思想概论';
$str1 = '计算机专业英语';
$str2 = '大学英语';
// $str1 = '国中567';
// $str2 = '中国1';
$str_arr1 = ShortTextCompare::CharToArr($str1);
$str_arr2 = ShortTextCompare::CharToArr($str2);
$num = ShortTextCompare::S($str_arr1, $str_arr2);
print $num;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

扬子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值