教程 nlp tutorial

向量表示与嵌入

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