我目前正在使用 similar_text 来比较字符串尽管由于比较次数很多,但是〜50,000的列表仍有效。比较~500个独特的字符串大约需要11分钟。

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

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

有帮助吗?

解决方案

最后, levenshtein similar_text 对于必须通过的字符串数量来说都太慢了,即使有很多检查并只使用它们一个他们作为最后的手段。

作为一项实验,我将一些代码移植到C#中,看看它与嵌入式代码的速度有多快。它使用相同的数据集在大约3分钟内运行。

接下来,我在表中添加了一个额外字段,并使用双元电话PECL扩展为每一行生成键。结果很好,虽然由于一些包含的数字,这导致重复。我想我可以通过上述功能运行每一个,但决定不这样做。

最后我选择了最简单的方法,MySQL的全文非常好用。偶尔会出现错误,尽管它们易于检测和纠正。它运行速度非常快,大约3-4秒。

其他提示

也许您可以通过首先比较字符串以获得完全匹配(并首先比较长度是否相同)来“短路”某些检查,如果它跳过更昂贵的 similar_text 调用。

正如@jason所说,O(N ^ 3)算法永远不会是一个好的选择。

当使用levenshtein自动机(匹配距离为 k 的字符串的自动机)时,你可以检查 O(n)中的匹配,其中 n 是您要检查的字符串的长度。构造自动机将采用 O(kn),其中 k 是基本字符串的最大距离和 n 长度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top