python - 使用 python 和 Counters 计算一个单词在文本中出现的次数
问题描述
我有一本字典和一个包含大量文本的文件(IMDB 评论)。我正在尝试用它看到一个单词的次数来更新字典。我可以让它计算文本文件中有多少个字母,但我需要字典来计算单词。这是我当前的代码:
import glob
import codecs
word_counts = Counter() # I require this
for label in [POS_LABEL, NEG_LABEL]:
for directory in [TRAIN_DIR, TEST_DIR]:
for fn in glob.glob(directory + "/" + label + "/*txt"):
doc = codecs.open(fn, 'r', 'utf8') # Open the file with UTF-8 encoding
k = doc.read().split()
print(k)
print(word_counts)
这是结果:
Counter({' ': 11507297, 'e': 6036511, 't': 4565527, 'a': 3979283, 'o': 3754514, 'i': 3654084, 's': 3342252, 'n': 3321375, 'r': 3003149, 'h': 2701649, 'l': 2194831, 'd': 1715235, 'c': 1351529, 'u': 1345564, 'm': 1317735, 'f': 1085018, 'y': 1031725, 'g': 1016124, 'w': 936183, 'b': 929635, 'p': 824208, '.': 650520, 'v': 617921, ',': 544818, 'k': 414662, 'I': 264480, "'": 263760, 'T': 220030, '/': 215720, '>': 202250, '<': 202094, '-': 132038, '"': 131858, 'A': 129582, 'S': 119546, 'B': 89001, 'x': 84005, 'M': 83700, 'H': 79548, 'C': 77492, 'D': 76272, 'j': 74962, ')': 71268, 'W': 70424, '(': 69585, 'E': 62149, 'R': 59387, 'L': 55859, 'O': 54998, 'N': 51707, 'P': 49662, '!': 49164, 'F': 47474, 'G': 47367, 'J': 41145, 'z': 40445, '0': 37357, 'q': 37098, '1': 35792, '?': 32338, 'V': 29518, 'K': 28837, 'Y': 21969, ':': 19800, '9': 19392, 'U': 17488, '2': 15978, '*': 13916, ';': 13375, '3': 11002, '5': 10457, '8': 8874, '4': 8342, '7': 8277, '&': 7714, '6': 6209, 'Z': 4490, 'é': 3337, 'Q': 2842, '\x96': 2529, 'X': 1957, '`': 1861, '$': 1617, '\x85': 1479, '_': 997, '%': 867, '+': 642, '#': 640, '=': 623, '\x97': 596, '´': 434, ']': 254, '’': 254, '[': 239, '~': 230, 'á': 208, '{': 192, '}': 192, '@': 181, 'è': 169, 'ö': 160, '–': 149, 'ó': 126, '\x91': 121, '£': 117, 'ü': 106, '\t': 106, 'í': 100, '^': 95, 'ä': 91, 'ç': 82, 'à': 80, 'ñ': 78, 'ô': 66, '¨': 64, 'ï': 58, '“': 57, '”': 55, '»': 55, '«': 53, 'ã': 48, 'â': 45, '|': 45, '\xa0': 44, '¡': 43, '½': 39, 'å': 36, 'ê': 36, '\\': 35, 'ë': 32, '\x84': 31, '·': 29, 'ú': 23, 'ý': 22, 'ø': 19, '\x8e': 18, '\x9e': 18, '‘': 18, '\x95': 17, '…': 16, '¦': 14, '§': 13, 'É': 10, 'ß': 10, 'î': 9, '\x80': 8, 'ð': 8, 'Æ': 8, 'Õ': 7, '\uf0b7': 7, 'Á': 6, 'ì': 6, 'æ': 6, 'Ü': 6, 'û': 6, 'ù': 6, 'ò': 5, '\xad': 5, 'Ö': 5, '、': 5, '\x08': 4, '°': 4, '®': 4, 'ō': 4, '¾': 4, 'Ã': 3, '¿': 3, 'À': 3, 'Å': 3, 'Ó': 3, '\x8d': 3, '¤': 2, 'Ê': 2, '₤': 2, 'Ä': 2, 'È': 2, 'Þ': 2, ',': 2, '¢': 2, 'º': 2, '▼': 2, '★': 2, '³': 1, '\x9a': 1, 'Ø': 1, 'Ï': 1, 'Â': 1, 'Ç': 1, 'Ð': 1, 'ı': 1, 'ğ': 1, '″': 1, '©': 1, 'ª': 1, '\x10': 1, 'Ż': 1, 'י': 1, 'ג': 1, 'א': 1, 'ל': 1, 'כ': 1, 'ר': 1, 'מ': 1, 'ו': 1, 'ן': 1, 'õ': 1})
忘了提我也尝试过这样的事情:
k = doc.read().split()
word_counts.update(k)
在第三个 for 循环内。
有人告诉我我的方向是正确的:
if word_counts["movie"] == 61492
更新:
for label in [POS_LABEL, NEG_LABEL]:
for directory in [TRAIN_DIR, TEST_DIR]:
for fn in glob.glob(directory + "/" + label + "/*txt"):
doc = codecs.open(fn, 'r', 'utf8') # Open the file with UTF-8 encoding
k = doc.read().split()
word_counts.update(k)
print(word_counts["movie"])
这就是我现在的位置。这会打印“电影”60762,所以我有点困惑我是如何缺少 61492。
解决方案
我想你快到了。我还会去除单词两边的标点符号并将单词转换为小写。所以“电影”和“电影”是等价的。
尝试这个:
import string
from collections import Counter
word_counts = Counter()
for label in [POS_LABEL, NEG_LABEL]:
for directory in [TRAIN_DIR, TEST_DIR]:
for fn in glob.glob(directory + "/" + label + "/*txt"):
doc = codecs.open(fn, 'r', 'utf8') # Open the file with UTF-8 encoding
k = [word.strip(string.punctuation) for word in doc.read().split()]
word_counts.update(k)
doc.close() #remember to close the file
推荐阅读
- database-design - The right way to model multiple FACTs schema
- php - nginx 容器正在从主机运行 php
- php - ORO CRM:Composer 安装失败的迁移
- python - 获取 AttributeError: module 'scrapy.utils.response' has no attribute 'css' 的代码可能是什么问题?
- timestamp - 使用 PDFBox 为 PDF 签名添加时间戳时包括时间戳权限
- html - Bulma,如何更改整个站点中类的默认媒体查询
- php - 在 HTML 中使用 PHP 文件变量加载 WAV 音频文件
- reactjs - React Router - 嵌套路由,在子应用程序中隐藏父组件
- reactjs - 无法安装反应应用程序“UnhandledPromiseRejectionWarning:错误:EBUSY:资源繁忙或锁定”
- javascript - 多个下拉框?