在PHP中加速levenshtein / similar_text

时间:2009-08-01 02:56:28

标签: php levenshtein-distance similarity

我目前正在使用similar_text将字符串与~50,000的列表进行比较,虽然由于比较的数量非常慢,但仍有效。比较~500个独特的字符串大约需要11分钟。

在运行之前,我会检查数据库以查看它是否已经过去处理,因此每次运行后它都会接近即时。

我确信使用levenshtein稍快一些,手册中发布的LevenshteinDistance函数看起来很有趣。我错过了一些可以使这个显着加快的东西吗?

3 个答案:

答案 0 :(得分:5)

最后,levenshteinsimilar_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长度。