kp-026
文本挖掘入门:分词、词频与 TF-IDF
前置知识
本文基于模型知识整理,建议核对官方文档(见 参考资料)。
一句话定义
文本挖掘的第一层是「分词 → 去停用词 → 词频/TF-IDF 加权」,把非结构化文本变成可排序、可对比的关键词集合——爬虫采来的评论、标题、公告由此开始说话。
为什么重要
评论与标题是采集数据里信息密度最高的部分。产品差评集中在哪、竞品主打什么卖点,都从关键词分析起步;TF-IDF 是最常用的加权器,也是 kp-031 舆情案例与 kp-028 特征工程的地基。
前置知识
kp-025(清洗过的文本字段);中文分词常识。
核心概念
- 分词:中文无空格分隔,需分词器(jieba)切成词;英文按空格+词形归一。
- 停用词:「的、了、是」等无信息量词,先剔除再加权。
- TF(词频):词 t 在文档 d 中出现占比。
- IDF(逆文档频率):
log(N / df(t)),N 为文档总数,df 为含 t 的文档数——越「独有」的词 IDF 越高。 - TF-IDF:
TF × IDF,兼顾「在这篇里多」与「在别处少」。
原理与机制
公式与直觉:
tf(t,d) = count(t in d) / |d|
idf(t) = log( N / df(t) ) # df=N 的词(处处出现) → idf=0
tfidf(t,d)= tf × idf
直觉: 「质量」在某商品差评里高频、在全部评论里低频 → 该商品的真痛点
可复现的最小流程(jieba + 自算 TF-IDF):
import jieba, math
from collections import Counter
STOP = set(open("stopwords.txt", encoding="utf-8").read().split())
docs = ["质量太差 用了两天就坏了 客服还推诿",
"质量很好 包装仔细 物流也快",
"包装破损 客服态度差 但质量还行"]
tokenized = [[w for w in jieba.lcut(d) if w not in STOP and len(w) > 1] for d in docs]
N, df = len(docs), Counter()
for toks in tokenized:
df.update(set(toks)) # 每文档每词只计一次
for toks in tokenized:
tf = Counter(toks); L = len(toks)
scores = {w: (c / L) * math.log(N / df[w]) for w, c in tf.items()}
print(sorted(scores.items(), key=lambda x: -x[1])[:3])
# 文档1 → 推诿/两天/坏 类关键词浮出, 而「质量」因跨文档普遍被 IDF 压低
jieba 亦内置封装:jieba.analyse.extract_tags(text, topK=10, withWeight=True) 直接输出 TF-IDF 权重。
实例或案例
500 条差评的 TF-IDF Top10 出现「色差、起球、缩水」——比人工翻 500 条快两个数量级地给出改进方向。注意结合 kp-031:关键词只回答「什么多」,情感倾向回答「是夸是骂」,两者配合才完整。
常见误区
- 误区一:中文不分词直接统计。 按「字」或按空格统计中文毫无意义;jieba 是第一道必经工序。
- 误区二:不去停用词。 「的、了、很」霸榜,真关键词被挤出 Top10。
- 误区三:短文本硬上 IDF。 单条评论只有十几个词、语料小时 IDF 失稳;可先聚合(按商品/按周合并成「伪文档」)再加权。
自测题
- TF-IDF 同时衡量哪两件事?
答:TF 衡量词在本篇内的常见度;IDF 惩罚词在全局的普遍度;乘积选出「本篇特有且高频」的词。
- 为什么「质量」这类跨文档高频词常进不了 Top 关键词?
答:df 接近 N → IDF 趋近 0,即使 TF 高乘积仍小。
- 中文文本挖掘的第一步与第二步?
答:jieba 分词;按停用词表过滤(可加最短词长过滤)。
与其他知识点的关系
kp-028 用 TF-IDF 向量做聚类特征;kp-031 把本篇用于评论/舆情实战;kp-037 展示 LLM 抽取如何部分取代手工关键词工程。
延伸阅读
jieba 官方 README(analyse 模块);维基百科「tf–idf」词条。