PHP函数similar_text()Levenshtein(),以提高计算字符串的相似度

similar_text(中文版)

复制代码代码如下所示:

< PHP

拆分字符串

功能split_str($str){

preg_match_all( / / U。

返回的数组{ 0 };

}



相似性检测

功能similar_text_cn($ str1、str2美元){

arr_1美元= array_unique(split_str($ str1));

arr_2美元= array_unique(split_str($ str2));

美元($ arr_2相似=数)数(array_diff(arr_2美元,美元arr_1));



返回相似度;

}



Levenshtein()中文版



复制代码代码如下所示:

< PHP

拆分字符串

功能mbstringtoarray($字符串编码=美元'utf-8){

arrayresult美元=阵();

而($艾朗= mb_strlen($字符串编码,$)){

array_push(arrayresult美元,mb_substr($ 0, 1,$字符串编码));

字符串(字符串mb_substr美元美元,1美元美元,艾朗,编码);

}

返回的arrayresult;

}

编辑距离

功能levenshtein_cn($ str1、str2 costreplace = 1美元,美元,美元'utf-8 encoding=){

count_same_letter = 0美元;

数组();

mb_len1美元= mb_strlen(str1美元美元,编码);

mb_len2 = mb_strlen美元(美元美元str2,编码);

mb_str1美元= mbstringtoarray(str1美元美元,编码);

mb_str2 = mbstringtoarray美元(美元美元str2,编码);

为($ I1 = 0;美元美元美元mb_len1 I1 <;I1 + +){

$ { $ I1 } =阵();

$ { $ I1 } { 0 } = $ I1;

}

为($ I2 = 0;美元美元美元mb_len2 I2 <;I2 + +){

0;

}

为($ I1 = 1;美元美元美元mb_len1 I1 <;I1 + +){

为($ I2 = 1;美元美元美元mb_len2 I2 <;I2 + +){

/ /成本=(美元美元美元str1的{ 1 } = $ I1 I2 str2 { $ 1 } 0):1;

如果($ mb_str1 { 1 } $ I1 1 } = $ mb_str2 { $ I2){

成本= 0;

count_same_letter美元+ +;

{人}

costreplace美元美元成本= / /更换;

}

$ { $ I1 I2 } { } = min(美元$ { 1 } { $ $ I1 I2 } + 1 /插入

$ { $ I1 I2 } { 1 } + 1美元 / /删除

$ { 1 } { $ $ I1 I2 1 } +美元);

}

}

返回$ { $ mb_len1 } { $ mb_len2 };

/ /返回数组('distance ' = $ { $ mb_len1 } { $ mb_len2 },'count_same_letter ' = $ count_same_letter);

}





最长公共子序列LCS()



复制代码代码如下所示:

< PHP

最长公共子序列英文版

功能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;

$ =数组();

($ i = 0;$ i;

$ $ I } =数组();

$ $ { 0 } = 0 } =;

$ 0 { } $ i } = 0;

}

为($我= 1;美元美元美元我<< len_1;i++){

(J = 1;对美元美元美元,<< len_2;j++){

如果($ str_1 { 1 }我美元1 } = = $ str_2 { $ J){

$ $ {我一点一点,我是1美元,1美元1美元;

{人}

1美元,我是1美元,1美元,1美元;

}

}

}

返回的DP { $ len_1 } { $ len_2 };

}

拆分字符串

功能mbstringtoarray($字符串编码=美元'utf-8){

arrayresult美元=阵();

而($艾朗= mb_strlen($字符串编码,$)){

array_push(arrayresult美元,mb_substr($ 0, 1,$字符串编码));

字符串(字符串mb_substr美元美元,1美元美元,艾朗,编码);

}

返回的arrayresult;

}

最长公共子序列中文版

功能lcs_cn($ str1、str2美元美元,编码= 'utf-8){

mb_len1美元= mb_strlen(str1美元美元,编码);

mb_len2 = mb_strlen美元(美元美元str2,编码);

mb_str1美元= mbstringtoarray(str1美元美元,编码);

mb_str2 = mbstringtoarray美元(美元美元str2,编码);

$ len = mb_len1美元美元美元美元mb_len2 >> mb_len1:mb_len2;

$ =数组();

($ i = 0;$ i;

$ $ I } =数组();

$ $ { 0 } = 0 } =;

$ 0 { } $ i } = 0;

}

为($我= 1;美元美元美元我<< mb_len1;i++){

(J = 1;对美元美元美元,<< mb_len2;j++){

如果($ mb_str1 { 1 }我美元1 } = = $ mb_str2 { $ J){

$ $ {我一点一点,我是1美元,1美元1美元;

{人}

1美元,我是1美元,1美元,1美元;

}

}

}

返回的DP { $ mb_len1 } { $ mb_len2 };

}