PHP改進(jìn)計(jì)算字符串相似度的函數(shù)similar_text()、levenshtein()
更新時(shí)間:2014年10月27日 09:30:33 投稿:hebedich
PHP 原生的similar_text()函數(shù)、levenshtein()函數(shù)對(duì)中文漢字支持不好,我自己寫(xiě)了一個(gè),測(cè)試使用正常,推薦給大家,如果有什么問(wèn)題,請(qǐng)留言
similar_text()中文漢字版
復(fù)制代碼 代碼如下:
<?php
//拆分字符串
function split_str($str) {
preg_match_all("/./u", $str, $arr);
return $arr[0];
}
//相似度檢測(cè)
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()中文漢字版
復(fù)制代碼 代碼如下:
<?php
//拆分字符串
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 <= $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);
}
最長(zhǎng)公共子序列LCS()
復(fù)制代碼 代碼如下:
<?php
//最長(zhǎng)公共子序列英文版
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 = '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;
}
//最長(zhǎng)公共子序列中文版
function LCS_cn($str1, $str2, $encoding = 'UTF-8') {
$mb_len1 = mb_strlen($str1, $encoding);
$mb_len2 = mb_strlen($str2, $encoding);
$mb_str1 = mbStringToArray($str1, $encoding);
$mb_str2 = mbStringToArray($str2, $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];
}
您可能感興趣的文章:
- 如何使用php繪制在圖片上的正余弦曲線
- PHP中計(jì)算字符串相似度的函數(shù)代碼
- PHP實(shí)現(xiàn)的簡(jiǎn)易版圖片相似度比較
- php查詢(xún)相似度最高的字符串的方法
- 關(guān)于PHP的相似度計(jì)算函數(shù):levenshtein的使用介紹
- 使用PHP similar text計(jì)算兩個(gè)字符串相似度
- php計(jì)算兩個(gè)整數(shù)的最大公約數(shù)常用算法小結(jié)
- php數(shù)字游戲 計(jì)算24算法
- php編寫(xiě)的抽獎(jiǎng)程序中獎(jiǎng)概率算法
- php 大數(shù)據(jù)量及海量數(shù)據(jù)處理算法總結(jié)
- PHP大轉(zhuǎn)盤(pán)中獎(jiǎng)概率算法實(shí)例
- PHP數(shù)據(jù)分析引擎計(jì)算余弦相似度算法示例
相關(guān)文章
php simplexmlElement操作xml的命名空間實(shí)現(xiàn)代碼
這是今天中午發(fā)生的事情,有人在群里求助,比如xml中如果標(biāo)記是<xx:xxxx>content</xx:xxxx>這樣的情況下,取不到 xx:xxxx 為下標(biāo)的值。2011-01-01require(),include(),require_once()和include_once()區(qū)別
面試中最容易提到的一個(gè)PHP的問(wèn)題,我想和大家共勉一下: require()和include()有許多相似之處,也有些不同。理解它們的不同點(diǎn)非常重要,否則很容易犯錯(cuò)誤。2008-03-03PHP如何限制定時(shí)任務(wù)的進(jìn)程數(shù)量
這篇文章主要給大家介紹了關(guān)于PHP如何限制定時(shí)任務(wù)進(jìn)程數(shù)量的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03PHP封裝函數(shù)實(shí)現(xiàn)生成隨機(jī)的字符串驗(yàn)證碼
這篇文章主要介紹了利用PHP封裝函數(shù)實(shí)現(xiàn)生成隨機(jī)的字符串驗(yàn)證碼的相關(guān)資料,文中給出了詳細(xì)的介紹的示例代碼,對(duì)大家具有一定的參考價(jià)值,有需要的朋友們可以一起來(lái)學(xué)習(xí)學(xué)習(xí)。2017-01-01PHP5全版本繞過(guò)open_basedir讀文件腳本漏洞詳細(xì)介紹
這篇文章主要介紹了PHP5全版本繞過(guò)open_basedir讀文件腳本漏洞詳細(xì)介紹,這個(gè)漏洞很久之前(大概5年前)被提出來(lái)了,到現(xiàn)在的最新版本中依然存在,需要的朋友可以參考下2015-01-01一個(gè)不易被發(fā)現(xiàn)的PHP后門(mén)代碼解析
這篇文章主要介紹了一個(gè)不易被發(fā)現(xiàn)的PHP后門(mén)代碼解析,對(duì)于網(wǎng)絡(luò)安全來(lái)說(shuō)非常重要,需要的朋友可以參考下2014-07-07