词嵌入向量WordEmbedding的原理和生成方法

本文介绍了WordEmbedding的概念及其在自然语言处理领域的应用。WordEmbedding能够将文本转换为数学向量,有效解决one-hot表示法的缺陷。文章还详细解释了如何通过神经网络生成WordEmbedding。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自:https://www.sohu.com/a/210757729_826434

WordEmbedding

词嵌入向量(WordEmbedding)是NLP里面一个重要的概念,我们可以利用WordEmbedding将一个单词转换成固定长度的向量表示,从而便于进行数学处理。本文将介绍WordEmbedding的使用方式,并讲解如何通过神经网络生成WordEmbedding。

WordEmbedding的使用

使用数学模型处理文本语料的第一步就是把文本转换成数学表示,有两种方法,第一种方法可以通过one-hot矩阵表示一个单词,one-hot矩阵是指每一行有且只有一个元素为1,其他元素都是0的矩阵。针对字典中的每个单词,我们分配一个编号,对某句话进行编码时,将里面的每个单词转换成字典里面这个单词编号对应的位置为1的one-hot矩阵就可以了。比如我们要表达“the cat sat on the mat”,可以使用如下的矩阵表示。

one-hot矩阵表示法

one-hot表示方式很直观,但是有两个缺点,第一,矩阵的每一维长度都是字典的长度,比如字典包含10000个单词,那么每个单词对应的one-hot向量就是1X10000的向量,而这个向量只有一个位置为1,其余都是0,浪费空间,不利于计算。第二,one-hot矩阵相当于简单的给每个单词编了个号,但是单词和单词之间的关系则完全体现不出来。比如“cat”和“mouse”的关联性要高于“cat”和“cellphone”,这种关系在one-hot表示法中就没有体现出来。

WordEmbedding解决了这两个问题。WordEmbedding矩阵给每个单词分配一个固定长度的向量表示,这个长度可以自行设定,比如300,实际上会远远小于字典长度(比如10000)。而且两个单词向量之间的夹角值可以作为他们之间关系的一个衡量。如下表示:

WordEmbedding表示法

通过简单的余弦函数,我们就可以计算两个单词之间的相关性,简单高效:

两个向量相关性计算

因为WordEmbedding节省空间和便于计算的特点,使得它广泛应用于NLP领域。接下来我们讲解如何通过神经网络生成WordEmbedding。

WordEmbedding的生成

WordEmbedding的生成我们使用tensorflow,通过构造一个包含了一个隐藏层的神经网络实现。

下面是下载数据和加载数据的代码,一看就懂。训练数据我们使用的是http://mattmahoney.net/dc/enwik8.zip数据,里面是维基百科的数据。

接下来是如何构建训练数据。构建训练数据主要包括统计词频,生成字典文件,并且根据字典文件给训练源数据中的单词进行编号等工作。我们生成的字典不可能包含所有的单词,一般我们按照单词频率由高到低排序,选择覆盖率大于95%的单词加入词典就可以了,因为词典越大,覆盖的场景越大,同时计算开销越大,这是一个均衡。下面的代码展示了这个过程,首先统计所有输入语料的词频,选出频率最高的10000个单词加入字典。同时在字典第一个位置插入一项“UNK"代表不能识别的单词,也就是未出现在字典的单词统一用UNK表示。然后给字典里每个词编号,并把源句子里每个词表示成在字典中的编号。我们可以根据每个词的编号查找WordEmbedding中的向量表示。

接下来我们看一下如何将源句子转换成训练过程的输入和输出,这一步是比较关键的。有两种业界常用的WordEmbedding生成方式,Continuous Bag Of Words (CBOW)方法和n-gram方法,我们采用n-gram方法。训练的目的是获得能够反映任意两个单词之间关系的单词向量表示,所以我们的输入到输出的映射也要翻译两个单词之间的关联。n-gram的思路是将所有的源句子按固定长度(比如128个单词)分割成很多batch。对于每个batch,从前往后每次选取长度为skip_window的窗口(我们设定skip_window=5)。对于窗口中的5个单词,我们生成两个source-target数据对,这两个source-target对的source都是窗口中间的单词,也就是第三个单词,然后从另外四个单词中随机选取两个作为两个target单词。然后窗口向后移动一个单词,每次向后移动一个位置获取下5个单词,一共循环64次,获取到64X2=128个source-target对,作为一个batch的训练数据。总的思路就是把某个单词和附近的单词组对,作为输入和输出。这里同一个source单词,会被映射到不同的target单词,这样理论上可以获取任意两个单词之间的关系。

比如对于句子"cat and dog play balls on the floor",第一个窗口就是“cat and dog play balls",生成的两个source-target对可能是下面中的任意两个:dog -> catdog -> anddog -> ballsdog -> play

第二个窗口是"and dog play balls on",生成的两个source-target对可能是下面中的任意两个:play -> andplay -> ballsplay -> dogplay -> on

接下来是构建神经网络的过程,我们构建了一个包含一个隐藏层的神经网络,该隐藏层包含300个节点,这个数量和我们要构造的WordEmbedding维度一致。

我们首先随机初始化embeddings矩阵,通过tf.nn.embedding_lookup函数将输入序列转换成WordEmbedding表示作为隐藏层的输入。初始化weights和biases,计算隐藏层的输出。然后计算输出和target结果的交叉熵,使用GradientDescentOptimizer完成一次反向传递,更新可训练的参数,包括embeddings变量。在Validate过程中,对测试数据集中的单词,利用embeddings矩阵计算测试单词和所有其他单词的相似度,输出相似度最高的几个单词,看看它们相关性如何,作为一种验证方式。

通过这个神经网络,就可以完成WordEmbedding的训练,继而应用于其他NLP的任务。

<think>嗯,用户问的是词嵌入Word Embedding上下文嵌入(Contextual Embedding)的区别。我需要先回忆这两个概念的基本定义,然后对比它们的特性应用场景。 首先,词嵌入是给每个单词分配一个固定向量对吧?比如Word2Vec、GloVe这些经典方法。它们的特点是一个对应一个向量,不管这个词出现在哪里,向量都是一样的。比如“银行”在“河岸边的银行”“存钱的银行”里,词向量是相同的。这可能是个问题,因为同一个词在不同上下文中的意思不同。 然后上下文嵌入,像ELMo、BERT这些模型生成的,应该是根据上下文动态调整词向量同一个词在不同句子中会有不同的向量表示。比如“苹果”在“吃苹果”“苹果公司”里的向量不同。这样能更好地捕捉词义的变化。 接下来要考虑它们的实现方式。词嵌入通常通过训练浅层神经网络(如Skip-Gram或CBOW)或矩阵分解(如GloVe)来得到静态向量。而上下文嵌入则使用深度神经网络,比如Transformer,通过处理整个句子来生成每个词的表示。这可能需要更多的数据计算资源。 应用场景方面,词嵌入可能适用于简单的任务,比如文本分类或信息检索,而上下文嵌入更适合需要理解上下文的任务,比如机器翻译、问答系统。不过现在很多任务都转向使用上下文嵌入了,因为效果更好。 还需要注意它们的优缺点。词嵌入的优点是简单、计算效率高,但无法处理一词多义。上下文嵌入解决了这个问题,但计算成本高,模型复杂。可能用户在选择时需要根据任务需求资源情况来决定。 有没有可能用户实际是想了解如何选择这两种方法?或者他们想知道为什么现在很多模型都用上下文嵌入?可能需要进一步解释两者的适用情况,帮助用户做决策。 总之,结构上应该先分别介绍两者,再对比它们的特性,最后总结应用场景优缺点。确保用例子说明,比如“银行”“苹果”在不同上下文中的表现差异,这样更直观。</think>### 词嵌入Word Embedding)与上下文嵌入(Contextual Embedding)的区别 #### 1. **核心定义** - **词嵌入Word Embedding)** 将单词映射到固定维度的稠密向量空间中,使语义相似的词在向量空间中距离较近。 **特点**: - 每个单词对应**唯一固定向量**,与上下文无关。 - 经典方法Word2Vec、GloVe。 - 示例:单词“苹果”在“吃苹果”“苹果公司”中向量相同。 - **上下文嵌入(Contextual Embedding)** 根据单词在句子中的具体语境生成动态向量同一单词在不同上下文中向量不同。 **特点**: - 单词的向量**依赖上下文**动态调整。 - 经典方法:ELMo、BERT、GPT。 - 示例:单词“苹果”在“吃苹果”中指向水果,在“苹果公司”中指向品牌,两者向量不同。 --- #### 2. **关键差异对比** | **特性** | **词嵌入** | **上下文嵌入** | |-------------------|--------------------------------|----------------------------------| | **向量是否固定** | 是(静态) | 否(动态) | | **上下文感知** | 无 | 有 | | **一词多义处理** | 无法区分 | 可区分 | | **模型复杂度** | 简单(浅层网络) | 复杂(深层网络) | | **计算效率** | 高 | 低(需实时计算) | --- #### 3. **技术实现** - **词嵌入** - 通过**全局统计**或**浅层神经网络**训练。 $$ \text{目标函数:} \max \sum_{(w,c)} \log P(c \mid w) \quad (\text{如 Skip-Gram}) $$ - 输出结果:词向量表(如 `word2vec.vectors`)。 - **上下文嵌入** - 使用**深度神经网络(如 Transformer)** 编码整个句子。 $$ \text{输出:} h_i = \text{Transformer}(w_1, w_2, ..., w_n)[i] $$ - 输出结果:每个词的向量依赖句子中所有其他词。 --- #### 4. **应用场景** - **词嵌入适用场景** - 简单语义任务(如文档分类)。 - 资源受限环境(如嵌入式设备)。 - **上下文嵌入适用场景** - 复杂语义理解(如机器翻译、问答系统)。 - 需处理歧义的场景(如“他开了银行账户” vs. “他站在银行门口”)。 --- #### 5. **优缺点总结** - **词嵌入** - ✅ 计算高效,易于部署。 - ❌ 无法捕捉上下文语义,无法处理多义词。 - **上下文嵌入** - ✅ 精准建模语义,支持复杂任务。 - ❌ 计算成本高,需大量训练数据。 --- ### 总结 词嵌入是**静态的单词到向量映射**,而上下文嵌入通过动态编码实现**语境感知的语义表达**。随着预训练语言模型(如 BERT)的普及,上下文嵌入已成为自然语言处理的主流技术,但词嵌入仍在对计算资源敏感的场景中发挥作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值