人工智能实践(语言智能)
第1讲:经典 NLP 任务

1.1 文本表示

从 one-hot、Bag-of-Words、TF-IDF 到静态词向量(Word2Vec / GloVe / FastText),理解经典文本表示方法及其在大模型时代的复活点

为什么从"表示"讲起

机器本质上处理的是数字向量。文本表示(Text Representation)要解决的问题是:如何把一段字符串变成一个向量,且这个向量能尽量保留语义信息? 从统计学习时代到神经网络时代,这个问题的答案演化出了三代方法:

  1. 稀疏离散表示:one-hot、Bag-of-Words(BoW)、TF-IDF——把词看成独立符号
  2. 稠密静态向量:Word2Vec、GloVe、FastText——每个词一个固定向量,能编码语义关系
  3. 上下文向量:ELMo、BERT、GPT——每个 token 的表示随上下文动态变化(留到第 2 讲)

本节聚焦前两代。它们不是"被淘汰的古董"——TF-IDF 至今是 RAG 系统里 BM25 检索的基石,Word2Vec 至今是关键词扩展、术语聚类、轻量分类的首选。


稀疏离散表示

One-hot 编码

最朴素的表示:词表大小为 VV,每个词对应一个 VV 维向量,在该词位置为 1,其余为 0。

one-hot("cat")=[0,0,,1,,0]RV\text{one-hot}(\text{"cat"}) = [0, 0, \ldots, 1, \ldots, 0]^\top \in \mathbb{R}^V

致命缺陷:任意两个不同词的余弦相似度都是 0。"猫"和"狗"与"猫"和"银行"的距离完全一样,语义信息彻底丢失。

Bag-of-Words(BoW)

把一篇文档表示为词频向量,忽略词序:

thecatsatonmatdog
文档 A:"the cat sat on the mat"211110
文档 B:"the dog sat on the mat"201111

BoW 能反映一篇文档"谈什么",但存在两个问题:

  • 高频功能词主导the, of, a 等在每篇文档都出现很多次,它们的计数掩盖了真正区分文档的关键词
  • 忽略词序:语义相反的两句话("狗咬人" vs "人咬狗")在 BoW 中完全一样

TF-IDF:给稀有词加权

TF-IDF(Term Frequency - Inverse Document Frequency)通过**"这个词在本文档有多频繁"乘以"这个词在整个语料中有多稀有"**来解决高频功能词问题:

tf-idf(t,d)=tf(t,d)logNdf(t)\text{tf-idf}(t, d) = \text{tf}(t, d) \cdot \log \frac{N}{df(t)}

其中:

  • tf(t,d)\text{tf}(t, d):词 tt 在文档 dd 中出现的次数(或归一化频率)
  • NN:语料总文档数
  • df(t)df(t):包含词 tt 的文档数

直觉:the 出现在几乎所有文档中,df(t)Ndf(t) \approx NlogNdf(t)0\log \frac{N}{df(t)} \approx 0,它的 TF-IDF 权重被压到接近零;而像量子纠缠这种只在少数文档出现的词,IDF 项很大,权重高,能真正反映文档主题。

TF-IDF 今天依然活跃:Elasticsearch、Lucene 的 BM25 算法就是 TF-IDF 的改进版,至今是绝大多数搜索引擎、RAG 系统的检索底座。稠密检索(dense retrieval)爆发后,工业实践仍广泛使用 BM25 + dense 的 hybrid retrieval。


稠密静态词向量

稀疏表示的根本缺陷:每个词都是孤立符号,没有"猫"和"狗"比"猫"和"银行"更接近的概念。稠密词向量通过"相似的词应当有相似的向量"来解决这个问题。

Word2Vec

Mikolov 等(2013)提出 Word2Vec,核心思想一句话概括:一个词的含义由它的上下文决定(Distributional Hypothesis)。

两种训练目标:

  • CBOW(Continuous Bag-of-Words):用上下文预测中心词
  • Skip-gram:用中心词预测上下文(对低频词表现更好)

训练后得到一个矩阵 ERV×dE \in \mathbb{R}^{V \times d}(典型 d=100,200,300d = 100, 200, 300),每行就是一个词的稠密向量。

GloVe

Pennington 等(2014)的 GloVe(Global Vectors)从全局共现矩阵出发,用加权最小二乘拟合共现概率的对数。直观上它把 Word2Vec 的"局部窗口预测"和"全局矩阵分解"结合在一起。

FastText

Bojanowski 等(2017)的 FastText 在 Word2Vec 基础上把词拆成字符 n-gram 子词:一个词的向量是其所有 n-gram 向量的和。这让它能给训练时没见过的词(OOV)也生成合理向量,对中文和形态丰富的语言(德语、芬兰语)特别有用。

静态词向量能做什么

训练后的词向量天然编码了语义关系:

# 经典例子
king - man + woman ≈ queen
Paris - France + Italy ≈ Rome

典型应用:

  • 语义相似度:用余弦相似度 cos(u,v)=uvuv\cos(\mathbf{u}, \mathbf{v}) = \frac{\mathbf{u} \cdot \mathbf{v}}{\|\mathbf{u}\| \|\mathbf{v}\|} 衡量两个词的相近程度
  • 词聚类:把医疗术语自动归并为"症状/药物/诊断"类别
  • 轻量文本分类:对一段文本的词向量取平均得到句向量,送入逻辑回归分类器——效果远超 BoW,成本远低于 BERT

静态词向量的致命缺陷:一个词只有一个向量。"苹果"在"吃苹果"和"买苹果手机"里拿到的是同一个向量,无法区分上下文含义。这就是第 2 讲 Transformer / BERT 要解决的核心问题——上下文化表示(Contextualized Representation)。


三代表示方法的定位

方法维度是否编码语义是否随上下文变化今天的用武之地
One-hot词表大小 VV索引查找、词表编码
TF-IDF词表大小 VV弱(通过权重)BM25 检索、轻量分类、关键词提取
Word2Vec / GloVe100-300关键词扩展、术语聚类、RAG 初筛
FastText100-300是(含子词)多语言 / OOV 场景、轻量分类(Facebook 生产级)
BERT / GPT embedding768-4096现代稠密检索、语义搜索、下游微调

经典方法在大模型时代的复活点

研究生常有一种错觉:"有了大模型,这些经典方法就没用了。"恰恰相反:

  1. RAG 系统的 hybrid retrieval:BM25(TF-IDF 改进版)+ 稠密向量的混合召回,在工业界几乎是标配。纯稠密检索对专有名词、罕见术语反而不如 BM25。
  2. 术语词表构建:从无标注语料里自动抽取术语、做领域词扩展,Word2Vec / FastText 仍是首选,成本比 LLM 调用低三个数量级。
  3. 轻量分类任务:情感二分类、垃圾邮件识别、意图分流这些已经"过度优化"的任务,TF-IDF + LogReg / LinearSVC 的线上延迟和内存占用都远优于 BERT,准确率差距往往在 1-2 个百分点以内。
  4. 冷启动和隐私场景:不能外发 API、GPU 资源受限时,静态词向量配合浅层模型仍是唯一可行方案。

本节小结

概念一句话要点
One-hot每个词独立符号,任意两词距离相等
BoW词频向量,忽略词序
TF-IDF稀有词加权,公式 tf-idf(t,d)=tf(t,d)logNdf(t)\text{tf-idf}(t,d) = \text{tf}(t,d) \cdot \log \frac{N}{df(t)};是 BM25 的前身
Word2Vec分布式假设:上下文相似 ⇒ 向量相似;CBOW / Skip-gram 两种目标
GloVe从全局共现矩阵出发,结合局部和全局信息
FastText字符 n-gram 子词,能处理 OOV 和形态丰富的语言
三代方法关系稀疏 → 稠密静态 → 稠密上下文(第 2 讲)