Python 查找列表中标记关系的频率(成对关联?)

Python 查找列表中标记关系的频率(成对关联?),python,list,combinations,counter,data-analysis,Python,List,Combinations,Counter,Data Analysis,我有一些图像标签列表。我想找出哪些标签似乎是相关的: l1 = ["cat", "toe", "man"] l2 = ["cat", "toe", "ice"] l3 = ["cat", "hat", "bed"] 在这个(简单的)例子中,“猫”和“脚趾”显然是相关的,因为它们出现了两次(l1,l2) 如何计算?结果是:猫和脚趾:2。我有一个线索,我要求“两两相关”,但这种分析的资源对我来说太复杂了。你可以使用集合。defaultdict与frozenset和itertools。组合形成一个两

我有一些图像标签列表。我想找出哪些标签似乎是相关的:

l1 = ["cat", "toe", "man"]
l2 = ["cat", "toe", "ice"]
l3 = ["cat", "hat", "bed"]
在这个(简单的)例子中,“猫”和“脚趾”显然是相关的,因为它们出现了两次(l1,l2)


如何计算?结果是:猫和脚趾:2。我有一个线索,我要求“两两相关”,但这种分析的资源对我来说太复杂了。

你可以使用
集合。defaultdict
frozenset
itertools。组合
形成一个两两计数字典

变化是可能的。例如,您可以将
collections.Counter
与排序的
tuple
一起使用,但基本相同

from collections import defaultdict
from itertools import combinations

dd = defaultdict(int)

L1 = ["cat", "toe", "man"]
L2 = ["cat", "toe", "ice"]
L3 = ["cat", "hat", "bed"]

for L in [L1, L2, L3]:
    for pair in map(frozenset, (combinations(L, 2))):
        dd[pair] += 1
结果:

defaultdict(int,
            {frozenset({'cat', 'toe'}): 2,
             frozenset({'cat', 'man'}): 1,
             frozenset({'man', 'toe'}): 1,
             frozenset({'cat', 'ice'}): 1,
             frozenset({'ice', 'toe'}): 1,
             frozenset({'cat', 'hat'}): 1,
             frozenset({'bed', 'cat'}): 1,
             frozenset({'bed', 'hat'}): 1})

另一个选项是创建一个DataFrame,其中每个唯一单词都有一个指示符变量作为列:

from itertools import chain
all_tags = set(chain.from_iterable([l1, l2, l3]))
d = pd.DataFrame([{k: 1 if k in l else 0 for k in all_tags} for l in [l1, l2, l3]])
print(d)
#   bed  cat  hat  ice  man  toe
#0    0    1    0    0    1    1
#1    0    1    0    1    0    1
#2    1    1    1    0    0    0
现在,您可以将该矩阵转置,并将其自身点入,以获得成对计数:

pairwise_counts = d.T.dot(d)
print(pairwise_counts)
#     bed  cat  hat  ice  man  toe
#bed    1    1    1    0    0    0
#cat    1    3    1    1    1    2
#hat    1    1    1    0    0    0
#ice    0    1    0    1    0    1
#man    0    1    0    0    1    1
#toe    0    2    0    1    1    2
该矩阵的对角线是每个单词在数据中出现的次数

如果需要任意两个字符串的成对计数,例如
“cat”
和“
toe
”,可以执行以下操作:

print(pairwise_counts.loc["cat", "toe"])
#2
由于该矩阵是对称的,您将得到相同的答案:

print(pairwise_counts.loc["toe", "cat"])
#2

谢谢我可以用组合(L,3)将其升级为三元组!太酷了。不用冷冻可以吗?对于l4中的i,
l=[list(组合(i,2))
l4
作为3个列表的列表,您需要哈希键,列表将无法工作。正如我所提到的,您可以使用
tuple
[如果已排序],而不是
frozenset
。还有一件事,可以对增量进行直接计数吗count@vash_the_stampede,所以不是一个论坛。如果你有,我建议你。谢谢,看起来也不错!它是否也适用于三元组等?(我知道,我没有要求。)@j_uuuuur_uuuuu不,这只是成对的。您可能需要研究称为频繁项集或关联规则学习的内容