如何在NLTK处理大型个人语料库时应用Multiprocessing提升效率
语料库词频统计优化方案
原代码核心问题
- 循环内重复计算:每新增一个文件就将此前所有文件的内容重新拼接、分词、统计词频,整体时间复杂度达到O(n²),这是耗时超长的核心原因,影响远大于未使用多进程
- 冗余操作:已经通过
corpus.words()拿到了分词结果,又额外转成字符串再重新执行word_tokenize,做了完全无用的重复计算
多进程优化后代码
import nltk from nltk.corpus import PlaintextCorpusReader import os from multiprocessing import Pool from collections import Counter # 初始化语料读取器 corpus_root = os.getcwd() file_pattern = ".*.txt" corpus = PlaintextCorpusReader(corpus_root, file_pattern) all_files = corpus.fileids() # 单文件处理函数:子进程执行,返回单个文件的词频统计结果 def count_file_words(file_id): words = corpus.words(file_id) # 可根据需要添加小写、去停用词等预处理逻辑 return Counter(words) if __name__ == '__main__': # 进程数可根据CPU核心数调整,默认和CPU核心数一致 with Pool() as pool: # 并行处理所有文件,得到每个文件的词频Counter counter_list = pool.map(count_file_words, all_files) # 合并所有Counter得到全局词频统计 global_counter = Counter() for c in counter_list: global_counter.update(c) # 取Top600高频词 final = global_counter.most_common(600) print(final)
优化说明
- 先拆分所有待处理文件,通过进程池并行执行单文件词频统计,充分利用多核CPU性能,处理效率随核心数线性提升
- 跨进程只传输轻量的词频统计结果,不传输大量原始文本,避免不必要的性能损耗
- 移除所有冗余重复计算,整体时间复杂度降到O(n),即使不开启多进程也比原代码快数十倍以上
内容的提问来源于stack exchange,提问作者Kshitij Malatpure
相关产品推荐
相关产品推荐

