【问题标题】:sum the count of duplicate in a nested list of tuples对嵌套的元组列表中的重复计数求和
【发布时间】:2021-02-23 15:13:58
【问题描述】:

我有一个如下所示的元组列表:

[(('review', 'shop', 'draw'), 35),
 (('shop', 'drawing', 'review'), 32),
 (('field', 'review', 'report'), 24),
 (('review', 'shop', 'drawing'), 20),
 (('shop', 'drawing', 'return'), 20),
 (('shop', 'draw', 'review'), 18),
 (('site', 'review', 'report'), 17),
 (('respond', 'rfi', 'regard'), 15),
 (('review', 'fire', 'alarm'), 11),
 (('review', 'lighting', 'shop'), 10)]

我想将那些相似的元素与它们的计数一起合并:

from nltk.stem import PorterStemmer

for elm in trigram_counts:
    ngrams = list(elm[0])
    stemmed_ngrams = []
    for gram in ngrams:
        stemmed_ngrams.append(porter.stem(gram))
        
    print(stemmed_ngrams, elm[1])
    

这给出了这样的东西:

['review', 'shop', 'draw'] 35
['shop', 'draw', 'review'] 32
['field', 'review', 'report'] 24
['review', 'shop', 'draw'] 20
['shop', 'draw', 'return'] 20
['shop', 'draw', 'review'] 18
['site', 'review', 'report'] 17
['respond', 'rfi', 'regard'] 15
['review', 'fire', 'alarm'] 11
['review', 'light', 'shop'] 10

我的目标是将 ['review', 'shop', 'draw']['shop', 'draw', 'review'] 与它们对应的总和合并为 67

我认为我通过循环遍历所有元素使我的解决方案变得复杂。

【问题讨论】:

  • trigram_counts 是保存您的元组列表的变量吗?
  • 相似的标准是什么?元组包含相同的(三个)字符串,并且顺序无关紧要?如果一个元组是('review', 'shop', 'draw', 'fire') 而另一个元组是('review', 'shop', 'draw') 怎么办;这些相似吗?
  • 我会使用以set(inner_tuple) 为关键字的字典。
  • 不是添加到list,而是添加到set。然后将集合转换为tuple,使用tuple 作为dict 的键,其值是您想要该集合的总和的总和
  • 您可以对元组进行排序以比较它们是否相等。

标签: python nested tuples


【解决方案1】:

由于您想组合来自相似词干三元组的计数,您可以使用带有 frozensets 作为键的字典:键将是词干三元组,值将是总计数。

您必须使用 freezesets 而不是集合作为键,因为 dict 的键必须是可散列的(集合不是这种情况)。

你会得到这样的东西:

from collections import defaultdict
from nltk.stem import PorterStemmer

stemmed_trigram_counts = defaultdict(int) # use defaultdict to avoid to have to check if the key exist
porter = PorterStemmer()

for trigram, count in trigram_counts:
   stemmed_trigram = frozenset(porter.stem(word) for word in trigram)
   stemmed_trigram_counts[stemmed_trigram] += count

print(stemmed_trigram_counts)

这将为您提供以下输出:

{
   frozenset({'draw', 'review', 'shop'}): 105,
   frozenset({'field', 'report', 'review'}): 24,
   frozenset({'draw', 'return', 'shop'}): 20,
   frozenset({'report', 'review', 'site'}): 17,
   frozenset({'regard', 'respond', 'rfi'}): 15,
   frozenset({'alarm', 'fire', 'review'}): 11,
   frozenset({'light', 'review', 'shop'}): 10
}

备注:如果顺序很重要,你应该使用元组而不是冻结集

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-10-06
    • 2021-04-29
    • 2021-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多