Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用Levenshtein距离为类似字符串创建阈值并考虑打字错误?_Php_Mysql_Puzzle_Levenshtein Distance - Fatal编程技术网

Php 如何使用Levenshtein距离为类似字符串创建阈值并考虑打字错误?

Php 如何使用Levenshtein距离为类似字符串创建阈值并考虑打字错误?,php,mysql,puzzle,levenshtein-distance,Php,Mysql,Puzzle,Levenshtein Distance,我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交的数据。我们意识到,大多数数据之间的Levenshtein距离只是两个字符串之间的差异。这表明,如果我们简单地将一个字符串中的字符添加到另一个字符串中,那么我们最终将得到相同的字符串,对于大多数情况,这似乎是解释重复项的最佳方法 我们还想解释打字错误。所以我们开始考虑人们在网上每字打字的平均频率,并尝试在这个距离内使用这些数据。我们找不到这样的统计数字 在为数据匹配创建此类阈值时,是否有任何方法可以解释输入错误 如果我能澄清

我们最近在工作中遇到了一个有趣的问题,我们在数据库中发现了重复的用户提交的数据。我们意识到,大多数数据之间的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之间距离的下限。因此,可以跳过检查长度差异过大的字符串
你可能碰到的一个问题是“第一街”距离“第一街”有很高的距离,即使你可能想考虑那些是相同的。处理此问题的最简单方法可能是在进行比较之前将字符串转换为规范形式。所以你可以把所有的字符串都改成小写,使用一个将“1st”映射到“first”的字典,等等。这个字典可能会变得很大,但我不知道有什么更好的方法来处理这个问题

既然你用php标记了这个问题,我假设你想用php来解决这个问题。PHP有一个内置的levenshtein()函数,但两个字符串都必须小于等于255个字符。如果时间不够长,你就得自己做了。或者,您可以研究使用Python的difflib