C++ Levenshtein算法:如何满足这种文本编辑要求?

C++ Levenshtein算法:如何满足这种文本编辑要求?,c++,algorithm,pattern-matching,levenshtein-distance,C++,Algorithm,Pattern Matching,Levenshtein Distance,我使用levenshtein算法来满足这些要求: 在查找N个字符的单词时,我的字典数据库中建议更正的单词有: 每个字典中的N个字符的单词与找到的单词有1个字符的差异。 例子: 发现单词:熊,字典单词:熊 每个字典中包含N+1个字符的单词,其中N个字符等于找到的单词。 例子: 发现单词:熊,字典单词:熊 每个包含N-1个字符的字典单词,其N-1个字符等于找到的单词。 例子: 发现单词:熊,字典单词:熊 < P>我使用C++中的LVEN算法实现了当一个词有1个LaveStin数,这是三个情况下的Le

我使用levenshtein算法来满足这些要求:

在查找N个字符的单词时,我的字典数据库中建议更正的单词有:

每个字典中的N个字符的单词与找到的单词有1个字符的差异。 例子: 发现单词:熊,字典单词:熊

每个字典中包含N+1个字符的单词,其中N个字符等于找到的单词。 例子: 发现单词:熊,字典单词:熊

每个包含N-1个字符的字典单词,其N-1个字符等于找到的单词。 例子: 发现单词:熊,字典单词:熊

< P>我使用C++中的LVEN算法实现了当一个词有1个LaveStin数,这是三个情况下的LevsHeTin数,但是我该如何选择这个词来暗示呢?我读过关于博耶·摩尔·霍斯波和克努斯·莫里斯·普拉特的书,但我不确定他们两人会有什么帮助

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int levenshtein(const string &s1, const string &s2)
{
   string::size_type N1 = s1.length();
   string::size_type N2 = s2.length();
   string::size_type i, j;
   vector<int> T(N2+1);

   for ( i = 0; i <= N2; i++ )
      T[i] = i;

   for ( i = 0; i < N1; i++ ) {
      T[0] = i+1;
      int corner = i;
      for ( j = 0; j < N2; j++ ) {
         int upper = T[j+1];
         if ( s1[i] == s2[j] )
            T[j+1] = corner;
         else
            T[j+1] = min(T[j], min(upper, corner)) + 1;
         corner = upper;
      }
   }
   return T[N2];
}
你可能还想增加你的阅读


我已经有一段时间没有读过它了,但我记得它与你的文章非常相似。

为什么把建议限制在一个单词上,为什么不包括一组单词?如果你只限于一个单词,你可以按照预先计算的使用频率或其他方式对结果进行排序。此频率可根据用户从建议中选择的内容进行更新

此外,如果原始单词中没有拼写错误,您可能希望对N+1个案例进行优先排序,这更像是自动完成。无论如何,我不认为有一个正确的方法可以做到这一点,也许如果你的要求更具体,它会更容易缩小范围


此外,您不需要了解Python就可以理解Norvig文章中描述的算法。

正如我在其他地方所说的,Boyer Moore并不适合这样做。由于您希望同时搜索多个stings,Wu和Manber的算法应该更符合您的喜好


我已经发布了一个概念证明C++代码来回答。注意这里提到的注意事项。

如果我理解正确,那么你的问题就没有正确答案。您正在使用Levenshtein为一个给定的单词识别最多三个建议-由您来制定规则,以决定使用哪一个和过滤掉哪一个。或者你应该全部使用它们


有趣的是,Levenshtein的Damerau扩展可能会引起您的兴趣,其中两个交换的字符也被认为是1分,而不是vanilla Levenshtein返回的2分。

这篇文章可能在,但不是关于Python代码未知的Python,你也许能看懂这篇文章。我在代码中看到的唯一不明显的东西是“列表理解”,你可以用谷歌搜索。