在此页levenshtein()上,我使用示例#1和以下变量:
// input misspelled word
$input = 'htc corporation';
// array of words to check against
$words = array('htc', 'Sprint Nextel', 'Sprint', 'banana', 'orange',
'radish', 'carrot', 'pea', 'bean');
有人可以告诉我为什么预期的结果是胡萝卜而不是 htc ?感谢
答案 0 :(得分:4)
因为距离htc corporation
的levenshtein距离是12,而胡萝卜的距离只有11。
levenshtein函数计算为了获得某个单词而必须添加或替换的字符数,并且因为htc corporation
有比htc
多12个字符,所以必须删除12才能到达{ {1}}。要从htc
转到单词carrot
,需要进行11次更改。
答案 1 :(得分:3)
“htc corporation”=> “公司”:4
“corporation”=> “公司”:3
“corporat”=> “corrat”:2
“corrat”=> “carrat”:1
“carrat”=> “胡萝卜”:1
4 + 3 + 2 + 1 + 1 = 11
看起来你可能正在寻找的不是直接的levenshtein距离,而是“最近的子串”匹配。使用修改后的Levenshtein算法here就可以实现这样的事情。使用此算法得分:
htc:0
Sprint Nextel:11
冲刺:4
香蕉:5
橙色:3
萝卜:3
胡萝卜:3
豌豆:2
豆:3
将“htc”识别为精确的子串匹配,并将其得分为零。亚军“豌豆”得分为2,因为你可以将它与公司中的“p”,“e”或“a”对齐,然后替换其他两个角色等。使用此算法时,您应该知道分数永远不会高于“针”字符串的长度,因此较短的字符串通常会得到较低的分数(它们“更容易匹配”)。
答案 2 :(得分:2)
Levenshtein distance是用于测量两个序列之间差异的字符串度量。非正式地说,两个单词之间的Levenshtein距离是将一个单词改为另一个单词所需的单字符编辑(插入,删除,替换)的最小数量。
这是一个简单的分析
$input = 'htc corporation';
// array of words to check against
$words = array(
'htc',
'Sprint Nextel',
'Sprint',
'banana',
'orange',
'radish',
'carrot',
'pea',
'bean'
);
foreach ( $words as $word ) {
// Check for Intercept
$ic = array_intersect(str_split($input), str_split($word));
printf("%s \t l= %s , s = %s , c = %d \n",$word ,
levenshtein($input, $word),
similar_text($input, $word),
count($ic));
}
输出
htc l= 12 , s = 3 , c = 5
Sprint Nextel l= 14 , s = 3 , c = 8
Sprint l= 12 , s = 1 , c = 7
banana l= 14 , s = 2 , c = 2
orange l= 12 , s = 4 , c = 7
radish l= 12 , s = 3 , c = 5
carrot l= 11 , s = 1 , c = 10
pea l= 13 , s = 2 , c = 2
bean l= 13 , s = 2 , c = 2
很明显htc的距离为12
而胡萝卜的距离为11
,如果你想要htc,那么Levenshtein
单独是不够的......你需要比较确切的单词然后设置优先级