我正在寻找PHP的Damerau–Levenshtein算法的实现,但似乎我找不到任何与我的朋友谷歌的东西。到目前为止,我必须使用PHP实现的Levenshtein(没有Damerau转置,这非常重要),或者获得原始源代码(在C,C ++,C#,Perl中)并将其写入(转换)给PHP。
有没有人知道PHP的实现?
我在公司内部网上使用soundex和双metaphone作为“你是不是我的意思:”扩展名,我想实现Damerau-Levenshtein算法来帮助我更好地对结果进行排序。类似于这个想法:http://www.briandrought.com/blog/?p=66,我的实现类似于前5个步骤。
答案 0 :(得分:6)
我回来时有一个stab at it递归解决方案。
/*
* Naïve implementation of Damerau-Levenshtein distance
* (Does not work when there are neighbouring transpositions)!
*/
function DamerauLevenshtein($S1, $S2)
{
$L1 = strlen($S1);
$L2 = strlen($S2);
if ($L1==0 || $L2==0) {
// Trivial case: one string is 0-length
return max($L1, $L2);
}
else {
// The cost of substituting the last character
$substitutionCost = ($S1[$L1-1] != $S2[$L2-1])? 1 : 0;
// {H1,H2} are {L1,L2} with the last character chopped off
$H1 = substr($S1, 0, $L1-1);
$H2 = substr($S2, 0, $L2-1);
if ($L1>1 && $L2>1 && $S1[$L1-1]==$S2[$L2-2] && $S1[$L1-2]==$S2[$L2-1]) {
return min (
DamerauLevenshtein($H1, $S2) + 1,
DamerauLevenshtein($S1, $H2) + 1,
DamerauLevenshtein($H1, $H2) + $substitutionCost,
DamerauLevenshtein(substr($S1, 0, $L1-2), substr($S2, 0, $L2-2)) + 1
);
}
return min (
DamerauLevenshtein($H1, $S2) + 1,
DamerauLevenshtein($S1, $H2) + 1,
DamerauLevenshtein($H1, $H2) + $substitutionCost
);
}
}
答案 1 :(得分:2)
查看our implementation(包含测试和文档)。
答案 2 :(得分:0)
如何使用内置的php函数......?
http://php.net/manual/en/function.levenshtein.php
int levenshtein ( string $str1 , string $str2 )
int levenshtein ( string $str1 , string $str2 , int $cost_ins , int $cost_rep , int $cost_del )