提取文档的内容,返回每个单词处出现的次数

Posted 36zy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了提取文档的内容,返回每个单词处出现的次数相关的知识,希望对你有一定的参考价值。

#统计文档中每个字出现的次数
word_count=

with open("D:\\Desktop\\wde.txt")as fin:#打开文档
    for line in fin :#提取文档的内容
        line=line[:-1]#去掉最后的换行符
        w=line.split()#单词之间是空格
        for word in w:#提取文档内容
            if word not in word_count:#如果没有见过计0
                word_count[word]=0
            word_count[word] +=1#已经计过的加1
w_sort = sorted(
    word_count.items(),#返回一个列表,将每个键值对分开,键与值之间用逗号分割
    key=lambda x: x[1],
    reverse=True
)[:10]#只返回成绩排前10的数据

print(w_sort)#[(\'and\', 11), (\'is\', 9), (\'face\', 4), (\'can\', 4),
print(word_count.items())#dict_items([(\'Everybody\', 1), (\'has\', 1), (\'to\', 3), (\'face\', 4), (\'bad\', 3),
print(word_count)#\'Everybody\': 1, \'has\': 1, \'to\': 3, \'face\': 4, \'bad\': 3, \'days\': 3, 

如何使用字典理解计算文档中每个单词的出现次数

【中文标题】如何使用字典理解计算文档中每个单词的出现次数【英文标题】:How can i count occurrence of each word in document using Dictionary comprehension 【发布时间】:2016-01-05 11:52:28 【问题描述】:

我在 python 中有一个列表列表,里面充满了文本。这就像从每个文档中设置单词。因此,对于每个文档,我都有一个列表,然后是所有文档的列表。

所有列表只包含唯一的单词。 我的目的是计算完整文档中每个单词的出现次数。我可以使用以下代码成功地做到这一点:

for x in texts_list:
    for l in x:
        if l in term_appearance:
            term_appearance[l] += 1
        else:
            term_appearance[l] = 1

但我想使用字典理解来做同样的事情。这是第一次,我正在尝试编写字典理解并使用 *** 中以前的现有帖子,我已经能够编写以下内容:

from collections import defaultdict
term_appearance = defaultdict(int)

term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x for x in texts_list

上一篇供参考:

Simple syntax error in Python if else dict comprehension

按照上面帖子的建议,我还使用了以下代码:

l : term_appearance[l] + 1 if l else 1 for l in x for x in texts_list

上面的代码成功生成了空列表,但最终抛出了以下回溯:

[]

[]

[]

[]

Traceback (most recent call last):

  File "term_count_fltr.py", line 28, in <module>

    l : term_appearance[l] + 1 if l else 1 for l in x for x in texts_list
  File "term_count_fltr.py", line 28, in <setcomp>

    l : term_appearance[l] + 1 if l else 1 for l in x for x in texts_list

TypeError: unhashable type: 'dict'

如果能帮助我提高当前的理解,我们将不胜感激。

看了上面的错误,我也试过了

[l : term_appearance[l] + 1 if l else 1 for l in x for x in texts_list]

运行没有任何错误,但输出仅为空列表。

【问题讨论】:

祝你好运...这是一个想法,默认字典将默认为零,这意味着您可能不需要 if-else 部分。 【参考方案1】:

就像其他答案中所解释的那样,问题在于字典理解创建了一个新字典,因此在创建新字典之前您不会引用它。你不能对你正在做的事情进行字典理解。

鉴于此,您正在做的是尝试重新实现 collections.Counter 已经完成的工作。您可以简单地使用 Counter 。示例 -

from collections import Counter
term_appearance = Counter()
for x in texts_list:
    term_appearance.update(x)

演示 -

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]]
>>> from collections import Counter
>>> term_appearance = Counter()
>>> for x in l:
...     term_appearance.update(x)
...
>>> term_appearance
Counter(1: 4, 2: 3, 3: 3, 4: 1, 5: 1)

如果你真的想在某种理解上做到这一点,你可以这样做:

from collections import Counter
term_appearance = Counter()
[term_appearance.update(x) for x in texts_list]

演示 -

>>> l = [[1,2,3],[2,3,1],[5,4,2],[1,1,3]]
>>> from collections import Counter
>>> term_appearance = Counter()
>>> [term_appearance.update(x) for x in l]
[None, None, None, None]
>>> term_appearance
Counter(1: 4, 2: 3, 3: 3, 4: 1, 5: 1)

[None, None, None, None] 的输出来自生成该列表的列表推导(因为这是交互式运行的),如果您在脚本中以 python &lt;script&gt; 运行它,则该输出将被丢弃。


您还可以使用itertools.chain.from_iterable() 从您的 text_lists 创建一个扁平列表,然后将其用于 Counter。示例:

from collections import Counter
from itertools import chain
term_appearance = Counter(chain.from_iterable(texts_list))

演示 -

>>> from collections import Counter
>>> from itertools import chain
>>> term_appearance = Counter(chain.from_iterable(l))
>>> term_appearance
Counter(1: 4, 2: 3, 3: 3, 4: 1, 5: 1)

另外,原始代码中的另一个问题 -

term_appearance[l] : term_appearance[l] + 1 if l else term_appearance[l] : 1 for l in x for x in texts_list

这实际上是一个集合推导,其中嵌套了一个字典推导。

这就是您收到错误的原因 - TypeError: unhashable type: 'dict' 。因为在第一次运行字典理解并创建 dict 之后,它试图将其添加到 set 中。但是字典不是可散列的,因此会出错。

【讨论】:

【参考方案2】:

您收到不可散列类型错误的原因是您不能将字典用作 Python 中另一个字典的键,因为它们是可变容器。

见:why dict objects are unhashable in python?

【讨论】:

【参考方案3】:

Python 2.7+ 中的字典推导式并不像您认为的那样工作。

与列表推导一样,它们创建了一个字典,但您不能使用它们将键添加到已经 现有字典(其中在这种情况下是你想要做的)。

【讨论】:

【参考方案4】:

如果您想使用collections.Counter,请通过Anand S Kumar 浏览answer,这是一个很好的建议。但是,还有另一个与使用 collections.defaultdict 相关的解决方案,我觉得值得一提:

from collections import defaultdict

text_appearances = defaultdict()

for x in texts_lists:
    for l in x:
        text_appearances[l] += 1

我已经使用过这种构造数次了,我认为这是一种干净且不错的计数方式。特别是如果您出于某种原因需要在循环之间进行一些验证,这是一种直接更新计数的有效方法,而无需担心您的字典中是否已经存在关键字/单词(就像在您的第一个解决方案中一样)。

关于变量命名的旁注:请不要使用小写的lL的小写)作为变量名,与1(第一名)很难区分.在您的情况下,也许您可​​以将变量命名为wordsword?加上不使用_list作为后缀,代码可以这样写:

for words in texts:
    for word in words:
        text_appearance[word] += 1

【讨论】:

以上是关于提取文档的内容,返回每个单词处出现的次数的主要内容,如果未能解决你的问题,请参考以下文章

12 solr

统计一篇英文文章内每个单词出现频率,并返回出现频率最高的前10个单词及其出现次数

vim怎么正则查询一个词出现的次数

Linux下统计文档中每个字符出现的次数

打印文件中每个单词的出现次数[关闭]

如何提取 MySQL 字符串中的第 n 个单词并计算单词出现次数?