繁体   English   中英

计算嵌套列表中的唯一元组

[英]Count unique tuples in nested list

我有一个2D数组,其中每个元素都是一对两个标记,例如[“ 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

这不起作用,因为它不接受两个参数。 所以我想知道是否有一种简单的方法来检查字典是否已经存在作为2D数组的键,如果存在,则将值增加1。

考虑到与列表不同,元组是可哈希的 ,因此您需要展平列表。 一个简单的选项是使用itertools.chain ,然后使用元组列表构建一个Counter

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

输出量

Counter({('<s>', 'NOUN'): 1, ('CCONJ', 'NOUN'): 1, 
         ('NOUN', 'SCONJ'): 1, ('SCONJ', 'NOUN'): 1})

您可以使用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())

您使用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

然后就可以了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM