词嵌入:原理、计算与应用
1. 引言
词袋模型是一种简单且广泛使用的文本表示方法,它将文本看作是单词的集合,不考虑单词之间的顺序和关系。在词袋模型中,每个单词或文本的其他特征在表示文档的多维空间中由一个维度表示,即独热编码(one - hot representation)。然而,这种方法存在明显的局限性,它无法捕捉单词之间的关系。因为每个维度是独立的,仅由一个值表示,不能在特征之间共享信息。例如,无法判断“football”与“soccer”比与“ballet”更相似。
不过,当特征数量相对较少且它们之间没有相关性(或者我们不想考虑相关性)时,独热编码表示可能比其他能表示相关性并减少词袋模型稀疏性的替代表示更有益。
为了解决词袋模型中单词之间缺乏相似度的问题,可以向文本中的现有单词添加其他信息,以更好地捕捉它们的上下文。例如,不仅记录单词是“A”,还记录其词性标签是“T”,前一个单词是“B”,后一个单词是“C”。但这样会增加输入空间的维度,并且需要仔细选择可能的特征组件组合。
现代的一些文本表示方法基于这样的理念:相似的单词应该具有相似的属性。但经典的词袋模型无法实现这一点,因此需要用多个维度来表示每个单词或特征。在这种方法中,每个单词被映射到一个连续的多维空间,通常有几百个维度,这比词袋模型的维度数少得多。单词被嵌入到这个连续的向量空间中,这就是词嵌入(word embeddings)。
由于词向量通常是在无监督训练过程中得到的,这些维度很难解释。向量可以被理解为上下文特征的向量,因为它是基于单词出现的上下文构建的。在这个空间中,相似的单词预计会彼此靠近。
这些替代模型的基本思想是,出现在相似上下文中的单词通常具有相似的含义。例如,在一些句子中多次出现不太知名的单词“Brno”,尽管如此,读者可以推测它很可能是一个城市的名称,因为这些句子与包含读者已知城市名称的句子具有相似的上下文,这些句子通常会提及居民数量、地区、旅行方向等信息。显然,词袋模型中的一个维度肯定不足以表示单词的这些信息。
相似的单词会共享一些信息,因此它们向量元素的值应该相似,在多维空间中它们会彼此靠近。基于这一原理的模型除了能捕捉单词之间的相似度外,还带来了一些额外的优势和可能性。由于单词由向量表示,可以对它们进行向量运算,从而得到非常有趣的结果。
例如:
- 向量运算“vector(”king”) - vector(”man”) + vector(”woman”)”会非常接近“vector(”queen”)”,捕捉到了男性/女性的关系。
- “vector(”paris”) - vector(”france”) + vector(”poland”) ≈ vector(”warsaw”)”展示了首都与国家的关系。
- “vector(”cars”) - vector(”car”) + vector(”apple”) ≈ vector(”apples”)”体现了复数化的关系。
使用词向量还能显著帮助计算真正的文档相似度。当两个句子意思非常相似,但使用了同义词而不是相同的单词时,经典的相似度度量方法会认为这两个句子不相似。例如,“The queen visited the capital of US.”和“Elizabeth came to Washington in the USA.”这两个句子,在不考虑停用词的情况下,没有共同的单词,但它们描述的是相同的情况。在词向量空间中,“Elisabeth”和“queen”、“USA”和“US”这两对单词会非常接近。这就是词移距离(Word Movers Distance,WMD)度量方法的原理,它将两个文档之间的差异量化为一个文档中的嵌入单词到达另一个文档中的嵌入单词所需的最小移动距离,从而考虑了词向量的相似度。
2. 确定上下文和单词相似度
寻找表示单词的向量元素的合适值,是基于“出现在相似上下文中的单词具有相似含义”这一假设。那么,一个关键问题是:什么是单词的上下文?上下文可以定义为在某种程度上处于该单词特定环境中的一组单词,它可能是同一个文档、句子,或者是一段特定长度的文本(例如,单词左右各五个单词)。
2.1 利用文档 - 词矩阵寻找相似上下文的单词
最简单的寻找具有相似上下文的单词的方法是查看文档 - 词矩阵。如果矩阵有 n 行(n 是文档的数量)和 m 列(m 是术语的数量),那么具有相似上下文的单词其对应列也相似。在这种情况下,上下文是整个文档。
2.2 词共现矩阵
如果上下文不是整个文档,更常用的是词共现矩阵(word co - occurrence matrix)而不是文档 - 词矩阵。词共现矩阵是一个方阵,其行和列由单词标记,矩阵元素包含单词共现的频率。
然而,在词 - 词矩阵中使用原始频率存在一个缺点,即一些高频单词(通常是停用词)往往与许多其他单词共现,但它们的区分度不高。因此,最好对频率进行某种归一化处理,以便使单词之间的真实关系更加明显。在这种情况下,一种常用的度量方法是点互信息(pointwise mutual information,PMI),它用于衡量两个单词是否比它们独立出现时更频繁地一起出现。PMI 的值范围从 -∞ 到 +∞,负值通常被替换为零,因为解释单词比随机共现频率更低的情况可能会有问题。该度量方法偏向于低频单词,因此通常会将概率提升到一个数(例如 0.75),或者对所有频率加一(拉普拉斯平滑)。
文档 - 词矩阵和词共现矩阵通常有很多行和列(数万),并且它们的向量是稀疏的(有很多零)。因此,希望使用具有不同属性的表示方法,向量应该更短,以便在机器学习任务中更容易使用(需要学习的参数更少),并且大多数值不是零(即向量是密集的)。
生成密集向量的流行方法包括使用全局矩阵分解的模型,如潜在语义分析(Latent Semantic Analysis,LSA)或潜在狄利克雷分配(Latent Dirichlet Allocation,LDA),以及使用小上下文窗口的神经网络学习的模型(其中 word2vec 可能是最流行的)。在许多情况下,基于神经网络的模型在保留单词之间的线性规律方面(例如对于单词类比任务很重要)比 LSA 表现更好,并且在计算效率上比 LDA 更高。另一方面,像 LSA 这样的全局方法可以有效地利用统计信息,这是像 word2vec 这样的局部方法所不具备的。
3. 上下文窗口
使用单词附近的短文本片段来定义上下文是一种很流行的方法。根据考虑的因素,可以区分三种上下文类型:
-
连续词袋(Continuous bag - of - words)
:上下文由一个窗口中的单词表示,不考虑单词的顺序或位置。例如,单词“X”的上下文是“A, B, C, D”。
-
位置(Positional)
:考虑其他单词的相对位置。例如,单词“X”的上下文是“A 在左边两个位置,C 在左边一个位置,D 在右边一个位置,C 在右边两个位置”。
-
依赖(Dependency)
:考虑与单词的句法连接。例如,“A”是“X”的主语,“B”是“X”的宾语。
当上下文由围绕单词的窗口确定时,窗口大小会影响学习到的嵌入。使用较小的上下文窗口(1 - 3 个单词)时,会发现更多的句法和功能相似性;而较长的窗口(4 - 10 个单词)则能发现更多的语义相似性。
在训练之前,还可以修改窗口的内容。可以根据单词与定义其上下文的目标单词的距离为单词分配不同的权重(这可以通过采样实现)。也可以在训练前去除高频单词,这里有两种情况:在定义上下文之前去除单词(这意味着上下文窗口会扩大,离预测单词更远的单词会被包含在上下文中),或者在创建窗口之后去除(上下文窗口大小不变)。去除稀有单词对学习到的嵌入质量影响较小。
下面是上下文窗口类型的总结表格:
| 上下文类型 | 描述 |
| — | — |
| 连续词袋 | 不考虑单词顺序和位置,由窗口内单词表示上下文 |
| 位置 | 考虑其他单词相对目标单词的位置 |
| 依赖 | 考虑与目标单词的句法连接 |
4. 计算词嵌入
计算词嵌入的方法可以分为有监督和无监督方法。
4.1 有监督方法
有监督方法需要针对特定任务的标注数据。例如,在词性标注任务中,需要带有词性标签的文本。然后,词嵌入会朝着给定的目标进行训练,能够捕捉与任务相关的信息。创建的嵌入可以成功用于相关任务,对于这些任务可能没有足够的标注数据。在一个任务中学习到的嵌入也可以转移到另一个任务,并使用来自另一个任务的一些标注数据进行改进。
4.2 无监督方法
无监督方法不需要标注数据,其唯一目标是计算嵌入。词嵌入通常是在给定上下文预测单词,或者判断给定的真实和随机创建的单词 - 上下文对中,一个单词是否可以属于某个上下文的任务中学习得到的。可以使用现有的大型语料库进行训练,而不是标注文本。学习到的嵌入捕捉了一般的句法和语义关系,可以应用于各种任务。
以下是一些著名的计算词嵌入的方法:
-
神经语言模型(Neural language models)
:可以在神经网络(通常是第一层)中学习密集向量表示(嵌入),该网络使用独热向量作为输入。早期生成词嵌入的工作使用神经网络进行语言建模。在神经概率语言模型中,从文本中取 k 个单词作为输入,并使用 softmax 计算下一个单词的概率。Collobert 等人使用单词周围的窗口而不是几个前面的单词来预测正确的单词,他们还将概率计算替换为给正确单词分配更高分数,给错误单词分配更低分数。表示单词的向量被连接起来,并由一个具有一个隐藏层的神经网络处理。
-
Word2vec
:是由 Tomáš Mikolov 提出的一系列方法,它将自然语言处理社区的注意力吸引到了神经语言模型上。Word2vec 中的预测有两种形式:基于上下文预测单词(连续词袋,CBOW 方法)和基于单词预测上下文(Skip - gram 方法)。在这两种情况下,输入和输出都是独热编码向量。Word2vec 试图消除先前神经语言模型在计算复杂度方面的问题。在训练阶段,神经网络使用线性激活函数而不是多层感知机中典型的 sigmoid 函数,并最大化预测单词或其上下文的概率的对数。Levy 和 Goldberg 发现,使用带负采样的 Skip - gram 模型学习词向量是词 - 上下文对的正点互信息矩阵的隐式分解。
-
GloVe
:是斯坦福大学开发的一个模型。与直接学习词向量的 Word2vec 不同,GloVe 使用单词的全局共现信息。它在预测两个单词共现概率的任务中使用词向量。更准确地说,通过研究与其他所谓的探测词的共现比率来检查两个单词之间的关系,预测单词共现概率的比率。概率可以从语料库创建的词 - 词矩阵中计算得到。预测由一个以词向量为输入的函数完成,词向量是在使用随机梯度下降进行词共现矩阵分解的过程中计算得到的,这个过程可以并行化。与 Word2vec 相比,GloVe 的训练速度更快,但需要更多的内存。
-
fastText
:大多数学习词嵌入的技术忽略了子词信息(前缀、后缀),这对于具有许多稀有单词的形态丰富的语言非常重要。fastText 模型源自 Word2vec,它将每个单词视为字符 n - 元组的集合,向量在 n - 元组级别关联。单词的向量计算为 n - 元组向量的总和,这也使得可以为训练数据中不存在的单词创建向量。
当生成嵌入是神经网络的一部分时,向量可以像其他模型参数一样随机初始化。值可以从以零为中心的固定区间均匀采样(例如,Xavier 方法从区间 $[-\frac{\sqrt{6}}{\sqrt{n_i + n_o}}, +\frac{\sqrt{6}}{\sqrt{n_i + n_o}}]$ 采样,其中 $n_i$ 和 $n_o$ 是输入和输出的大小),或者从均值为零、标准差在 0.001 到 10 之间变化的正态分布采样。
也可以使用在许多不同语料库上预训练的词向量嵌入,这些语料库的来源包括维基百科文章、推文、Common Crawl、谷歌新闻等。
下面是这些计算词嵌入方法的对比表格:
| 方法 | 特点 | 优势 | 劣势 |
| — | — | — | — |
| 神经语言模型 | 使用神经网络学习密集向量表示,基于上下文预测单词概率 | 能捕捉上下文信息 | 计算复杂度可能较高 |
| Word2vec | 有 CBOW 和 Skip - gram 两种预测形式,使用线性激活函数 | 计算效率较高,吸引了 NLP 社区关注 | 忽略子词信息 |
| GloVe | 使用全局共现信息,预测单词共现概率比率 | 训练速度快 | 需要更多内存 |
| fastText | 考虑子词信息,将单词视为字符 n - 元组集合 | 可处理稀有单词,能为未在训练数据中的单词创建向量 | |
以下是计算词嵌入方法的流程图:
graph LR
A[计算词嵌入方法] --> B[有监督方法]
A --> C[无监督方法]
C --> D[神经语言模型]
C --> E[Word2vec]
C --> F[GloVe]
C --> G[fastText]
5. 词向量的聚合
为了表示更大的文本片段(句子、段落、文档),需要以某种方式聚合词向量。否则,文本可以被视为一个具有可变长度的嵌入单词集合。然而,许多算法需要固定长度的向量,这些固定长度向量可以作为分类或聚类算法的输入,替代词袋模型中的文档向量。
5.1 简单聚合方法
简单的聚合方法包括使用词向量的总和、平均值或加权平均值(使用 tf - idf 权重)。这些方法简单直接,易于实现,例如:
-
总和
:将文本中所有单词的词向量相加,得到表示整个文本的向量。
-
平均值
:将所有词向量相加后除以单词的数量,得到平均向量。
-
加权平均值
:根据单词的 tf - idf 权重对词向量进行加权,然后求和并除以总权重。
5.2 段落向量算法
Le 和 Mikolov 在他们的段落向量算法中采用了类似的思想。在训练词向量时,通常期望向量有助于在给定上下文中预测其他单词。在段落向量算法中,一个较大的文本片段(这里是一个段落)也应该有助于预测其他单词。段落向量在预测任务中就像另一个单词一样,它代表了当前上下文中缺失的信息,并作为段落主题的记忆。词向量在所有段落中共享,而段落向量则不共享。
5.3 递归神经网络架构
在某些研究中提出了使用递归神经网络架构来聚合词向量的方法。该方法需要进行句法分析,因此通常在句子级别上工作。它通过递归地组合词向量来表示整个句子的语义信息。
5.4 哈希编码方法
还有一种方法是通过 Fisher 核和哈希方法将可变大小的词嵌入集合聚合和压缩为二进制哈希码。这种方法可以减少数据的维度,提高计算效率。
下面是词向量聚合方法的总结表格:
| 聚合方法 | 描述 |
| — | — |
| 简单聚合(总和、平均、加权平均) | 对词向量进行简单的数学运算 |
| 段落向量算法 | 段落向量作为额外信息参与预测任务 |
| 递归神经网络架构 | 在句子级别通过递归组合词向量 |
| 哈希编码方法 | 将词嵌入集合压缩为二进制哈希码 |
6. 词嵌入的应用与优势总结
词嵌入在自然语言处理领域有广泛的应用,并且具有许多优势。
6.1 应用场景
- 文档相似度计算 :如前面提到的词移距离(WMD)度量方法,通过考虑词向量的相似度,能够更准确地计算文档之间的相似度,即使文档使用了同义词。
- 文本分类和聚类 :固定长度的词向量聚合结果可以作为分类和聚类算法的输入,帮助对文本进行分类和分组。
- 机器翻译 :词嵌入可以捕捉单词的语义信息,有助于提高机器翻译的质量,使翻译结果更符合语义逻辑。
- 问答系统 :在问答系统中,词嵌入可以帮助理解问题和答案的语义,提高匹配的准确性。
6.2 优势
- 捕捉语义关系 :词嵌入能够捕捉单词之间的语义和句法关系,使得相似的单词在向量空间中彼此靠近,这是词袋模型所不具备的能力。
- 支持向量运算 :可以对词向量进行各种向量运算,从而发现单词之间的潜在关系,如性别关系、单复数关系等。
- 提高计算效率 :与稀疏的词袋模型向量相比,词嵌入的向量通常更短且密集,减少了机器学习任务中需要学习的参数数量,提高了计算效率。
- 处理未登录词 :像 fastText 这样的方法考虑了子词信息,能够为训练数据中不存在的单词创建向量,增强了模型的泛化能力。
以下是词嵌入应用和优势的关系图:
graph LR
A[词嵌入] --> B[应用场景]
A --> C[优势]
B --> B1[文档相似度计算]
B --> B2[文本分类和聚类]
B --> B3[机器翻译]
B --> B4[问答系统]
C --> C1[捕捉语义关系]
C --> C2[支持向量运算]
C --> C3[提高计算效率]
C --> C4[处理未登录词]
7. 总结与展望
词嵌入作为一种强大的文本表示方法,为自然语言处理带来了巨大的进步。它克服了词袋模型的局限性,能够捕捉单词之间的语义和句法关系,支持向量运算,并在各种自然语言处理任务中取得了良好的效果。
在计算词嵌入方面,有多种有监督和无监督方法可供选择,每种方法都有其特点和适用场景。同时,词向量的聚合方法也为处理更大的文本片段提供了有效的手段。
未来,随着自然语言处理技术的不断发展,词嵌入可能会在以下方面得到进一步的改进和应用:
-
多模态融合
:将词嵌入与图像、音频等其他模态的信息进行融合,以处理更复杂的多模态任务。
-
动态词嵌入
:考虑单词在不同上下文和时间的动态变化,使词嵌入能够更好地适应不同的语境。
-
可解释性增强
:提高词嵌入的可解释性,使人们能够更好地理解词向量所代表的含义和信息。
总之,词嵌入在自然语言处理领域有着广阔的发展前景,将继续为该领域的研究和应用带来新的突破。
超级会员免费看
741

被折叠的 条评论
为什么被折叠?



