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不,这只是成对的。您可能需要研究称为频繁项集或关联规则学习的内容