关于PHP的相似度计算函数:levenshtein的使用介绍
|
使用说明 levenshtein() 函数返回两个字符串之间的 Levenshtein 距离。 Levenshtein 距离,又称编辑距离,指的是两个字符串之间,由一个转换成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。 例如把 kitten 转换为 sitting: sitten (k→s) 语法:levenshtein(string1,string2,insert,replace,delete) 参数 描述string1 必需。要对比的第一个字符串。 如果其中一个字符串超过 255 个字符,levenshtein() 函数返回 -1。 例子 代码如下: echo levenshtein("Hello World","ello World");echo " "; echo levenshtein("Hello World","ello World",10,20,30); ?>
源码分析levenshtein() 属于标准函数,在/ext/standard/目录下有专门针对此函数实现的文件:levenshtein.c。
levenshtein()会根据参数个数选择实现方式,针对参数为2和参数为5的情况,都会调用 reference_levdist() 函数计算距离。其不同在于对后三个参数,参数为2时,使用默认值1。 并且在实现源码中我们发现了一个在文档中没有说明的情况: levenshtein() 函数还可以传递三个参数,其最终会调用 custom_levdist() 函数。它将第三个参数作为自定义函数的实现,其调用示例如下:
reference_levdist() 函数的实现算法是一个经典的DP问题。 给定两个字符串x和y,求最少的修改次数将x变成y。修改的规则只能是如下三种之一:删除、插入、改变。
简单实现过程如下: 代码如下: $s1 = "abcdd";$l1 = strlen($s1); $s2 = "aabbd"; $l2 = strlen($s2); for ($i = 0; $i < $l1; $i++) { $a[0][$i + 1] = $i + 1; } for ($i = 0; $i < $l2; $i++) { $a[$i + 1][0] = $i + 1; } for ($i = 0; $i < $l2; $i++) { for ($j = 0; $j < $l1; $j++) { if ($s2[$i] == $s1[$j]) { $a[$i + 1][$j + 1] = min($a[$i][$j],$a[$i][$j + 1] + 1,$a[$i + 1][$j] + 1); }else{ $a[$i + 1][$j + 1] = min($a[$i][$j],$a[$i][$j + 1],$a[$i + 1][$j]) + 1; } } } echo $a[$l1][$l2]; echo "n"; echo levenshtein($s1,$s2);
Levenshtein distance说明Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他的名字命名。不会拼读,可以叫它edit distance(编辑距离)。Levenshtein distance可以用来:Spell checking(拼写检查) Speech recognition(语句识别) DNA analysis(DNA分析) Plagiarism detection(抄袭检测) LD用mn的矩阵存储距离值。 (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
