微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

similar_text()中文汉字版

代码如下:
PHP //拆分字符串 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()中文汉字版

代码如下:
PHP //拆分字符串 function mbStringToArray($string,$encoding = 'UTF-8') { $arrayResult = array(); while ($iLen = mb_strlen($string,$encoding)) { array_push($arrayResult,mb_substr($string,1,$encoding)); $string = mb_substr($string,$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 <= $mb_len1; $i1++) { $d[$i1] = array(); $d[$i1][0] = $i1; } for ($i2 = 0; $i2 <= $mb_len2; $i2++) { $d[0][$i2] = $i2; } for ($i1 = 1; $i1 <= $mb_len1; $i1++) { for ($i2 = 1; $i2 <= $mb_len2; $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()

<div class="codetitle"><a style="CURSOR: pointer" data="66185" class="copybut" id="copybut66185" onclick="doCopy('code66185')"> 代码如下:

<div class="codebody" id="code66185">
<?php
//最长公共子序列英文版
function LCS_en($str_1,$str_2) {
$len_1 = strlen($str_1);
$len_2 = strlen($str_2);
$len = $len_1 > $len_2 ? $len_1 : $len_2;
$dp = array();
for ($i = 0; $i <= $len; $i++) {
$dp[$i] = array();
$dp[$i][0] = 0;
$dp[0][$i] = 0;
}
for ($i = 1; $i <= $len_1; $i++) {
for ($j = 1; $j <= $len_2; $j++) {
if ($str_1[$i - 1] == $str_2[$j - 1]) {
$dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
} else {
$dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];
}
}
}
return $dp[$len_1][$len_2];
}
//拆分字符串
function mbStringToArray($string,$encoding);
}
return $arrayResult;
}
//最长公共子序列中文
function LCS_cn($str1,$encoding = 'UTF-8') {
$mb_len1 = mb_strlen($str1,$encoding);
$len = $mb_len1 > $mb_len2 ? $mb_len1 : $mb_len2;
$dp = array();
for ($i = 0; $i <= $len; $i++) {
$dp[$i] = array();
$dp[$i][0] = 0;
$dp[0][$i] = 0;
}
for ($i = 1; $i <= $mb_len1; $i++) {
for ($j = 1; $j <= $mb_len2; $j++) {
if ($mb_str1[$i - 1] == $mb_str2[$j - 1]) {
$dp[$i][$j] = $dp[$i - 1][$j - 1] + 1;
} else {
$dp[$i][$j] = $dp[$i - 1][$j] > $dp[$i][$j - 1] ? $dp[$i - 1][$j] : $dp[$i][$j - 1];
}
}
}
return $dp[$mb_len1][$mb_len2];
}

原文地址:https://www.jb51.cc/php/23626.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐