Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在1编辑距离(Levenshtein)内生成单词的所有变体?_Php_Levenshtein Distance - Fatal编程技术网

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

Php 如何在1编辑距离(Levenshtein)内生成单词的所有变体?,php,levenshtein-distance,Php,Levenshtein Distance,我想使用Levenshtein距离在1-edit距离内生成单词的所有变体 PHP有一个函数,它将两个字符串作为参数,只返回将str1转换为str2所需的insert、replace和delete操作数(int) 我正在寻找一个PHP解决方案来创建一个生成给定单词变体的算法。这对于distance 1来说非常容易。生成距离大于1的所有可能性变得有些复杂 从一个词开始: $input = 'word'; 将单词拆分为字母并生成替换项列表 $letters = str_split($input);

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

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


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

这对于distance 1来说非常容易。生成距离大于1的所有可能性变得有些复杂

从一个词开始:

$input = 'word';
将单词拆分为字母并生成替换项列表

$letters = str_split($input);

$alphabet = range('a', 'z');
删除是最简单的,只需在每个位置上循环并替换为
'

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

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);
}

可能是Hi Daniel的翻版,我已经读过那篇文章,但它是用python编写的,他们讨论了Google搜索是如何工作的。我不认为我的问题是重复的。我在这里寻找一个PHP解决方案。你将如何使用笔和纸来完成这个任务?让我们假设你的单词是“AB”,字母表是“A”、“B”、“C”。我想你在纸上解决这个问题很简单。只需编写PHP代码,执行与您相同的操作即可。我认为没有那么简单。我正在使用Levenshtein距离(即插入、删除或替换)查找单词在1-edit距离内的所有变体。对于我需要生成的单词:“王国”:kongdom,pingdom…,kngdom…,kingdomo…,你的答案是完美的。我目前正在开发自己的解决方案,并取得了良好的效果。这与你的方法相似,但你的方法更好。谢谢你的努力。谢谢你帮我不感到无聊。
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
}
foreach ($variants as $variant) {
    $result[$variant] = levenshtein($input, $variant);
}