7.8 词嵌入
训练自己的词嵌入模型!
创建日期: 2025-04-28
本教程包含对 词嵌入 (Word Embedding) 的介绍,我们将使用 Keras 训练自己的词嵌入模型,用于情绪分类任务,然后在 Embedding Projector 中将其可视化,如下图所示:

7.8.1 文本数字化
机器学习模型以向量(数字数组)作为输入。处理文本时,我们必须做的第一件事情是想出一种策略,将字符串转换为数字(或“矢量化”文本),然后再将其输入到模型中。在本节中,我们将了解 3 种策略。
7.8.1.1 独热编码
第一个想法是,我们可以对词汇表中的每个单词进行 独热 (One-Hot) 编码。考虑句子 "The cat sat on the mat" ,这个句子中的词汇表(或唯一单词)是 (cat, mat, on, sat, the) 。为了表示每个单词,我们将创建一个长度等于词汇表的零向量,然后再与该单词对应的索引中放置一个 1 。这种方法如下图所示:
要创建一个包含句子编码的向量,我们可以将每个单词的独热向量连接起来。
注:这种方法效率低下,独热编码向量是稀疏的(也就是说,大多数索引为零)。假设词汇表中有 10000 个单词。要对每个单词进行独热编码,我们需要创建一个 99.99% 的元素为零的向量。
7.8.1.2 唯一数字编码
第二种方法就是使用一个唯一的数字对每个单词进行编码。继续上面的例子,我们可以将 1 分配给 "cat" ,将 2 分配给 "mat" ,依此类推。然后,我们可以将句子 "The cat sat on the mat" 编码为一个密集向量,如 [5, 1, 4, 3, 5, 2] 。这种方法非常有效。现在我们得到的不再是稀疏向量,而是密集向量(其中所有元素都是满的)。
然而,这种方法有两个缺点:
-
整数编码是任意的(它不捕捉单词之间的任何关系)。
-
整数编码对模型来说很难解释。例如线性分类器,对每个特征使用一个权重进行学习。由于任何两个单词的相似性与其编码的相似性之间没有关系,因此这种特征-权重组合就没有意义。
7.8.1.3 词嵌入
词嵌入为我们提供了一种高效的表示方法,其中相似的单词具有相似的编码。重要的是,我们不必手动指定此编码。嵌入是浮点形式的 稠密向量 (Dense Vector) (向量的长度是我们指定的参数)。嵌入的值不是手动指定的,而是可训练的参数(模型再训练期间学习的权重,与模型学习密集层的权重方式相同)。
通常可以看到 8 维的词嵌入(对于小型数据集),在处理大型数据集时可达 1024 维。更高的嵌入维度可以捕捉单词间更细粒度的关系,但需要更多的数据训练。
上图是单词嵌入的示意图,每个单词都表示为一个 4 维浮点值向量。另一种理解嵌入的方式是将期视为查找表。学习这些权重后,你可以通过在表中查找器对应的稠密向量来对每个单词进行编码。