gpt4 book ai didi

python - 如何计算包含特定单词的文档?

转载 作者:行者123 更新时间:2023-11-28 19:55:53 24 4
gpt4 key购买 nike

假设我有一个这样的字典:

docDict = {"alpha": ["a", "b", "c", "a", "b"], "bravo": ["b", "c", "d", "c", "d"]}

我想做的是计算“文档频率”:假设每个词典项目都是一个文档,并且我有一个特定的词,那么有多少文档包含该词?

我看过很多帖子告诉我如何计算频率,但这里如果 "a" 在文档 "alpha" 中出现两次,我只需要计数为1。所以"a"的"频率"应该是1,"c"应该是2。

我知道我可以遍历整个文档字典,并在文档中找到单词时添加计数器。或者我可以先让每个文档中的单词唯一,然后合并所有文档并统计单词。

但我认为有更好的方法,更有效的方法。有什么想法吗?

顺便说一句,有什么办法可以保留字典的结构吗?在这个例子中,我想得到 {"alpha": {'c': 2, 'b': 2, 'a': 1}, "bravo": {'c': 2, 'b': 2, 'd': 1}

更新

如果这里我只有一个列表(类似于 [["a", "b", "c", "a", "b"], ["b", "c", "d ", "c", "d"]]), 我怎样才能得到像 [[1, 2, 2, 0], [0, 2, 2, 1]]< 这样的结果列表.

我不知道。重点是展开每个列表并确保术语的顺序。想法?

最佳答案

我会用你的第二种方式使用 collections.Counterset .

>>> from collections import Counter
>>> sum((Counter(set(x)) for x in docDict.itervalues()), Counter())
Counter({'c': 2, 'b': 2, 'a': 1, 'd': 1})

更新 1:

>>> c = sum((Counter(set(x)) for x in docDict.itervalues()), Counter())
>>> {k: {k1:c[k1] for k1 in set(v)} for k, v in docDict.iteritems()}
{'alpha': {'a': 1, 'c': 2, 'b': 2}, 'bravo': {'c': 2, 'b': 2, 'd': 1}}

更新 2::

如果性能是一个问题,那么不要将 Countersum 一起使用,这是另一种方法。请注意,与@user2931409 的回答不同,我不会在内存中保留一组单词只是为了获得它们的长度,因此这比他们的答案更内存效率但略慢。

result = Counter()
for v in docDict.itervalues():
result.update(set(v))
return result

时序比较:

def func1():
#http://stackoverflow.com/a/22787509/846892
result = defaultdict(set)
for k, vlist in docDict.items():
for v in vlist:
result[v].add(k)
return dict(zip(result.keys(), map(lambda x:len(x), result.values())))

def func2():

result = Counter()
for v in docDict.itervalues():
result.update(set(v))
return result

In [94]: docDict = {''.join(random.choice(lis) for _ in xrange(8)): random.sample(lis, 25)
...: for _ in xrange(70000)}

In [95]: %timeit func1(docDict)
1 loops, best of 3: 380 ms per loop

In [96]: %timeit func2(docDict)
1 loops, best of 3: 591 ms per loop

In [97]: docDict = {''.join(random.choice(lis) for _ in xrange(8)): random.sample(lis, 25)
...: for _ in xrange(10**5)}

In [98]: %timeit func1(docDict)
1 loops, best of 3: 529 ms per loop

In [99]: %timeit func2(docDict)
1 loops, best of 3: 848 ms per loop

In [101]: func1(docDict) == func2(docDict)
Out[101]: True

关于python - 如何计算包含特定单词的文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22786020/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com