我目前正在使用similar_text将字符串与~50,000的列表进行比较,虽然由于比较的数量非常慢,但仍有效。比较~500个独特的字符串大约需要11分钟。
在运行之前,我会检查数据库以查看它是否已经过去处理,因此每次运行后它都会接近即时。
我确信使用levenshtein稍快一些,手册中发布的LevenshteinDistance函数看起来很有趣。我错过了一些可以使这个显着加快的东西吗?
答案 0 :(得分:5)
最后,levenshtein
和similar_text
对于必须通过的字符串数量来说都太慢了,即使有很多检查,只使用其中一个作为最后的手段
作为一项实验,我将一些代码移植到C#中,看看它与嵌入式代码的速度有多快。它使用相同的数据集在大约3分钟内运行。
接下来,我在表中添加了一个额外字段,并使用双元电话PECL扩展为每一行生成键。结果很好,虽然由于一些包含的数字,这导致重复。我想我可以通过上述功能运行每一个,但决定不这样做。
最后我选择了最简单的方法,MySQL的全文非常好用。偶尔会出现错误,尽管它们易于检测和纠正。它运行速度非常快,大约3-4秒。
答案 1 :(得分:2)
也许您可以通过首先比较字符串以获得完全匹配(并首先比较长度是否相同)来“短路”某些检查,如果它跳过更昂贵的similar_text
电话。
正如@jason所说,O(N ^ 3)算法永远不会是一个好的选择。
答案 2 :(得分:2)
当使用levenshtein自动机(匹配距离为k
的字符串的自动机)时,您可以检查O(n)
中的匹配,其中n
是您正在检查的字符串的长度。构建自动机将采用O(kn)
,其中k
是基本字符串的最大距离和n
长度。