Найти частоту отношений тегов в списках (попарная корреляция?) - PullRequest
0 голосов
/ 26 сентября 2018

У меня есть несколько списков тегов для изображений.Я хочу выяснить, какие теги кажутся связанными:

l1 = ["cat", "toe", "man"]
l2 = ["cat", "toe", "ice"]
l3 = ["cat", "hat", "bed"]

В этом (простом) примере очевидно, что «кошка» и «палец ноги» кажутся связанными, потому что они появляются два раза (l1, l2).

Как это можно вычислить?С таким результатом, как: cat & toe: 2. У меня есть подсказка, о которой я прошу «парную корреляцию», но ресурсы для такого анализа слишком сложны для меня.

Ответы [ 2 ]

0 голосов
/ 26 сентября 2018

Другой вариант - создать 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
0 голосов
/ 26 сентября 2018

Вы можете использовать collections.defaultdict с frozenset и itertools.combinations для формирования словаря парных подсчетов.

Возможны варианты.Например, вы можете использовать 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})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...