更好的模糊匹配性能?

时间:2014-01-28 14:47:55

标签: python performance levenshtein-distance fuzzy-comparison difflib

我目前正在使用difflib中的方法get_close_matches方法来迭代15,000个字符串的列表,以便与另一个大约15,000个字符串的列表进行最接近的匹配:

a=['blah','pie','apple'...]
b=['jimbo','zomg','pie'...]

for value in a:
    difflib.get_close_matches(value,b,n=1,cutoff=.85)

每个值需要0.58秒,这意味着完成循环需要8,714秒或145分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个阵列转换为小写,但它只会导致速度略有提升。

5 个答案:

答案 0 :(得分:3)

也许您可以构建每个列表中出现的三元组(三个连续字母)的索引。仅检查a中的字符串,以查找共享三元组的b中的字符串。

你可能想看一下BLAST生物信息学工具;它对序列数据库进行近似序列比对。

答案 1 :(得分:3)

fuzzyset indexes strings by their bigrams and trigrams so it finds approximate matches in O(log(N)) vs O(N) for difflib. For my fuzzyset of 1M+ words and word-pairs it can compute the index in about 20 seconds and find the closest match in less than a 100 ms.

答案 2 :(得分:1)

试试这个

https://code.google.com/p/pylevenshtein/

Levenshtein Python C扩展模块包含快速计算的函数 - Levenshtein(编辑)距离和编辑操作 - 字符串相似性 - 近似中值字符串,通常字符串平均 - 字符串序列和集合相似性它支持普通字符串和Unicode字符串

答案 3 :(得分:1)

RapidFuzz

是用于模糊字符串匹配的超快速库。它具有与著名的 Fuzzywuzzy 相同的 API,但速度更快且获得 MIT 许可。

答案 4 :(得分:0)

我尝试了几种模糊匹配的方法。最好的是余弦相似度,根据您的需要设置阈值(我保持80%的模糊匹配)。