计算每个术语出现的文档数

Counting number of document in which each term appears

我有一个包含 5 个文档的文档列表,存储在树中的每个节点。在每个列表中都有一些出现的单词可能会在同一文档以及其他文档中重复多次。我想计算每个单词出现的文档数量。 例如:A是父节点,B、C是子节点。 A,B,C 有 5 个文档。

A=[['a','b'],['a','a'],['c','d'],['a','c'],['d','e']]

我想要 {'a':3,'b':1,'c':2,'d':2,'e':1}

形式的结果

下面是我正在使用的代码,但它没有计算每个文档的数量,而是计算每个单词在文档中出现的次数。

def get_count(node):
    word_count_dict = defaultdict(int)
    next_node=[]
    for i in range(len(node.documents)):
        for words in node.documents[i]:
            word_count_dict[words] +=1
        node.word_count = word_count_dict
    for child in node.children:
        next_node.append(child)
    if next_node:
        for nn in next_node:
            get_count(nn)
    return word_count_dict

get_count(A)

请帮助如何做到这一点。

有 in-built 个软件包。但是应该有一个简单的方法。

from itertools import chain
from collections import Counter
dict(Counter(chain.from_iterable(set(l) for l in A)))
#{'a': 3, 'b': 1, 'c': 2, 'd': 2, 'e': 1}

您对子项调用 get_count,但不分配结果或对它做任何事情

据我了解,setCounter 才是您真正需要的。

假设 node.documentsnode.children 是可迭代的(它们应该是)这可以工作

from collections import Counter
from itertools import chain

def get_count(node):

    words_per_document = map(set, node.documents)
    word_count = Counter(chain.from_iterable(words_per_document))
    for child in node.children:
        word_count += get_count(child)

    return word_count

我看不出有什么理由set-up排队