首先,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进行调查。