2 回答

TA貢獻(xiàn)1772條經(jīng)驗(yàn) 獲得超5個(gè)贊
您可以使用collections.defaultdictwithfrozenset和itertools.combinations來(lái)形成成對(duì)計(jì)數(shù)的字典。
變化是可能的。例如,您可以使用collections.Counterwith sortedtuple來(lái)代替,但基本上是相同的想法。
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
結(jié)果:
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})

TA貢獻(xiàn)1820條經(jīng)驗(yàn) 獲得超10個(gè)贊
另一種選擇是創(chuàng)建一個(gè) DataFrame,其中每個(gè)唯一單詞的指標(biāo)變量作為列:
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
現(xiàn)在您可以轉(zhuǎn)置這個(gè)矩陣并將其與自身點(diǎn)在一起以獲得成對(duì)計(jì)數(shù):
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
該矩陣的對(duì)角線是每個(gè)單詞在您的數(shù)據(jù)中出現(xiàn)的次數(shù)。
如果您想要任何兩個(gè)字符串的成對(duì)計(jì)數(shù),例如"cat"和“ toe”,您可以執(zhí)行以下操作:
print(pairwise_counts.loc["cat", "toe"])
#2
由于這個(gè)矩陣是對(duì)稱的,你會(huì)得到相同的答案:
print(pairwise_counts.loc["toe", "cat"])
#2
添加回答
舉報(bào)