# 向量表示与嵌入

URL: https://caijiao.org/nlp/embeddings
Source: docs/nlp/embeddings.md
Description: 本章介绍文本向量化的原理，包括词向量（Word Embedding）、上下文表示（Contextual Embedding）以及主流模型（Word2Vec、GloVe、BERT Embedding）等。

在 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 成功的关键基础。
