Php 如何使用Levenshtein距离为类似字符串创建阈值并考虑打字错误?
我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交的数据。我们意识到,大多数数据之间的Levenshtein距离只是两个字符串之间的差异。这表明,如果我们简单地将一个字符串中的字符添加到另一个字符串中,那么我们最终将得到相同的字符串,对于大多数情况,这似乎是解释重复项的最佳方法 我们还想解释打字错误。所以我们开始考虑人们在网上每字打字的平均频率,并尝试在这个距离内使用这些数据。我们找不到这样的统计数字 在为数据匹配创建此类阈值时,是否有任何方法可以解释输入错误Php 如何使用Levenshtein距离为类似字符串创建阈值并考虑打字错误?,php,mysql,puzzle,levenshtein-distance,Php,Mysql,Puzzle,Levenshtein Distance,我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交的数据。我们意识到,大多数数据之间的Levenshtein距离只是两个字符串之间的差异。这表明,如果我们简单地将一个字符串中的字符添加到另一个字符串中,那么我们最终将得到相同的字符串,对于大多数情况,这似乎是解释重复项的最佳方法 我们还想解释打字错误。所以我们开始考虑人们在网上每字打字的平均频率,并尝试在这个距离内使用这些数据。我们找不到这样的统计数字 在为数据匹配创建此类阈值时,是否有任何方法可以解释输入错误 如果我能澄清
如果我能澄清,请告诉我 你应该看看这本书: 有一个关于拼写检查的好章节(3.3) 本章末尾的参考文献列出了一些讨论概率模型的论文
好运首先,Levenshtein距离定义为将字符串A转换为字符串B所需的最小编辑次数,其中编辑是插入或删除单个字符,或用另一个字符替换字符。因此,对于距离的特定定义,这很大程度上是“两条字符串之间的差异”。=) 听起来你在寻找一个距离函数F(a,B),它给出了字符串a和B之间的距离,以及一个阈值N,其中距离小于N的字符串是打字错误的候选。除了LevsTein距离,你也可以考虑。这基本上是一样的,但是它可以让你提供一个函数来计算一个给定的角色和另一个角色之间的距离。你可以使用一组反映QWERTY键盘上按键位置的权重算法来很好地查找打字错误。不过,这在国际键盘上会有问题 如果您有k个字符串,并且希望找到潜在的拼写错误,则需要进行的比较数量为O(k^2)。此外,每个比较都是O(len(A)*len(B))。所以,如果你有一百万根弦,如果你做事情很幼稚,你会发现自己有麻烦。以下是一些关于如何加快速度的建议:
- 如果这是显而易见的,我很抱歉,但是列文施坦距离是对称的,所以请确保您没有计算F(A,B)和F(B,A)
- abs(len(A)-len(B))是字符串A和B之间距离的下限。因此,可以跳过检查长度差异过大的字符串