Подсчет уникальных кортежей во вложенном списке - PullRequest
1 голос
/ 29 марта 2019

У меня есть двумерный массив, в котором каждый элемент представляет собой пару из двух тегов, например ["NOUN", "VERB"], и я хочу подсчитать, сколько раз каждая из этих уникальных пар встречается в большом наборе данных.

До сих пор я пытался использовать defaultdict (int) и Counter (), чтобы просто добавить элемент, если ранее не был найден или, если найден, увеличить значение на 1.

dTransition = Counter()
# dTransition = defaultdict(int)

# <s> is a start of sentence tag
pairs = [[('<s>', 'NOUN')], [('CCONJ', 'NOUN')], [('NOUN', 'SCONJ')], [('SCONJ', 'NOUN')]]

for pair in pairs:
      dTransition[pairs] += 1

Это не работает, так как не принимает два аргумента. Поэтому мне интересно, есть ли простой способ проверить словарь, если ключ, который является двумерным массивом, уже существует, и если это так, увеличить значение на 1.

Ответы [ 3 ]

4 голосов
/ 29 марта 2019

Вы должны сгладить свой список, учитывая, что в отличие от списков, кортежи могут быть хэшируемыми .Простой вариант - использовать itertools.chain, а затем создать Counter со списком кортежей:

from itertools import chain
Counter(chain(*pairs))

Output

Counter({('<s>', 'NOUN'): 1, ('CCONJ', 'NOUN'): 1, 
         ('NOUN', 'SCONJ'): 1, ('SCONJ', 'NOUN'): 1})
1 голос
/ 29 марта 2019

Вы можете использовать массив numpy, чтобы сделать это с уже встроенной функцией.

import numpy as np

#convert array to numpy array
pairs= np.array(pairs)

#pairs.unique() returns an array with only the unique elements
#len() returns the length(count) of unique pairs
count= len(pairs.unique())
0 голосов
/ 29 марта 2019

Ваше решение с defaultdict было правильным, но вы должны вставить два значения в качестве кортежа для ключа словаря.В вашем примере кортеж всегда является первым элементом списков:

import collections 
dTransition = collections.defaultdict(int)

# <s> is a start of sentence tag
pairs = [[('<s>', 'NOUN')], [('CCONJ', 'NOUN')], [('NOUN', 'SCONJ')], [('SCONJ', 'NOUN')],[('SCONJ', 'NOUN')]]

for pair in pairs:
      dTransition[pair[0]] += 1

Тогда он работает

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...