如何在1-edit距离内生成单词的所有变体(Levenshtein)?

时间:2016-07-07 14:48:11

标签: php levenshtein-distance

我想使用Levenshtein距离在1-edit距离内生成单词的所有变体。

PHP有一个函数,它将两个字符串作为参数,并且只返回将str1转换为str2所需的insert,replace和delete操作的数字(int)。 PHP Manual - levenshtein

int levenshtein ( string $str1 , string $str2 )

我正在寻找一种PHP解决方案来创建一个生成给定单词变体的算法。

1 个答案:

答案 0 :(得分:3)

距离1非常容易。生成距离的所有可能性> 1变得有点复杂。

从单词开始:

$input = 'word';

将单词拆分为字母并生成替换列表。

$letters = str_split($input);

$alphabet = range('a', 'z');

删除是最简单的,只是循环遍历每个位置,并替换为''

foreach ($letters as $i => $letter) {
    $variants[] = substr_replace($input, '', $i, 1);
}

插入和替换可以同时完成,因为它们都需要在输入中的字母上循环嵌套在字母表中的循环内。

foreach ($alphabet as $variation) {
    foreach ($letters as $i => $letter) {

        // insertion
        $variants[] = substr($input, 0, $i) . $variation . substr($input, $i);

        // substitution
        // (check that the letter is different or you'll get multiple copies of the input)
        if ($variation != $letter) {
            $variants[] = substr_replace($input, $variation, $i, 1);
        }
    }
    $variants[] = $input . $variation; // handle insertion at the end
}

您可以检查结果以验证levenshtein距离是否正确:

foreach ($variants as $variant) {
    $result[$variant] = levenshtein($input, $variant);
}