同一个词在一篇文档出现五次,和在五篇文档各出现一次,是两种不同信号。总词频反映出现次数,文档频率反映覆盖多少篇。清理训练语料和检查模板污染时,先把它们分开统计,避免只看高频词列表。
准备已经分词的文本
本例使用 Python 与 scikit-learn,不调用在线模型。三条短文本是人为演示数据,空格代表已完成分词;统计真实中文语料前要先确定分词规则、繁简处理与停用词表。不能直接把中文整段交给默认英文词规则后就认定统计正确。

python -m pip install scikit-learn
分别统计总词频与文档频率
import numpy as np
from sklearn.feature_extraction.text import CountVectorizer
docs = ["模型 模型 数据", "模型 训练", "数据 标注"]
v = CountVectorizer(tokenizer=str.split, token_pattern=None)
X = v.fit_transform(docs)
words = v.get_feature_names_out()
total = np.asarray(X.sum(axis=0)).ravel()
document_count = np.asarray((X > 0).sum(axis=0)).ravel()
rows = sorted(zip(words, total.tolist(), document_count.tolist()),
key=lambda r: (-r[1], r[0]))
for word, count, df in rows:
print(word, "总次数", count, "文档数", df)
idx = list(words).index("模型")
assert total[idx] == 3 and document_count[idx] == 2
这里先产生“文档 × 词语”的稀疏计数矩阵。X.sum(axis=0) 按列求总次数;(X > 0).sum(axis=0) 只判断某篇是否包含该词,不重复计入该篇的多个出现。
用已知答案核对统计口径
验证方法是手算“模型”:第一篇出现两次、第二篇一次,所以总次数为 3,但只覆盖两篇文档,文档频率为 2。“数据”的两项都是 2;“训练”和“标注”各为 1。
如果输出没有“模型”,先看 v.get_feature_names_out() 是否把输入当成预分词文本。如果文章先经过去重,文档频率的分母应使用去重后的文档数;否则同一文章的多个副本会夸大覆盖范围。
从统计结果回查原文
下一步将文档 ID 与矩阵行号同时保存,挑选高文档频率词,回到包含它们的原文检查是否为页脚、版权声明或模板。不要因为某词高频就自动删除:专业语料中“模型”可能是必要内容。
本方法统计分词后的字符串,不自动理解同义词和实体指代。演示结果不代表真实训练数据分布;大规模语料不要把整个稀疏矩阵转成密集数组,本文仅对列汇总向量做转换。
资料与适用版本
以下官方资料核对于 2026 年 10 月 1 日;安装和界面以实际使用版本为准。
Ai菜鸟网。发布者:AI小管家,转载请注明出处:https://www.alyyhw.com/30198.html