具有TF-IDF和余弦相似度的模糊匹配不够准确

时间:2020-11-10 19:42:36

标签: python performance string-matching tf-idf fuzzywuzzy

我想在一长串字符串中找到相似之处。也就是说,对于列表中的每个字符串,我都需要在同一列表中使用所有相似的字符串。之前我使用过Fuzzywuzzy,通过使用Fuzzy.partial_token_sort_ratio可以提供很好的精度。唯一的问题是列表包含约50k条目(最多40个字符串)以来花费的时间。 50k字符串花费的时间长达36小时。

为改善我的时间,我尝试了rapidfuzz库,该库将时间减少到了12小时左右,得到了与答案here启发的Fuzzywuzzy相同的输出。后来,我尝试了tf-idf和余弦相似度,使用了受此string-grouper启发的blog库,从而在时间上有了一些改进。仔细研究结果,字符串分组器方法错过了诸如“ DARTH VADER”和“ VADER”之类的匹配项,这些匹配项被模糊模糊和快速模糊捕获。可以理解这是因为TF-IDF的工作方式,并且似乎完全错过了小字符串。 在此示例中,是否有任何变通办法来改善字符串分组器的匹配或缩短Rapidfuzz花费的时间?有更快的迭代方法吗?或通过其他任何方法使问题解决?

数据经过预处理,并且包含CAPS中的所有字符串,而没有特殊字符或数字。

每次迭代花费的时间约为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'])

此处讨论了一些模糊不清的类似问题:(Fuzzy string matching in Python

总的来说,还有其他我可以使用的编程语言,例如R可以加快编程速度吗?只是好奇... 谢谢您的帮助?

3 个答案:

答案 0 :(得分:0)

您应该尝试tfidf-matcher,它不适用于我的特定用例,但可能很适合您。

答案 1 :(得分:0)

可以在string-grouper的min_similarity函数中用ngram_size改变最小相似度,用match_strings改变n-gram的大小。对于特定示例,您可以使用更高的 ngram_size,但这可能会导致您再次错过其他点击。

答案 2 :(得分:-1)

tfidf 匹配器对我来说非常有用。没有麻烦,只需调用一个函数 + 您可以设置要将单词拆分为多少个 ngram,以及您想要的接近匹配的数量 + 匹配中的置信度值。它也足够快:在大约 23 万字的数据集中查找一个字符串最多需要大约 3 秒。