【发布时间】:2016-06-21 19:35:55
【问题描述】:
我想计算文本文件中所有单词的频率。
>>> countInFile('test.txt')
如果目标文本文件是这样的,应该返回{'aaa':1, 'bbb': 2, 'ccc':1}:
# test.txt
aaa bbb ccc
bbb
我在some posts 之后用纯python 实现了它。但是,我发现纯 python 方式由于文件大小(> 1GB)而不足。
我认为借用sklearn的力量是一个候选。
如果你让 CountVectorizer 计算每一行的频率,我猜你会通过对每一列求和来获得词频。但是,这听起来有点间接。
用python计算文件中单词的最有效和最直接的方法是什么?
更新
我的(非常慢的)代码在这里:
from collections import Counter
def get_term_frequency_in_file(source_file_path):
wordcount = {}
with open(source_file_path) as f:
for line in f:
line = line.lower().translate(None, string.punctuation)
this_wordcount = Counter(line.split())
wordcount = add_merge_two_dict(wordcount, this_wordcount)
return wordcount
def add_merge_two_dict(x, y):
return { k: x.get(k, 0) + y.get(k, 0) for k in set(x) | set(y) }
【问题讨论】:
-
在python中拆分单词将不得不为list分配内存并创建很多str对象,还要创建字典,python哈希不是很快。为了获得最佳性能,您可以编写 C 扩展,在不复制内存的情况下查找单词边界,然后使用最快的哈希对其进行计数,完成后,创建 python dict。
-
您是在匹配某些单词,还是在尝试计算每个唯一的“单词”。您希望在 1 GB 大小的文件中找到多少个唯一词?另外,这些线路平均有多长?
-
您可能无法通过切换到 C 或某些模块来改善 那 太多的执行时间(对 950M 数据集的基本 Python 测试需要我 25 秒,这不是这么慢)。问题在于它将所有单词都存储在内存中(因此您至少需要 1G 的空闲内存)。如果您的数据限制为 1G,那可能没问题。使用 SQLite/MySQL 之类的东西可以解决内存问题,但需要磁盘访问速度要慢得多;那么你在寻找什么“效率”?内存效率? CPU 高效?磁盘效率?省时吗?
标签: python nlp scikit-learn word-count frequency-distribution