课程
666 字
约 2 分钟
大三下
实例化一个词频统计器
自然语言处理labs/lab/lab02/docs·更新于 2026-09-15
1. 构建TF-IDF模型,计算TF-IDF矩阵
代码注释
# 实例化一个词频统计器
vectorizer = CountVectorizer()
# 将预处理后的文档集合转换成词频矩阵 X
# fit_transform 会统计语料库中所有词汇并记录每篇文档里词出现的次数
X = vectorizer.fit_transform(corpus)
# 实例化 TF-IDF 转换器
transformer = TfidfTransformer()
# 根据词频矩阵 X 计算每个词在各文档中的 TF-IDF 权重
# TF 是词频,IDF 是逆文档频率。计算后的结果是一个权重矩阵
tfidf = transformer.fit_transform(X)
# 获取词袋模型里所有词汇的名称,方便后续查找
word = vectorizer.get_feature_names()
# 把生成的稀疏矩阵转成普通的数组格式,方便遍历和加权重计算
weight = tfidf.toarray()
算法过程
- 生成词频矩阵:程序先遍历所有的文档(标题和摘要拼接后的内容),把所有出现过的词列出来。然后统计每个词在每篇文档里出现了多少次,存成一个表格(矩阵)。
- 计算TF(词频):统计一个词在当前文档里出现的次数除以文档总词数。如果一个词在当前文档里多,说明它在当前文档重要。
- 计算IDF(逆文档频率):统计包含这个词的文档数量。如果一个词在很多文档里都出现过,那它的IDF值就低,说明它比较通用;如果只在少数文档出现,IDF就高。
- 得出TF-IDF权重:把 TF 乘以 IDF,最后得到的结果就是一个词在某文档里的综合权重。
2. 排序输出关键词并写入文件
代码实现及注释
# 用来存放处理后的结果
ids, titles, keys = [], [], []
# 遍历每一篇文档的权重数据
for i in range(len(weight)):
ids.append(idList[i])
titles.append(titleList[i])
# 记录当前文档的所有词和对应的权重
df_word, df_weight = [], []
for j in range(len(word)):
df_word.append(word[j])
df_weight.append(weight[i][j])
# 把数据放到 DataFrame 里方便排序
df_word = pd.DataFrame(df_word, columns=['word'])
df_weight = pd.DataFrame(df_weight, columns=['weight'])
# 把词和权重两列拼在一起
word_weight = pd.concat([df_word, df_weight], axis=1)
# 按照 weight 权重这一列进行降序排列(大的在前)
word_weight = word_weight.sort_values(by='weight', ascending=False)
# 提取排在最前面的前 topk 个词
keyword = np.array(word_weight['word'])
word_split = [keyword[x] for x in range(0, topk)]
# 用空格把这些词连起来
word_split = " ".join(word_split)
keys.append(word_split)
# 把 id、标题和提取出的关键词整理成一个总表
result = pd.DataFrame({"id": ids, "title": titles, "key": keys}, columns=['id', 'title', 'key'])
# 最后把这个结果表保存到 csv 文件里,不保存行索引
result.to_csv("./data/keys_TFIDF.csv", index=False)
算法详细过程
- 组织数据:对每一篇文档,把词表中的每个词和它在矩阵里对应的 TF-IDF 值关联起来。
- 权值排序:使用 pandas 的
sort_values方法,对关联好的数据按照权重值从大到小进行排序。 - 筛选 Top-K:设定一个阈值(如实验中的 10),从排序好的列表里取出前 10 个词,这些就是该文档权值最高的关键词。
- 字符串拼接:把筛选出的词连成一串,并和文档原有的 ID、标题一起存入最终的结果列表。
- 保存数据:把整个结果集转成 CSV 文件输出到指定路径,完成关键词提取。













