如何高效统计指定词汇在多个Python语料库中的出现次数?
大规模语料库词汇频次统计最优方案
问题描述
我拥有4个语料库:
C1 = ['hello','good','good','desk'] C2 = ['nice','good','desk','paper'] C3 = ['red','blue','green'] C4 = ['good']
希望指定一个词汇列表,统计每个词汇在各个语料库中的出现次数。例如指定列表为l = ['good','blue']时,期望得到如下结果:
word C1 C2 C3 C4 good 2 1 0 1 blue 0 0 1 0
由于语料库规模极大,寻求高效实现方案,请问最优方法是什么?
最优实现方案
针对大规模语料库,核心思路是减少语料遍历次数+利用底层优化的统计工具,以下是两种高效方案:
方案1:用collections.Counter预统计(内存友好)
先一次性统计每个语料库的全词频,再针对目标词汇提取数值,避免重复遍历语料:
from collections import Counter import pandas as pd # 存储所有语料库 corpora = {"C1": C1, "C2": C2, "C3": C3, "C4": C4} # 预统计每个语料库的词频,仅遍历一次语料 corpus_counters = {name: Counter(corpus) for name, corpus in corpora.items()} # 目标词汇列表 target_words = ['good', 'blue'] # 构建结果数据 result = { "word": target_words, **{ corpus_name: [counter.get(word, 0) for word in target_words] for corpus_name, counter in corpus_counters.items() } } # 转为DataFrame格式 res_df = pd.DataFrame(result).set_index("word") print(res_df)
输出结果:
C1 C2 C3 C4 word good 2 1 0 1 blue 0 0 1 0
优势:时间复杂度为O(N)(N为所有语料库总词数),内存仅存储各语料库的唯一词及其频次,适合大规模数据场景。
方案2:用pandas内置统计(高效结构化处理)
如果日常用pandas处理数据,可借助其C语言实现的统计接口,避免纯Python循环的开销:
import pandas as pd corpora = {"C1": C1, "C2": C2, "C3": C3, "C4": C4} target_words = ['good', 'blue'] # 生成每个语料库的频次Series,自动补全目标词汇的0值 corpus_series = [] for name, corpus in corpora.items(): freq_series = pd.Series(corpus).value_counts().reindex(target_words, fill_value=0) freq_series.name = name corpus_series.append(freq_series) # 合并所有Series并整理格式 res_df = pd.concat(corpus_series, axis=1) res_df.insert(0, "word", target_words) res_df = res_df.set_index("word") print(res_df)
优势:pandas内部统计逻辑经过高度优化,比纯Python循环更快,适合需要后续进行数据分析的场景。
超大规模数据(内存放不下)优化
如果语料库大到无法一次性加载:
- 分块读取语料,逐块更新Counter,最终合并统计结果;
- 使用
Dask等分布式计算库,将任务拆分到多进程/节点处理,支持TB级数据。
内容的提问来源于stack exchange,提问作者Cranjis
相关产品推荐
相关产品推荐

