2010-07-27 26 views
3

我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交的数据。我们意识到大部分数据之间的Levenshtein距离仅仅是两个字符串之间的差异。这表明如果我们只是将一个字符串中的字符添加到另一个字符串中,那么我们最终会得到相同的字符串,并且对于大多数情况来说,这似乎是我们解释重复项目的最佳方式。如何使用Levenshtein距离创建类似字符串的阈值并解释拼写错误?

我们也想解释拼写错误。所以我们开始平均考虑人们每个字每次在网上打字错误的次数,并尝试在这个距离内使用这些数据。我们找不到这样的统计数据。

当创建这种数据匹配阈值时,是否有任何方法来解决拼写错误?

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

回答

7

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

听起来好像你正在寻找一个给出字符串A和B之间距离的距离函数F(A,B)和一个阈值N,其中距离小于N的字符串是错别字的候选字符。除Levenshtein距离外,您还可以考虑Needleman–Wunsch。它基本上是一样的东西,但它可以让你提供一个函数,让一个给定的角色与另一个角色有多接近。您可以将该算法与一组反映QWERTY键盘上按键位置的权重结合使用,以发现拼写错误。尽管如此,这对于国际键盘会有问题。

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

  • 道歉,如果这是显而易见的,但莱文斯坦距离是对称的,所以一定要确保你没有计算F(A,B)和F(B,A )。
  • abs(len(A) - len(B))是字符串A和字符串B之间距离的下限。所以您可以跳过检查字符串的长度差别太大。

您可能遇到的一个问题是“1st St.”与“第一街”距离相当远,尽管您可能想要将它们视为相同。处理这个问题的最简单方法可能是在比较之前将字符串转换为规范形式。因此,您可以将所有字符串设置为小写字母,使用映射“1st”到“first”等的字典。该字典可能会变得很大,但我不知道处理这些问题的更好方法。

既然你用php标记了这个问题,我假设你想用这个php。 PHP有一个内置的levenshtein()函数,但两个字符串必须不超过255个字符。如果这还不够长,你必须自己做。或者,您可以使用Python的difflib进行调查。

相关问题