13 生成词向量之GloVe
在前一篇教程中,我们介绍了Word2Vec
模型,这是一个非常流行的生成词向量的方法。今天,我们将继续探讨一种替代的词向量生成方法——GloVe
(Global Vectors for Word Representation)。
GloVe简介
GloVe
是由斯坦福大学的研究者于2014年提出的。与Word2Vec
不同,GloVe
的主要思想是利用词与词之间的全局统计信息来生成词向量。具体来说,GloVe
通过构建词频矩阵,利用词与上下文之间的共现关系,从而获得词的向量表示。
GloVe
模型的核心假设是:对于任何两个词i
和j
,它们的向量表示$ \mathbf{v}_i $ 和 $ \mathbf{v}_j $之间的关系与它们在语料库中共现的频率存在一定的对应关系。其基本思想可以用以下公式表示:
$$
\frac{P_{ij}}{P_{i}P_{j}} = \mathbf{v}_i^T \mathbf{v}_j + b_i + b_j
$$
其中:
- $P_{ij}$是词
i
和词j
的共现概率; - $P_i$和$P_j$是词
i
和词j
的单独出现概率; - $\mathbf{v}_i$和$\mathbf{v}_j$是词
i
和词j
的向量表示; - $b_i$和$b_j$是偏置项。
通过最小化上述目标函数,GloVe
能够学习到词向量。
GloVe的实现步骤
接下来,我们将从以下几个方面详细介绍GloVe
的实现步骤:
- 构建共现矩阵
- 训练词向量
- 使用生成的词向量
1. 构建共现矩阵
首先,我们需要处理语料库,生成词与上下文的共现矩阵。假设我们有一段文本,以下是一个简单的例子:
1 | 我 爱 自然 语言 处理 |
我们希望统计每个词与其他词的共现次数。假设我们设置上下文窗口为1。
词 | 自然 | 语言 | 处理 | 我 | 爱 | 非常 | 有趣 | 的 | 领域 |
---|---|---|---|---|---|---|---|---|---|
自然 | 0 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
语言 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
处理 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
我 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
爱 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
非常 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
有趣 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
的 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
领域 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
在这个过程中,我们会记录每对词的共现次数以填充共现矩阵。
2. 训练词向量
获得共现矩阵后,我们需要通过优化算法来训练词向量。在这一步,GloVe
使用了一个损失函数来最小化词与共现概率的差异。如下所示的损失函数:
$$
J = \sum_{i=1}^{V} \sum_{j=1}^{V} f(X_{ij}) \left( \mathbf{v}_i^T \mathbf{v}j + b_i + b_j - \log(X{ij}) \right)^2
$$
其中:
- $X_{ij}$是共现矩阵的值;
- $f(X_{ij})$是一个权重函数,通常用来减少稀疏共现对损失的影响。
我们可以使用Python和GloVe
库来实现这个过程,以下是一个简单的代码示例:
1 | import numpy as np |
3. 使用生成的词向量
训练完成后,我们就可以使用生成的词向量进行各种自然语言处理任务,例如:
- 文本分类
- 情感分析
- 语义相似度计算
下面是如何加载训练好的模型并查询词向量的示例代码:
1 | # 加载模型 |
总结
在本节中,我们学习了GloVe
模型的基本原理和实现步骤。从构建共现矩阵,到使用优化算法训练词向量,再到应用这些词向量,我们对GloVe
有了一个全面的
13 生成词向量之GloVe