跳到主要内容

词嵌入

本节定位

做 NLP 时,模型并不直接理解“退款”“证书”“密码”这些词本身。
它首先看到的是:

  • 一串编号
  • 再变成一串向量

词嵌入的价值就在这里:

让词不只是有编号,还能在向量空间里表现出语义关系。

如果这层没真正理解清楚,后面学上下文表示、BERT 和检索向量时都会发虚。

学习目标

  • 理解 one-hot 表示为什么不够
  • 理解词嵌入为什么能表达相似性
  • 掌握余弦相似度这类最常见的相似度直觉
  • 通过可运行示例建立“词向量空间”第一层感觉

一、为什么我们需要词嵌入?

1.1 one-hot 只能区分身份,不能表达关系

假设词表里有:

  • 退款
  • 退货
  • 密码

如果用 one-hot:

  • 退款 可能是 [1, 0, 0]
  • 退货 可能是 [0, 1, 0]
  • 密码 可能是 [0, 0, 1]

问题在于:

  • 退款退货 语义明明更近
  • 但在 one-hot 里,它们彼此同样“远”

1.2 词嵌入在做什么?

词嵌入要做的是:

  • 把词映射成低维向量
  • 让语义相近的词在向量空间里更靠近

也就是说,它不只是“编码”,更是在做:

  • 语义表示

1.3 一个类比

你可以把词嵌入理解成地图坐标。

  • one-hot 更像身份证号
  • 词嵌入更像地图位置

身份证号能区分人,但看不出谁和谁住得近;
地图坐标则能让“近”这件事变得可计算。


二、词嵌入是怎么学出语义的?

2.1 核心假设:上下文相似,词义常常也相近

如果两个词经常出现在相似上下文里,
模型就会倾向把它们学成相近向量。

例如:

  • 退款
  • 退货

可能都常出现在:

  • 售后
  • 订单
  • 申请

这就会推动它们在空间里更靠近。

2.2 向量“靠近”不等于完全同义

它更常表示:

  • 用法接近
  • 上下文分布接近

所以词嵌入里的“近”,很多时候是分布意义上的近,不一定是严格词典意义上的同义。

2.3 为什么这已经很有价值?

因为一旦有了这种空间关系,
很多任务就能利用它:

  • 相似词查找
  • 文本分类
  • 检索
  • 聚类

三、先跑一个词向量相似度示例

下面这个例子会做三件事:

  1. 给几个词定义一个小型嵌入
  2. 计算它们的余弦相似度
  3. 比较哪些词更接近
from math import sqrt

embeddings = {
"refund": [0.90, 0.80, 0.10],
"return": [0.88, 0.78, 0.12],
"invoice": [0.15, 0.85, 0.20],
"password": [0.10, 0.15, 0.95],
}


def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
norm_a = sqrt(sum(x * x for x in a))
norm_b = sqrt(sum(x * x for x in b))
return dot / (norm_a * norm_b)


print("refund vs return :", round(cosine(embeddings["refund"], embeddings["return"]), 4))
print("refund vs invoice :", round(cosine(embeddings["refund"], embeddings["invoice"]), 4))
print("refund vs password:", round(cosine(embeddings["refund"], embeddings["password"]), 4))

3.1 这个例子最重要的直觉是什么?

你会看到:

  • refundreturn 更近
  • password 更远

这正是词嵌入最关键的直觉:

“语义近”可以转化为“向量近”。

3.2 为什么这里用余弦相似度?

因为我们常常更关心:

  • 方向是否接近

而不是绝对长度。
余弦相似度正好适合这种比较。


四、词嵌入为什么对后续任务有帮助?

4.1 文本分类

如果“退款”和“退货”向量接近,
模型更容易把它们一起学进“售后类”。

4.2 相似文本检索

如果一段文本由很多相似词组成,
它在向量空间里通常也更接近同主题内容。

4.3 下游深度模型输入

很多模型第一层本质上还是:

  • token id -> embedding vector

所以词嵌入不是旧知识,而是后面更复杂模型的入口。


五、词嵌入最容易踩的坑

5.1 误区一:词嵌入等于词典释义

不是。
它更像统计语义空间,不是词典定义表。

5.2 误区二:词向量一旦学好就什么都能解决

词嵌入只能表达基础语义关系。
遇到多义词和复杂上下文时,很快就不够了。

5.3 误区三:只看单个词,不看任务

词嵌入的价值最终还是要放回具体任务里判断。


小结

这节最重要的,是把词嵌入理解成:

一种把离散词汇映射到连续语义空间的方式,让“相近词”在向量上也更接近。

一旦这个直觉建立起来,
你后面再看上下文表示、句向量和语言模型时就会顺很多。


练习

  1. 给示例再加一个词 delivery,自己决定它的向量,并观察它和其他词的相似度。
  2. 为什么说 one-hot 能区分词,但不能表达词和词之间的关系?
  3. 用自己的话解释:余弦相似度为什么适合比较词向量?
  4. 想一想:如果一个词经常出现在多个不同语境里,仅靠固定词向量会遇到什么问题?