如何使用Levenshtein距离和拼写错误来创建类似字符串的阈值?

时间:2010-07-27 03:29:03

标签: php mysql puzzle levenshtein-distance

我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交数据。我们意识到大部分数据之间的Levenshtein距离只是所讨论的2个字符串之间的差异。这表明如果我们只是将一个字符串中的字符添加到另一个字符串中,那么我们最终会得到相同的字符串,对于大多数情况来说,这似乎是我们考虑重复项目的最佳方式。

我们也想说明错别字。因此,我们开始平均考虑人们在每个单词上在线制作拼写错误的频率,并尝试在此距离内使用这些数据。我们找不到任何这样的统计数据。

在为数据匹配创建此类阈值时,有没有办法解决拼写错误?

让我知道我是否可以澄清!

2 个答案:

答案 0 :(得分:7)

首先,Levenshtein距离定义为将字符串A转换为字符串B所需的最小编辑数,其中编辑是插入,删除单个字符,或用另一个字符替换字符。因此,对于距离的某种定义,它是“两个字符串之间的差异”。 =)

听起来你正在寻找距离函数F(A,B)给出字符串A和B之间的距离以及阈值N,其中距离小于N的字符串是拼写错误的候选者。除了Levenshtein距离之外,您还可以考虑Needleman–Wunsch。它基本上是相同的,但它允许您提供一个函数,以确定给定角色与另一个角色的接近程度。您可以将该算法与一组权重结合使用,这些权重反映了QWERTY键盘上键的位置,可以很好地找到拼写错误。但这会产生国际键盘的问题。

如果您有k个字符串并且想要找到潜在的拼写错误,则需要进行的比较次数为O(k ^ 2)。另外,每个比较是O(len(A)* len(B))。所以如果你有一百万个字符串,如果你天真地做事,你会发现自己陷入困境。以下是关于如何加快速度的一些建议:

  • 道歉,如果这是显而易见的,但Levenshtein距离是对称的,所以请确保你没有计算F(A,B)和F(B,A)。
  • abs(len(A) - len(B))是字符串A和B之间距离的下限。因此,您可以跳过检查长度过于不同的字符串。

您可能遇到的一个问题是“第一圣”距离“第一街”有很远的距离,即使你可能想要考虑那些是相同的。处理此问题的最简单方法可能是在进行比较之前将字符串转换为规范形式。因此,您可以将所有字符串设置为小写,使用将“1st”映射到“first”的字典等。该字典可能会变得非常大,但我不知道更好的方法来处理这些问题。

由于你用php标记了这个问题,我假设你想用php来做这件事。 PHP有一个内置的levenshtein()函数,但两个字符串必须是255个字符或更少。如果时间不够长,你就必须自己做。或者,您可以使用Python的difflib进行调查。

答案 1 :(得分:0)

你应该看看这本书:

http://nlp.stanford.edu/IR-book/pdf/irbookonlinereading.pdf

关于拼写检查有一个很好的章节(3.3)

本章末尾的参考文献列出了一些讨论概率模型的论文

祝你好运