主题
向量表示与嵌入
在 NLP 中,文本必须被转换为 向量(Vector) 才能被模型处理。
这一转换过程被称为 嵌入(Embedding),它将离散的语言符号映射为连续的低维实数空间。
一、为什么要用向量表示语言
自然语言中的“词”是符号化的,模型无法直接理解它们的语义。
通过嵌入,我们可以用数学方式表达“语义相似度”:
词语 | 示例向量(简化) |
---|---|
猫 | [0.2, 0.8, 0.1] |
狗 | [0.3, 0.7, 0.2] |
苹果 | [0.9, 0.1, 0.0] |
👉 “猫” 与 “狗” 的向量距离较近,说明它们语义相似。
二、词向量(Word Embedding)
早期 NLP 使用 词袋模型(Bag of Words, BoW) 或 TF-IDF 表示文本,但这些方法无法捕捉词序和语义关系。
Word2Vec 的出现(2013)使得词之间的关系能在向量空间中体现出来。
1. Word2Vec 模型
由 Google 提出,主要有两种结构:
- CBOW (Continuous Bag of Words):根据上下文预测中心词
- Skip-Gram:根据中心词预测上下文
训练目标:
语义相似的词,其向量也应相似。
例如:
txt
vector("国王") - vector("男人") + vector("女人") ≈ vector("王后")
2. GloVe(Global Vectors)
由 Stanford 提出,基于词共现矩阵(Co-occurrence Matrix)进行全局统计学习。
相比 Word2Vec,GloVe 在稀疏语言数据上表现更稳健。
三、上下文嵌入(Contextual Embedding)
传统词向量存在一个问题:同一个词在不同语境下的含义不同。
例如:
- “银行” 在 “金融机构” 与 “河岸” 中语义不同。
BERT 等 Transformer 模型解决了这一问题。
它根据上下文动态生成词向量,即每次输入不同句子时,词的表示都会变化。
示例(使用 Hugging Face)
python
from transformers import BertTokenizer, BertModel
import torch
tokenizer = BertTokenizer.from_pretrained("bert-base-chinese")
model = BertModel.from_pretrained("bert-base-chinese")
text = "我爱自然语言处理"
inputs = tokenizer(text, return_tensors="pt")
outputs = model(**inputs)
# 每个 token 的嵌入向量
embeddings = outputs.last_hidden_state
print(embeddings.shape) # torch.Size([1, 序列长度, 768])
四、句向量与文档向量
除了词级别嵌入,还可将整个句子或段落编码为一个固定维度向量,用于:
- 语义检索(Semantic Search)
- 相似句检测
- 聚类与分类
常用方法:
- Sentence-BERT
- Universal Sentence Encoder (USE)
- SimCSE(对比学习)
五、可视化词向量空间
可以使用 t-SNE 或 UMAP 降维可视化:
python
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# X 为词向量矩阵
X_embedded = TSNE(n_components=2).fit_transform(X)
plt.scatter(X_embedded[:,0], X_embedded[:,1])
plt.show()
可观察到语义相近的词往往聚集在一起。
六、小结
- 嵌入是文本语义与模型之间的桥梁;
- Word2Vec / GloVe 实现静态嵌入;
- BERT / GPT 提供上下文动态嵌入;
- 高质量的向量表示是 NLP 成功的关键基础。