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

词嵌入向量WordEmbedding是NLP的关键技术,它将单词转化为固定长度向量,解决了一词多义和计算效率问题。本文介绍了WordEmbedding的使用和生成方法,包括其优于one-hot编码的特性,以及通过神经网络,特别是n-gram方法来训练WordEmbedding的步骤。

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

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

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数据,里面是维基百科的数据。

def maybe_download(filename, url):
    """Download a file if not present, and make sure it's the right size."""
    if not os.path.exists(filename):
        filename, _ = urllib.urlretrieve(url + filename, filename)
    return filename


# Read the data into a list of strings.
def read_data(filename):
    """Extract the first file enclosed in a zip file as a list of words."""
    with zipfile.ZipFile(filename) as f:
        data = tf.compat.as_str(f.read(f.namelist()[0])).split()
    return data

def collect_data(vocabulary_size=10000):
    url = 'http://mattmahoney.net/dc/'
    filename = maybe_download('enwik8.zip', url)
    vocabulary = read_data(filename)
    print(vocabulary[:7])
    data, count, dictionary, reverse_dictionary = build_dataset(vocabulary, vocabulary_size)
    
<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)的普及,上下文嵌入已成为自然语言处理的主流技术,但词嵌入仍在对计算资源敏感的场景中发挥作用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值