【问题标题】:Fuzzy matching not accurate enough with TF-IDF and cosine similarityTF-IDF 和余弦相似度的模糊匹配不够准确
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-20
        • 1970-01-01
        • 2017-02-03
        • 1970-01-01
        • 2013-02-03
        • 2017-09-05
        • 2013-10-16
        • 2019-05-18
        相关资源
        最近更新 更多