如何检查两个字符串列表的匹配百分比?

3

我是一个Python的初学者。这里我有一个比较两个列表的问题。我的第一个问题是列表不应该被完全比较。但它应该与另一个列表大约70%匹配,并且如果存在则返回true。在这种情况下,contains()方法无法帮助。这是我的列表:

TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-D"]

产生70%的目标列表是什么? - Lazyer
@Lazyer 目标列表是 totaltags,如果它包含了 likedtags 中的所有元素,则为 100%,但对我来说,70% 的元素就足够了。 - Siddharth
我还是不明白。你能带我们一起走一遍,解释一下你是怎么得到那个数字的吗? - okayatcp12
@okayatcp 不用了谢谢,但我已经得到答案了。 - Siddharth
4个回答

2

Sahil Desai在他的回答中提到的fuzzywuzzy库看起来非常简单。

这里有一个基本函数的想法。

TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow"]

print(len(set(TotalTags).intersection(set(LikedTags))) / len(TotalTags))  # 0.8333333
print(sum([True for x in TotalTags if x in LikedTags]) / len(TotalTags))  # 0.8333333

你的想法是最好的,因为我不需要第三方库。 - Siddharth

1

您可以使用fuzzywuzzy Python库。

from fuzzywuzzy import fuzz

TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-D"]


per = fuzz.ratio(TotalTags,LikedTags)
per

 65

如果您只想匹配项目,则可以使用Jaccard相似性方法。此方法直接匹配两个列表的字符。


这是内置的吗? - Siddharth
你需要从pip安装库。 - Sahil Desai

1
你可以使用 difflib.SequenceMatcher 来比较两个列表中每两个单词之间的相似度,如下所示:(仅输出相似度大于 70% 的两个单词)
from difflib import SequenceMatcher
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"]
LikedTags = ["citrus", "orange", "vitamin-D"]
for a in LikedTags:
    for b in TotalTags:
        sim = SequenceMatcher(None, a, b).ratio()
        if sim > 0.7:
            print(f'similarity of {a} & {b} : {sim}')

输出:

similarity of citrus & citrus : 1.0
similarity of orange & orange : 1.0
similarity of vitamin-D & vitamin-C : 0.8888888888888888
similarity of vitamin-D & vitamin-A : 0.8888888888888888

我感谢你的回答,但我不想使用第三方库。 - Siddharth
1
谢谢,我已经得到它了。 - Siddharth

1

你也可以使用内置的collections模块来实现类似的功能。

import collections
TotalTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow", "vitamin-A"] #etc
LikedTags = ["citrus", "orange", "vitamin-C", "sweet", "yellow"]
c = collections.Counter(TotalTags)
c.subtract(LinkedTags)
print(1-c.total()/len(TotalTags))

输出:

0.8333333333333334

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接