PHP levenshtein()函数是否有错误?

时间:2013-08-02 15:50:20

标签: php

在此页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 ?感谢

3 个答案:

答案 0 :(得分:4)

因为距离htc corporation的levenshtein距离是12,而胡萝卜的距离只有11。

levenshtein函数计算为了获得某个单词而必须添加或替换的字符数,并且因为htc corporation有比htc多12个字符,所以必须删除12才能到达{ {1}}。要从htc转到单词carrot,需要进行11次更改。

答案 1 :(得分:3)

“htc corporation”到“htc”的距离为12(删除“公司”= 12个字符)。 “htc corporation”与“胡萝卜”的距离不超过11​​。

“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单独是不够的......你需要比较确切的单词然后设置优先级