我目前正在使用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分钟。是否有其他库/方法可能更快或提高此方法的速度?我已经尝试将两个阵列转换为小写,但它只会导致速度略有提升。
答案 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)
是用于模糊字符串匹配的超快速库。它具有与著名的 Fuzzywuzzy 相同的 API,但速度更快且获得 MIT 许可。
答案 4 :(得分:0)
我尝试了几种模糊匹配的方法。最好的是余弦相似度,根据您的需要设置阈值(我保持80%的模糊匹配)。