4

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

4

3 回答 3

4

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

levenshtein 函数计算它必须添加或替换多少个字符才能到达某个单词,因为它htc corporation有 12 个额外的字符而不是htc它必须删除 12 个才能到达 just htc。要从中得到这个词carrothtc corporation需要进行 11 次更改。

于 2013-08-02T15:52:58.777 回答
3

“htc Corporation”到“htc”的距离为 12(删除“corporate” = 12 个字符)。“htc Corporation”到“carrot”的距离不超过11​​。

"htc 公司" => "公司": 4
"公司" => "公司": 3
"公司" => "corrat": 2
"corrat" => "carrat": 1
"carrat" => "carrot": 1

4 + 3 + 2 + 1 + 1 = 11

看起来您可能正在寻找的不是直接的 levenshtein 距离,而是“最近的子字符串”匹配。这里有一个使用修改后的 Levenshtein 算法的示例实现。使用此算法可得出以下分数:

htc:0
Sprint Nextel:11
Sprint:4
香蕉:5
橙子:3
萝卜:3
胡萝卜:3
豌豆:2
豆:3

它将“htc”识别为精确的子字符串匹配并将其得分为零。亚军“豌豆”得分为 2,因为您可以将其与公司中的“p”、“e”或“a”对齐,然后替换其他两个字符等。使用这个算法你应该知道分数永远不会高于“needle”字符串的长度,所以较短的字符串通常会得到较低的分数(它们“更容易匹配”)。

于 2013-08-02T15:57:39.593 回答
2

Levenshtein距离是用于测量两个序列之间差异的字符串度量。通俗地说,两个单词之间的 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 ,htc 有一段距离,12而胡萝卜有一段距离,那么单独是不够的.. 你需要比较确切的单词然后设置优先级11Levenshtein

于 2013-08-02T15:59:58.253 回答