繁体   English   中英

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

[英]Fuzzy matching not accurate enough with TF-IDF and cosine similarity

我想在一长串字符串中找到相似之处。 也就是说,对于列表中的每个字符串,我都需要同一个列表中的所有相似字符串。 早些时候,我使用Fuzzywuzzy ,它通过使用fuzzy.partial_token_sort_ratio 为我想要的结果提供了良好的准确性。 唯一的问题是它花费的时间,因为列表包含大约 50k 个条目,最多 40 个字符串。 50k 字符串花费的时间长达 36 小时。

为了改善我的时间,我尝试了Rapidfuzz库,该库将时间减少到 12 小时左右,提供与 Fuzzywuzzy 相同的输出,灵感来自这里的答案。 后来我尝试了 tf-idf 和余弦相似度,它们使用受此博客启发的string-grouper库提供了一些奇妙的时间改进。 仔细研究结果,string-grouper 方法错过了像 'DARTH VADER' 和 'VADER' 这样的匹配项,这些匹配项被模糊模糊和快速模糊捕获。 这可以理解,因为 TF-IDF 的工作方式,它似乎完全错过了小字符串。 是否有任何解决方法可以改善此示例中 string-grouper 的匹配或改善 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'])

这里讨论了一些与fuzzywuzzy 类似的问题:( Python 中的模糊字符串匹配

此外,一般来说,是否有任何其他编程语言可以转换,例如 R 可以加快速度? 只是好奇...谢谢你的帮助😊

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM