
本文介绍使用defaultdict嵌套counter的组合数据结构,高效统计文本中每个单词的总出现次数及其对应各词性标签(pos)的频次分布,并输出为指定格式的分析报告。
本文介绍使用defaultdict嵌套counter的组合数据结构,高效统计文本中每个单词的总出现次数及其对应各词性标签(pos)的频次分布,并输出为指定格式的分析报告。
在自然语言处理任务中,常需对带词性标注的语料(如 word/POS 格式)进行细粒度统计:不仅要获取每个词的全局频次,还需按其不同词性标签分别计数。例如输入 Pierre/NNP、Pierre/VB 时,应分别计入 NNP 和 VB 类别下。
最简洁高效的方案是采用 collections.defaultdict 与 collections.Counter 的嵌套结构:
from collections import defaultdict, Counter
wordcounts = defaultdict(Counter) # 外层:词 → Counter;内层:POS → 频次
with open(input_filename, "r") as f:
for line in f:
line = line.strip()
if not line: # 显式跳过空行,增强鲁棒性
continue
try:
word, pos = line.rsplit('/', 1) # 仅从右侧切分一次,避免词中含'/'的误判
wordcounts[word][pos] += 1
except ValueError:
# 忽略格式异常行(如无'/'或仅含'/')
continue该设计优势显著:
-
defaultdict(Counter)自动为新词初始化空Counter,无需手动检查键存在性; -
Counter原生支持+=操作与total()方法(Python 3.10+),可直接获取该词总频次; - 内层
Counter.items()保证遍历顺序稳定(插入顺序),便于结果可重现。
生成最终输出时,按题目要求格式组织字段:
图片提示词生成器?不止如此。 马甲系统 —— 把脑海中的画面,翻译成AI能理解的专业表达。 用得越多,它越懂你:首次需要多问几句确认方向,用久了几乎一说就懂。 用得越多,它越快:缓存机制让后续对话越来越省。 RAG进化:成功案例持续入库,越跑越聪明。 输入「新手指南」查看完整功能介绍
立即学习“Python免费学习笔记(深入)”;
for word, pos_counter in wordcounts.items():
total = pos_counter.total() # 或 sum(pos_counter.values()) 兼容旧版本
pos_parts = [f'{pos} {count}' for pos, count in pos_counter.items()]
print(f"{word}\t{total}\t" + "\t".join(pos_parts))注意事项:
- 使用
\t(制表符)而非空格分隔字段,可确保列对齐更可靠(尤其当词长差异大时);- 若需按总频次降序排列,可在循环前添加
sorted(wordcounts.items(), key=lambda x: x[1].total(), reverse=True);- 对大小写敏感场景(如
Pierrevspierre),建议统一.lower()处理以提升统计一致性。
此方法时间复杂度为 O(n),空间利用率高,且代码简洁可维护,是处理此类多级分类计数问题的标准实践。

















