首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TF-IDF和余弦相似度模糊匹配不够精确

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

Stack Overflow用户
提问于 2020-11-11 03:42:37
回答 3查看 1.4K关注 0票数 1

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

为了提高我的时间,我尝试了Fuzzywuzzy库,它将时间减少到大约12个小时,给出的输出与受answer here启发的rapidfuzz相同。后来,我尝试了tf-idf和余弦相似度,使用受此blog启发的string-grouper库,它提供了一些奇妙的时间改进。仔细研究结果,字符串分组方法错过了像“DARTH VADER”和“VADER”这样的匹配,而这些匹配被fuzzywuzzy和rapidfuzz捕获。这是可以理解的,因为TF-IDF的工作方式,它似乎完全遗漏了小字符串。在这个例子中,有没有解决办法来改善字符串-grouper的匹配,或者改善rapidfuzz所花费的时间?有没有更快的迭代方法?还有没有其他方法来解决这个问题呢?

数据经过预处理,包含所有不带特殊字符或数字的大写字符串。

每次迭代所需的时间约为1秒。以下是rapidfuzz的代码:

代码语言:javascript
复制
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的代码:

代码语言:javascript
复制
from string_grouper import match_strings
matches=match_strings(df.['names'])

这里讨论了一些与fuzzywuzzy类似的问题:(Fuzzy string matching in Python)

另外,一般来说,有没有其他编程语言可以让我转而使用,比如R,它可能会加速这一过程?只是好奇..。谢谢你的帮助?

EN

回答 3

Stack Overflow用户

发布于 2020-11-25 19:10:20

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

票数 1
EN

Stack Overflow用户

发布于 2021-02-21 03:22:41

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

票数 1
EN

Stack Overflow用户

发布于 2021-01-19 04:01:01

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64775714

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档