【发布时间】:2020-11-10 19:42:36
【问题描述】:
我想在一长串字符串中找到相似之处。那是对于列表中的每个字符串,我需要同一个列表中的所有相似字符串。早些时候我使用了Fuzzywuzzy,它通过使用fuzzy.partial_token_sort_ratio 提供了我想要的结果的良好准确性。唯一的问题是列表包含大约 50k 个条目和最多 40 个字符串所花费的时间。 50k 个字符串花费的时间长达 36 小时。
为了提高我的时间,我尝试了 rapidfuzz 库,它将时间减少到大约 12 小时,提供与来自答案 here 的 Fuzzywuzzy 相同的输出。后来我尝试了 tf-idf 和余弦相似度,它使用受 blog 启发的 string-grouper 库提供了一些出色的时间改进。仔细调查结果,string-grouper 方法漏掉了诸如 'DARTH VADER' 和 'VADER' 之类的匹配项,这些匹配项都被fuzzywuzzy 和 rapidfuzz 捕获。这可以理解,因为 TF-IDF 的工作方式似乎完全忽略了小字符串。 是否有任何解决方法可以改善此示例中 string-grouper 的匹配或改善 rapidfuzz 所花费的时间?有更快的迭代方法吗?或者有什么其他方法可以解决问题?
数据经过预处理,包含大写字母中的所有字符串,没有特殊字符或数字。
每次迭代花费的时间约为 1 秒。这里是 rapidfuzz 的代码:
from rapidfuzz import process, utils, fuzz
for index,rows in df.iterrows()
list.append(process.extract(rows['names'],df['names'],scorer=fuzz.partial_token_set_ratio,score_cutoff=80))
超快速解决方案,这里是string-grouper的代码:
from string_grouper import match_strings
matches=match_strings(df.['names'])
这里讨论了一些与fuzzywuzzy类似的问题:(Fuzzy string matching in Python)
一般来说,还有其他我可以转向的编程语言,比如 R 可以加快这个速度吗?只是好奇... 谢谢你的帮助????
【问题讨论】:
-
由于您的数据已经过预处理,您不应再在 rapidfuzz 中执行此操作。您可以通过将
processor=None传递给process.extract来停用此功能。
标签: python performance string-matching tf-idf fuzzywuzzy