深度学习与词向量:开启自然语言处理的新大门​

在当今数字化时代,自然语言处理(Natural Language Processing,NLP)已经成为人工智能领域中最为活跃和具有挑战性的研究方向之一。从智能语音助手到机器翻译,从文本分类到情感分析,NLP 技术的应用无处不在,深刻地改变着人们与计算机交互的方式 ,也为众多行业带来了前所未有的机遇和变革。​

深度学习,作为机器学习领域的一个重要分支,通过构建具有多个层次的神经网络模型,能够自动从大量数据中学习到复杂的模式和特征表示。在 NLP 领域,深度学习技术的引入带来了革命性的突破,使得许多以往难以解决的问题得到了有效的处理。例如,在语音识别任务中,深度学习模型能够准确地将人类语音转换为文本,大大提高了识别准确率,为智能语音交互奠定了坚实基础;在机器翻译中,基于深度学习的神经机器翻译模型能够生成更加流畅、自然的译文,显著提升了翻译质量和效率。​

而在深度学习应用于 NLP 的过程中,词向量转换起着举足轻重的关键作用。词向量,简单来说,就是将自然语言中的单词映射为低维实数向量的一种表示方式。传统的文本表示方法,如 One - Hot 编码,虽然简单直观,但存在着维度灾难和无法捕捉词与词之间语义关系的严重缺陷。而词向量则通过分布式表示的思想,将单词的语义信息编码到低维向量空间中,使得语义相近的单词在向量空间中也彼此靠近 。这种表示方式不仅大大降低了数据的维度,提高了计算效率,更重要的是,它为计算机理解和处理自然语言提供了一种有效的途径,使得深度学习模型能够更好地捕捉文本中的语义和语法信息,从而在各种 NLP 任务中取得优异的性能表现。​

例如,在文本分类任务中,通过将文本中的每个单词转换为词向量,然后将这些词向量作为深度学习模型的输入,模型可以学习到不同类别文本的特征模式,从而准确地对文本进行分类;在情感分析中,词向量能够帮助模型理解文本中词语所蕴含的情感倾向,进而判断整个文本的情感极性(正面、负面或中性)。可以说,词向量转换是深度学习在 NLP 领域得以成功应用的基石,它为自然语言处理任务搭建了一座从符号化表示到数值化表示的桥梁,让计算机能够像处理数值数据一样处理自然语言,开启了自然语言处理的全新篇章。​

词向量基础:从概念到数学表达​

(一)词向量是什么​

词向量,也被称为词嵌入(Word Embedding),是自然语言处理领域中一种至关重要的技术,它旨在将自然语言中的单词映射到低维实数向量空间中,为每个单词赋予一个固定维度的向量表示 。在传统的自然语言处理方法中,如 One-Hot 编码,每个单词被表示为一个很长的向量,向量的维度等于词汇表的大小,且只有一个维度的值为 1,其余均为 0 。这种表示方式虽然简单直接,但存在严重的缺陷。一方面,它会导致向量维度极高,造成维度灾难,增加计算成本和存储负担;另一方面,One-Hot 编码无法体现单词之间的语义关系,例如 “苹果” 和 “香蕉” 这两个语义相近的词,在 One-Hot 编码下的向量几乎没有相似性,因为它们的向量中只有一个位置不同,其余全为 0 。​

而词向量则通过分布式表示的方式,有效地解决了这些问题。词向量的核心思想基于分布式语义假说,即 “你可以通过一个词的上下文来理解它的含义”。通过对大量文本数据的学习,词向量能够捕捉到单词之间的语义和句法关系,将语义相近的单词映射到向量空间中相近的位置 。例如,在一个训练好的词向量模型中,“国王” 和 “女王” 这两个词的向量在空间中的距离会比较近,因为它们在语义上都与皇室相关;同样,“苹果”“香蕉”“橙子” 等表示水果的词,它们的词向量也会彼此靠近 。这种表示方式使得计算机能够从向量的角度理解单词之间的关系,为后续的自然语言处理任务提供了更加丰富和有效的语义信息。​

(二)词向量的数学表达​

在数学上,词向量通常被表示为一个​

d

维的实数值向量,即​

v∈Rd

,其中​

d

是向量的维度,一般取值在几十到几百之间,常见的有 100 维、200 维、300 维等 。向量中的每个维度都代表了单词的某种语义特征,这些特征不是人为定义的,而是通过模型在大规模语料上的训练自动学习得到的 。​

例如,对于单词 “苹果”,其词向量可能表示为​

v苹果​=[0.23,−0.15,0.07,⋯,0.31]

(这里假设向量维度为​

d

,仅展示了部分维度的值) 。这个向量中的每一个数值都反映了 “苹果” 在相应语义特征维度上的取值,虽然我们很难直观地解释每个维度具体代表什么含义,但通过向量之间的运算和比较,可以揭示单词之间的语义关系 。​

一种常用的衡量词向量之间语义关系的方法是计算它们的余弦相似度。余弦相似度通过计算两个向量的夹角余弦值来衡量它们的相似程度,公式为:​

cos(v1​,v2​)=∥v1​∥∥v2​∥v1​⋅v2​​

​

​

其中,​

v1​

和​

v2​

是两个词向量,​

v1​⋅v2​

表示它们的点积,​

∥v1​∥

和​

∥v2​∥

分别表示两个向量的模长 。余弦相似度的值越接近 1,表示两个向量的方向越相似,即对应的单词语义越相近;值越接近 -1,表示方向越相反;值为 0 时,表示两个向量正交,语义上没有明显的相关性 。​

例如,假设有两个词向量​

v苹果​

和​

v香蕉​

,通过计算它们的余弦相似度,如果得到的值较高,比如 0.8,就说明 “苹果” 和 “香蕉” 在语义上具有较高的相似性,这与我们的常识相符,因为它们都属于水果类别 。而如果计算​

v苹果​

和​

v汽车​

的余弦相似度,得到的值可能很低,比如 0.1,表明 “苹果” 和 “汽车” 在语义上差异较大 。通过这种方式,词向量的数学表达为计算机理解和处理自然语言的语义提供了一种有效的量化手段。​

词向量转换原理剖析​

(一)Word2Vec 模型详解​

1. CBOW 模型​

CBOW(Continuous Bag - of - Words)模型,即连续词袋模型,是 Word2Vec 中一种基于上下文预测目标单词的模型。其核心原理基于这样一个假设:一个单词的语义可以由它周围的上下文单词来很好地表示 。例如,在句子 “I like apples” 中,“like” 这个单词的语义可以通过其上下文单词 “I” 和 “apples” 来推断。​

在 CBOW 模型中,首先会将上下文单词映射为词向量。假设词汇表大小为​

V

,词向量维度为​

d

,那么每个单词都可以用一个​

d

维的向量来表示。对于给定的上下文单词,模型会将它们的词向量进行求和或平均等操作,得到一个综合的上下文向量 。以平均操作为例,假设上下文单词有​

n

个,其词向量分别为​

v1​,v2​,⋯,vn​

,则上下文向量​

c

的计算方式为:​

c=n1​i=1∑n​vi​

​

​

然后,将这个上下文向量输入到一个神经网络中,经过一系列的线性变换和非线性激活函数(通常使用 softmax 函数),输出一个概率分布,这个概率分布表示了在给定上下文下,每个单词作为目标单词的可能性 。假设神经网络的权重矩阵为​

W

(大小为​

d×V

),偏置向量为​

b

(大小为​

V

),则目标单词​

w

的预测概率​

P(w∣c)

的计算公式为:​

P(w∣c)=∑w′∈V​exp(wo′T​c+bw′​)exp(woT​c+bw​)​

​

​

其中,​

wo​

是目标单词​

w

对应的输出层权重向量,​

wo′​

是词汇表中其他单词​

w′

对应的输出层权重向量 。​

在训练过程中,CBOW 模型通过最小化预测概率与真实目标单词的交叉熵损失来学习词向量和神经网络的参数 。交叉熵损失函数​

L

的计算公式为:​

L=−i=1∑m​logP(wi​∣ci​)

​

​

其中,​

m

是训练样本的数量,​

wi​

是第​

i

个样本的目标单词,​

ci​

是第​

i

个样本的上下文向量 。​

CBOW 模型具有训练速度快的优势,因为它是根据上下文预测一个目标单词,计算量相对较小,特别适合处理大规模语料库 。此外,由于它利用了上下文的信息,对于罕见词的处理效果较好,因为即使某个词本身出现频率较低,但通过其上下文也能学习到较为准确的词向量 。然而,CBOW 模型也存在一定的缺点,它对于相似的单词,其向量表示可能过于相似,导致区分相似词的能力不足 。例如,“汽车” 和 “轿车” 这两个语义相近的词,在 CBOW 模型生成的词向量中可能差异不大,难以准确区分它们在语义上的细微差别 。​

2. Skip - gram 模型​

Skip - gram 模型与 CBOW 模型相反,它是通过目标单词预测上下文的模型 。其基本思想是,给定一个中心单词,模型试图预测该单词周围一定窗口大小内的上下文单词 。例如,对于句子 “我喜欢吃苹果”,当中心词为 “苹果” 时,Skip - gram 模型会尝试预测出 “我”“喜欢”“吃” 这些上下文单词 。​

在 Skip - gram 模型中,同样先将输入的中心单词映射为词向量 。假设中心单词为​

w

,其词向量为​

vw​

。然后,通过与输出层的权重矩阵​

W

(大小为​

d×V

)相乘,再经过 softmax 函数,得到上下文单词的概率分布 。对于上下文单词​

c

,其在给定中心词​

w

下的预测概率​

P(c∣w)

的计算公式为:​

P(c∣w)=∑c′∈V​exp(vc′T​vw​)exp(vcT​vw​)​

​

​

其中,​

vc​

是上下文单词​

c

对应的输出层权重向量,​

vc′​

是词汇表中其他上下文单词​

c′

对应的输出层权重向量 。​

Skip - gram 模型的训练目标是最大化给定中心词预测上下文单词的条件概率之和 。其损失函数同样可以采用交叉熵损失函数,形式如下:​

L=−i=1∑m​j∈context(wi​)∑​logP(cj​∣wi​)

​

​

其中,​

m

是训练样本的数量,​

context(wi​)

表示中心词​

wi​

的上下文单词集合,​

cj​

是中心词​

wi​

的上下文中的第​

j

个单词 。​

Skip - gram 模型的优点在于它能够更好地捕捉相似单词之间的差异 。因为它是通过一个单词去预测多个上下文单词,能够学习到单词在不同语境下的细微语义差别 。例如,对于 “银行” 这个多义词,在金融领域和河岸领域的不同语境下,Skip - gram 模型可以通过不同的上下文单词学习到不同的语义特征,从而在词向量中体现出这些差异 。然而,Skip - gram 模型的训练速度相对较慢,因为它需要预测多个上下文单词,计算量较大,在处理大规模语料库时耗时较长 。​

(二)GloVe 模型原理​

GloVe(Global Vectors for Word Representation)模型是一种基于全局词频统计信息来学习词向量的模型 。它的基本原理结合了基于矩阵分解的方法和基于上下文的方法 。​

GloVe 模型首先构建一个全局词共现矩阵​

X

,其中​

Xij​

表示单词​

i

和单词​

j

在整个语料库中共同出现的次数 。然后,定义一个函数​

f(Xij​)

来对共现次数进行加权处理,通常采用如下形式的加权函数:​

f(Xij​)={(Xij​/Xmax​)α1​if Xij​<Xmax​otherwise​

​

​

其中,​

Xmax​

是共现矩阵中的最大元素值,​

α

是一个超参数,通常取值为 0.75 。​

GloVe 模型假设存在两个词向量矩阵​

W

和​

W′

(大小均为​

V×d

,其中​

V

是词汇表大小,​

d

是词向量维度),分别对应单词和其上下文的向量表示 。模型的目标是学习这两个矩阵,使得词向量能够很好地反映单词之间的共现关系 。通过最小化以下目标函数来学习词向量:​

J=i=1∑V​j=1∑V​f(Xij​)(wiT​wj′​+bi​+bj′​−logXij​)2

​

​

其中,​

wi​

和​

wj′​

分别是矩阵​

W

和​

W′

中第​

i

行和第​

j

行的词向量,​

bi​

和​

bj′​

是对应的偏置项 。​

GloVe 模型的优势在于它利用了全局统计信息,能够学习到更加准确和丰富的词向量表示 。相比于 Word2Vec 只考虑局部上下文信息,GloVe 通过全局共现矩阵能够捕捉到单词在整个语料库中的语义关系,对于处理多义词等问题表现更出色 。例如,对于多义词 “苹果”,在不同的语境中与其他词的共现情况不同,GloVe 模型可以通过全局共现矩阵学习到这些不同的语义关联,从而生成更准确的词向量 。然而,GloVe 模型的训练过程相对复杂,需要计算全局词共现矩阵,这在大规模语料库上的计算量较大,而且对于低频词的处理效果可能不如 Word2Vec 模型 。​

词向量转换方法对比​

(一)Word2Vec 与 GloVe 对比​

在词向量转换的领域中,Word2Vec 和 GloVe 是两种极为重要且广泛应用的模型,它们各自具有独特的特点和优势,在不同的场景下发挥着关键作用 。下面将从多个方面对这两种模型进行深入对比 。​

1. 模型原理​

Word2Vec 基于神经网络,通过预测上下文与目标词之间的关系来学习词向量 。其中,CBOW 模型利用上下文单词预测中心词,Skip - gram 模型则相反,通过中心词预测上下文单词 。这种基于局部上下文的预测方式,使得 Word2Vec 能够捕捉到单词在局部语境中的语义信息 。例如,在句子 “She eats an apple” 中,CBOW 模型会根据 “She”“eats”“an” 这些上下文单词来预测 “apple”,从而学习到 “apple” 在这个语境下的语义表示 。​

而 GloVe 模型基于全局词频统计信息,通过构建词共现矩阵,并对其进行分解来学习词向量 。它假设词向量之间的点积与单词共现频率的对数成线性关系,通过最小化这种差异来得到词向量 。例如,在一个包含大量文本的语料库中,GloVe 会统计所有单词之间的共现次数,如 “apple” 和 “fruit” 经常一起出现,“car” 和 “vehicle” 经常一起出现,通过这些共现信息来学习单词的语义关系 。与 Word2Vec 不同,GloVe 利用的是全局信息,能够捕捉到单词在整个语料库中的语义关联 。​

2. 训练速度​

Word2Vec 在训练速度方面具有一定优势,尤其是在采用负采样等优化技术后 。以 CBOW 模型为例,由于它是基于上下文预测一个目标词,计算量相对较小,训练速度较快,特别适合处理大规模语料库 。在一些实际应用中,如对海量新闻文本进行词向量训练时,Word2Vec 能够在较短时间内完成训练,为后续的文本分析任务提供支持 。​

相比之下,GloVe 的训练过程相对复杂 。它需要先构建全局词共现矩阵,这在大规模语料库上的计算量非常大,而且在对共现矩阵进行分解时也需要耗费较多的时间和计算资源 。例如,对于一个包含数十亿单词的语料库,构建共现矩阵可能需要占用大量内存,并且矩阵分解的过程也会比较耗时 ,导致 GloVe 的训练速度相对较慢 。​

3. 词向量质量​

在词向量质量方面,两者各有优劣 。Word2Vec 对于捕捉单词的局部语义和语法关系表现出色 。例如,在处理一些短语结构或特定语境下的语义表达时,Word2Vec 能够通过局部上下文学习到准确的词向量表示 。在句子 “He runs fast” 中,通过上下文可以学习到 “runs” 与 “fast” 之间的语义关联,从而得到准确反映这种关系的词向量 。然而,由于 Word2Vec 主要关注局部信息,对于一些需要全局语义理解的任务,如主题建模,可能表现不如 GloVe 。​

GloVe 由于利用了全局统计信息,在捕捉单词之间的全局语义关系和处理多义词方面具有优势 。对于多义词 “bank”,在金融领域和河岸领域,GloVe 可以通过全局共现矩阵学习到不同语境下与 “bank” 共现的不同单词,从而生成更准确的词向量,能够区分其在不同语义下的含义 。在语义相似度计算和词语类比任务中,GloVe 也往往能取得较好的效果 。​

4. 对不同规模语料库适应性​

对于小规模语料库,Word2Vec 中的 CBOW 模型通常能取得较好的效果 。因为 CBOW 模型训练速度快,能够在有限的数据上快速收敛,学习到较为准确的词向量 。例如,在一些特定领域的小型数据集上,如医学领域的专业文献摘要数据集,CBOW 模型可以快速训练,得到适用于该领域文本分析的词向量 。​

而 GloVe 在大规模语料库上能够充分发挥其优势 。随着语料库规模的增大,全局统计信息更加丰富和准确,GloVe 能够更好地捕捉单词之间的语义关系,生成高质量的词向量 。在处理像 Wikipedia 这样的大规模文本语料库时,GloVe 能够学习到更全面、准确的语义信息 。​

5. 场景选择策略​

在实际应用中,选择 Word2Vec 还是 GloVe 应根据具体场景来决定 。如果任务对训练速度要求较高,且主要关注局部上下文信息,如文本分类、情感分析等任务,同时语料库规模较大,那么 Word2Vec 是一个不错的选择 。例如,在对社交媒体文本进行实时情感分析时,Word2Vec 能够快速训练并提供有效的词向量表示 。​

如果任务需要捕捉单词之间的全局语义关系,对词向量质量要求较高,且有足够的计算资源和时间进行训练,如语义相似度计算、知识图谱构建等任务,那么 GloVe 更为合适 。在构建一个通用的语义知识库时,GloVe 生成的词向量能够更好地反映单词之间的语义关联 。​

(二)其他词向量转换方法简介​

除了 Word2Vec 和 GloVe 这两种主流的词向量转换方法外,还有一些其他方法也在自然语言处理领域中得到了应用,它们各自具有独特的特点,为词向量的学习提供了不同的思路和解决方案 。​

FastText 是一种快速文本分类和词向量学习模型 ,由 Facebook AI Research 开发 。它的一个重要特点是引入了子词嵌入(subword embedding)的概念 。在传统的词向量模型中,如 Word2Vec,每个单词被视为一个不可分割的原子单元 。而 FastText 认为单词内部的字符结构也包含着重要的语义信息 。例如,对于单词 “apple”,FastText 会将其拆分为多个字符 n - gram,如 “<ap”“app”“pple”“le>” 等 。通过这些子词的嵌入向量来表示单词,FastText 能够更好地处理未登录词(Out - Of - Vocabulary,OOV)问题 。即使遇到训练语料库中没有出现过的单词,也可以通过其组成的子词向量来生成词向量 。这使得 FastText 在处理一些包含大量生僻词或新词的文本时具有优势 。​

FastText 的模型架构与 Word2Vec 中的 CBOW 模型非常相似 ,同样包含输入层、隐含层和输出层 。不同之处在于,FastText 的输入不仅包括单词的词向量,还包括单词的字符级 n - gram 向量 。在文本分类任务中,FastText 将输入文本中所有单词及其 n - gram 的向量叠加平均,得到文本的向量表示,然后通过 softmax 分类器进行分类 。这种方法在一些文本分类任务中表现出了较高的准确率和效率 ,尤其是在处理短文本时,能够利用子词信息提高文本的表示能力 。​

词向量转换代码实战​

(一)基于 Word2Vec 的代码实现​

1. 数据预处理​

在使用 Word2Vec 进行词向量训练之前,需要对文本数据进行预处理,以提高模型的训练效果。以下是使用 Python 和相关库进行数据预处理的代码示例:​

​

pyt取消自动换行复制

import nltk​

from nltk.corpus import stopwords​

from nltk.tokenize import word_tokenize​

import string​

​

# 下载停用词表​

nltk.download('stopwords')​

nltk.download('punkt')​

​

# 定义停用词和标点符号​

stop_words = set(stopwords.words('english'))​

punctuations = set(string.punctuation)​

​

# 示例文本​

text = "This is an example sentence. It contains some stopwords and punctuations."​

​

# 分词​

tokens = word_tokenize(text.lower())​

​

# 去除停用词和标点符号​

filtered_tokens = [token for token in tokens if token not in stop_words and token not in punctuations]​

​

print(filtered_tokens)​

​

在上述代码中:​

  • nltk是一个常用的自然语言处理工具包,word_tokenize函数用于将文本分割成单词 。​
  • stopwords是 nltk 提供的停用词表,停用词是指那些在文本中频繁出现但对文本语义贡献较小的词,如 “is”“an”“the” 等 ,去除它们可以减少噪声,提高模型训练效率 。​
  • string.punctuation包含了常见的标点符号,去除标点符号可以使模型专注于单词本身的语义 。​
  • 通过列表推导式,将不在停用词表和标点符号集合中的单词保留下来,得到预处理后的单词列表 。​

2. 模型训练​

使用 Gensim 库训练 Word2Vec 模型,Gensim 是一个功能强大的文本处理库,提供了便捷的接口来训练 Word2Vec 模型 。以下是训练 Word2Vec 模型的代码:​

​

p取消自动换行复制

from gensim.models import Word2Vec​

​

# 假设filtered_tokens是预处理后的单词列表​

sentences = [filtered_tokens] # 这里将单个句子作为示例,实际应用中应包含多个句子​

​

# 训练Word2Vec模型​

model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)​

​

在上述代码中:​

  • vector_size参数指定了词向量的维度,这里设置为 100,即每个单词将被表示为一个 100 维的向量 。向量维度的选择会影响模型的表达能力和计算复杂度,一般来说,维度越高,模型能捕捉到的语义信息越丰富,但计算成本也会增加 。​
  • window参数表示上下文窗口的大小,这里设置为 5,意味着在训练时,会考虑目标单词前后各 5 个单词作为上下文 。窗口大小决定了模型对局部上下文信息的捕捉范围,较小的窗口更关注单词的局部语境,较大的窗口能捕捉到更广泛的上下文关系,但也可能引入过多的噪声 。​
  • min_count参数设置了单词的最小出现次数,只有出现次数大于等于该值的单词才会被纳入词汇表进行训练,这里设置为 1 。通过设置min_count,可以过滤掉低频词,减少模型训练的负担,同时避免因低频词的噪声影响模型性能 。​
  • workers参数指定了训练模型时使用的线程数,这里设置为 4,多线程可以加快模型的训练速度 。​

3. 词向量获取与应用​

训练好 Word2Vec 模型后,可以从模型中获取词向量,并将其应用于各种自然语言处理任务 。以下是获取词向量并计算单词相似度的代码示例:​

​

py取消自动换行复制

# 获取单词的词向量​

word = "example"​

vector = model.wv[word]​

print(f"{word}的词向量: {vector}")​

​

# 计算两个单词的相似度​

similarity = model.wv.similarity("example", "sentence")​

print(f"example和sentence的相似度: {similarity}")​

​

在上述代码中:​

  • 通过model.wv[word]可以获取指定单词的词向量 。​
  • 使用model.wv.similarity方法可以计算两个单词之间的余弦相似度,相似度值越接近 1,表示两个单词的语义越相近 。​

在文本分类任务中的应用示例:​

​

p取消自动换行复制

​

在上述文本分类代码中:​

  • 首先从sklearn.datasets中加载 20 Newsgroups 数据集,这是一个广泛用于文本分类研究的数据集,包含了 20 个不同主题的新闻文章 。​
  • preprocess_and_vectorize函数对输入的文本数据进行预处理,包括分词、去除停用词和标点符号,然后使用TfidfVectorizer将预处理后的文本转换为 TF - IDF 向量表示 。TF - IDF(Term Frequency - Inverse Document Frequency)是一种统计方法,用于评估一个词对于一个文档集或一个语料库中的一份文档的重要程度 。通过这种方式,将文本数据转换为适合机器学习模型处理的数值特征 。​
  • 使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占比 20%,并设置随机种子random_state为 42,以确保实验的可重复性 。​
  • 使用逻辑回归模型LogisticRegression在训练集上进行训练,逻辑回归是一种常用的分类算法,它通过构建线性模型来预测文本的类别 。​
  • 对测试集数据进行同样的预处理和向量转换后,使用训练好的逻辑回归模型进行预测,并通过accuracy_score函数计算预测准确率,以评估模型在文本分类任务中的性能 。​

(二)基于 GloVe 的代码实现​

1. 数据准备与模型训练​

GloVe 模型通常使用预训练的词向量,也可以利用自己的数据进行训练或微调 。以下是加载 GloVe 预训练模型以及利用自己的数据进行训练微调的代码示例:​

​

p取消自动换行复制

import numpy as np​

from gensim.models import KeyedVectors​

​

# 下载并加载预训练的GloVe模型(这里假设已下载glove.6B.100d.txt)​

glove_file = 'glove.6B.100d.txt'​

model = KeyedVectors.load_word2vec_format(glove_file, binary=False)​

​

# 假设自己的文本数据​

own_text = [["this", "is", "my", "own", "sentence"], ["another", "example", "sentence"]]​

​

# 将自己的数据转换为适合训练的格式(这里简单处理为单词列表)​

own_tokens = []​

for sentence in own_text:​

own_tokens.extend(sentence)​

​

# 利用自己的数据进行训练微调(这里简单示例,实际可能需要更多步骤和参数调整)​

for token in own_tokens:​

if token not in model:​

new_vector = np.random.rand(100) # 随机初始化新单词的向量​

model.add(token, new_vector)​

​

​

在上述代码中:​

  • 使用KeyedVectors.load_word2vec_format函数加载预训练的 GloVe 模型,这里假设预训练模型文件为glove.6B.100d.txt,binary=False表示模型文件是文本格式 。​
  • 对于自己的文本数据,先将其转换为单词列表own_tokens 。​
  • 遍历自己的数据中的单词,如果单词不在预训练模型的词汇表中,则随机初始化一个 100 维的向量(与预训练模型的向量维度一致),并使用model.add方法将新单词及其向量添加到模型中 。这是一种简单的利用自己数据进行微调的方式,实际应用中可能需要更复杂的训练过程和参数调整 。​

2. 词向量使用​

在实际自然语言处理任务中,如情感分析任务,可以使用 GloVe 词向量 。以下是一个基于 Keras 和 GloVe 词向量的简单情感分析代码示例:​

​

pytho取消自动换行复制

from keras.preprocessing.text import Tokenizer​

from keras.preprocessing.sequence import pad_sequences​

from keras.models import Sequential​

from keras.layers import Embedding, LSTM, Dense​

import numpy as np​

​

# 示例文本数据和标签​

texts = ["I love this product", "This is terrible", "Great experience", "Bad service"]​

labels = [1, 0, 1, 0]​

​

# 文本预处理和转换为序列​

tokenizer = Tokenizer()​

tokenizer.fit_on_texts(texts)​

sequences = tokenizer.texts_to_sequences(texts)​

max_length = max([len(seq) for seq in sequences])​

padded_sequences = pad_sequences(sequences, maxlen=max_length)​

​

# 获取GloVe词向量矩阵​

embedding_dim = 100​

embedding_matrix = np.zeros((len(tokenizer.word_index) + 1, embedding_dim))​

for word, i in tokenizer.word_index.items():​

if word in model:​

​

在上述代码中:​

  • 使用Tokenizer对文本数据进行预处理,将文本转换为数字序列 。fit_on_texts方法用于构建词汇表,texts_to_sequences方法将文本转换为对应的数字序列 。​
  • 使用pad_sequences函数将所有序列填充到相同的长度max_length,以满足模型输入的要求 。​
  • 构建 GloVe 词向量矩阵embedding_matrix,遍历词汇表中的单词,如果单词在 GloVe 模型中存在,则将其对应的词向量赋值给embedding_matrix中相应的位置 。​
  • 使用 Keras 构建一个简单的 LSTM(长短期记忆网络)情感分析模型 。Embedding层用于将输入的数字序列转换为词向量表示,这里使用预训练的 GloVe 词向量矩阵进行初始化,并设置trainable=False表示在训练过程中不更新这些词向量 。​
  • LSTM层用于处理序列数据,捕捉文本中的语义和上下文信息 。​
  • 最后通过一个Dense层和sigmoid激活函数进行二分类预测,输出文本的情感极性(正面或负面) 。​
  • 使用adam优化器和binary_crossentropy损失函数对模型进行编译,并在训练数据上进行 10 个 epoch 的训练,每个 batch 的大小为 2 。​

词向量转换的应用场景​

(一)文本分类​

在自然语言处理领域,文本分类是一项基础且重要的任务,其旨在将给定的文本划分到预先定义好的类别中 。词向量转换在文本分类中扮演着至关重要的角色,它能够将文本中的单词转化为计算机易于处理的向量形式,从而为分类模型提供有效的特征表示 。以新闻分类为例,以下将详细展示从文本转换为词向量到输入分类模型的流程和代码实现 。​

假设我们有一个新闻数据集,其中包含不同类别的新闻文章,如政治、体育、娱乐、科技等 。首先,需要对文本数据进行预处理 。使用 Python 的nltk库进行分词、去除停用词和标点符号等操作 。代码如下:​

​

p取消自动换行复制

import nltk​

from nltk.corpus import stopwords​

from nltk.tokenize import word_tokenize​

import string​

​

# 下载停用词表​

nltk.download('stopwords')​

nltk.download('punkt')​

​

# 定义停用词和标点符号​

stop_words = set(stopwords.words('english'))​

punctuations = set(string.punctuation)​

​

# 示例新闻文本​

news_text = "Apple is planning to launch a new iPhone next month. This will be a major event in the tech industry."​

​

# 分词​

tokens = word_tokenize(news_text.lower())​

​

# 去除停用词和标点符号​

filtered_tokens = [token for token in tokens if token not in stop_words and token not in punctuations]​

​

print(filtered_tokens)​

​

在上述代码中,通过word_tokenize函数将新闻文本分割成单词,然后利用列表推导式去除了停用词和标点符号 。接下来,使用 Word2Vec 模型将这些预处理后的单词转换为词向量 。这里使用gensim库来训练 Word2Vec 模型 。代码如下:​

​

py取消自动换行复制

from gensim.models import Word2Vec​

​

# 假设filtered_tokens是预处理后的单词列表​

sentences = [filtered_tokens] # 实际应用中应包含多个句子​

​

# 训练Word2Vec模型​

model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, workers=4)​

​

在这个代码中,vector_size设置为 100,即每个单词的词向量维度为 100;window设置为 5,表示上下文窗口大小为 5,即考虑目标单词前后各 5 个单词;min_count设置为 1,表示出现次数大于等于 1 的单词才会被纳入训练;workers设置为 4,表示使用 4 个线程进行训练,以加快训练速度 。​

得到词向量后,需要将文本转换为固定长度的向量表示,以便输入到分类模型中 。一种常见的方法是将文本中所有单词的词向量进行平均,得到文本的向量表示 。代码如下:​

​

py取消自动换行复制

import numpy as np​

​

# 获取文本的词向量表示​

def get_text_vector(tokens, model):​

vectors = []​

for token in tokens:​

if token in model.wv:​

vectors.append(model.wv[token])​

if not vectors:​

return np.zeros(model.vector_size)​

return np.mean(vectors, axis=0)​

​

text_vector = get_text_vector(filtered_tokens, model)​

print(text_vector)​

​

在上述代码中,get_text_vector函数遍历文本中的每个单词,如果单词在 Word2Vec 模型的词汇表中,则将其词向量添加到vectors列表中 。最后,通过np.mean函数计算这些词向量的平均值,得到文本的向量表示 。如果文本中没有单词在词汇表中,则返回一个全零向量 。​

接下来,使用逻辑回归模型进行新闻分类 。假设我们有一个包含新闻文本及其对应类别的数据集,将其划分为训练集和测试集 。代码如下:​

​

py取消自动换行复制

from sklearn.linear_model import LogisticRegression​

from sklearn.model_selection import train_test_split​

from sklearn.metrics import accuracy_score​

​

# 假设news_texts是新闻文本列表,news_labels是对应的类别标签列表​

news_texts = ["Apple is planning to launch a new iPhone next month. This will be a major event in the tech industry.",​

"The football team won the championship with a great performance.",​

"The concert last night was amazing. The singer gave a wonderful show."]​

news_labels = ["tech", "sports", "entertainment"]​

​

# 预处理文本并获取词向量表示​

text_vectors = []​

for text in news_texts:​

tokens = word_tokenize(text.lower())​

filtered_tokens = [token for token in tokens if token not in stop_words and token not in punctuations]​

text_vector = get_text_vector(filtered_tokens, model)​

text_vectors.append(text_vector)​

​

# 划分训练集和测试集​

X_train, X_test, y_train, y_test = train_test_split(text_vectors, news_labels, test_size=0.2, random_state=42)​

​

# 训练逻辑回归模型​

clf = LogisticRegression()​

clf.fit(X_train, y_train)​

​

# 预测并计算准确率​

y_pred = clf.predict(X_test)​

accuracy = accuracy_score(y_test, y_pred)​

print(f"新闻分类准确率: {accuracy}")​

​

在这个代码中,首先对所有新闻文本进行预处理并获取词向量表示 。然后,使用train_test_split函数将数据集划分为训练集和测试集,其中测试集占比 20% 。接着,使用逻辑回归模型LogisticRegression在训练集上进行训练 。最后,在测试集上进行预测,并通过accuracy_score函数计算预测准确率 。通过这样的流程,利用词向量转换和分类模型,实现了对新闻文本的分类 。​

(二)机器翻译​

在机器翻译领域,词向量发挥着举足轻重的作用,它为机器翻译模型提供了有效的语义表示,使得模型能够更好地理解源语言和目标语言之间的语义关系,从而实现更准确的翻译 。​

词向量在机器翻译中的核心作用在于将源语言和目标语言中的单词映射到同一个向量空间中,使得语义相近的单词在向量空间中具有相近的位置 。这样,机器翻译模型在进行翻译时,可以通过在向量空间中寻找与源语言单词向量最相似的目标语言单词向量,来实现单词级别的翻译 。例如,对于英语单词 “apple”,其词向量在向量空间中与中文单词 “苹果” 的词向量距离较近,模型在翻译时就可以根据这种语义相似性,将 “apple” 准确地翻译为 “苹果” 。​

基于词向量的机器翻译模型结构通常采用编码器 - 解码器架构 。编码器负责将源语言文本转换为向量表示,这个向量表示包含了源语言文本的语义信息 。解码器则根据编码器输出的向量表示,生成目标语言文本 。在这个过程中,词向量作为输入,帮助编码器和解码器更好地理解文本的语义 。以经典的基于注意力机制的神经机器翻译模型为例,其结构如下:​

在编码器部分,首先将源语言文本中的每个单词转换为词向量 。假设源语言文本为 “Hello, world!”,将每个单词 “Hello”“,”“world”“!” 转换为对应的词向量 。然后,通过循环神经网络(如 LSTM 或 GRU)对这些词向量进行处理,LSTM 或 GRU 能够捕捉单词之间的上下文信息,从而生成包含源语言语义的上下文向量 。​

在解码器部分,同样将目标语言的单词转换为词向量 。以生成翻译结果 “你好,世界!” 为例,首先将目标语言的起始标记 “” 转换为词向量,输入到解码器中 。解码器根据编码器输出的上下文向量和当前输入的词向量,通过注意力机制计算出对源语言每个位置的注意力权重 。注意力机制的作用是让解码器在生成目标语言单词时,能够聚焦于源语言中与之相关的部分 。例如,在生成 “你好” 时,注意力机制会使得解码器更关注源语言中的 “Hello” 部分 。然后,解码器根据注意力权重和上下文向量,通过全连接层和 softmax 函数,计算出下一个单词的概率分布,选择概率最大的单词作为生成的翻译结果 。这个过程不断重复,直到生成结束标记 “”,完成整个翻译过程 。​

在训练基于词向量的机器翻译模型时,通常使用大量的平行语料库,即包含源语言文本及其对应目标语言翻译的数据集 。训练过程中,模型通过最小化预测的目标语言单词与真实目标语言单词之间的损失函数(如交叉熵损失函数)来调整模型的参数,使得模型能够逐渐学习到源语言和目标语言之间的映射关系 。​

以下是一个简单的基于 Python 和torch库的机器翻译代码示例,展示词向量在翻译任务中的使用:​

​

python取消自动换行复制

import torch​

import torch.nn as nn​

import torch.optim as optim​

​

# 定义源语言和目标语言的词汇表​

src_vocab = {'<pad>': 0, 'hello': 1, 'world': 2}​

tgt_vocab = {'<pad>': 0, '你好': 1, '世界': 2, '<sos>': 3, '<eos>': 4}​

​

# 定义词向量维度​

embedding_dim = 100​

​

# 定义编码器​

class Encoder(nn.Module):​

def __init__(self, input_dim, embedding_dim, hidden_dim):​

super(Encoder, self).__init__()​

self.embedding = nn.Embedding(input_dim, embedding_dim)​

self.rnn = nn.LSTM(embedding_dim, hidden_dim)​

​

def forward(self, src):​

embedded = self.embedding(src)​

outputs, (hidden, cell) = self.rnn(embedded)​

return hidden, cell​

​

​

# 定义解码器​

class Decoder(nn.Module):​

def __init__(self, output_dim, embedding_dim, hidden_dim):​

super(Decoder, self).__init__()​

​

在上述代码中:​

  • 首先定义了源语言和目标语言的词汇表src_vocab和tgt_vocab,以及词向量维度embedding_dim 。​
  • 然后定义了编码器Encoder,它将源语言单词通过词向量嵌入层nn.Embedding转换为词向量,再通过 LSTM 网络生成上下文向量 。​
  • 接着定义了解码器Decoder,它将目标语言单词转换为词向量,通过 LSTM 网络和全连接层生成下一个单词的预测 。​
  • 最后定义了机器翻译模型Seq2Seq,它整合了编码器和解码器,并实现了训练过程 。在训练过程中,使用了交叉熵损失函数和 Adam 优化器 。通过这个简单的示例,可以看到词向量在机器翻译模型中的具体应用和训练过程 。​

(三)推荐系统​

在推荐系统领域,词向量技术为用户和商品的表示提供了一种强大的方式,通过将用户和商品转换为向量表示,能够更有效地捕捉它们之间的语义和兴趣关联,从而实现精准的推荐 。其核心原理是利用词向量将用户的行为数据(如浏览记录、购买历史等)和商品的描述信息(如商品标题、介绍等)转化为低维向量空间中的向量 。这样,在向量空间中,用户向量和与用户兴趣相关的商品向量会更加接近 。通过计算用户向量与商品向量之间的相似度,推荐系统可以找到与用户兴趣匹配的商品,进而为用户提供个性化的推荐 。​

例如,在一个电商推荐系统中,对于用户 A,其经常浏览和购买电子产品,那么通过词向量转换,“电子产品” 相关的词汇在向量空间中会与用户 A 的向量距离较近 。当有新的电子产品上架时,系统可以快速计算该商品向量与用户 A 向量的相似度,如果相似度较高,则将该商品推荐给用户 A 。​

具体实现时,首先需要对用户行为数据和商品描述数据进行预处理 。对于用户行为数据,提取用户的历史行为记录,如用户浏览过的商品 ID、购买的商品 ID 等 。对于商品描述数据,使用自然语言处理技术进行清洗、分词、去除停用词等操作 。然后,利用词向量模型(如 Word2Vec 或 GloVe)将商品描述中的单词转换为词向量 。如果商品描述为 “智能手表,具有心率监测和睡眠跟踪功能”,将其中的 “智能手表”“心率监测”“睡眠跟踪” 等单词转换为词向量 。对于用户行为数据,可以通过对用户浏览或购买过的商品词向量进行聚合(如平均、求和等),得到用户的向量表示 。假设用户浏览了商品 1(词向量为vec1)、商品 2(词向量为vec2)和商品 3(词向量为vec3),可以通过以下方式得到用户向量user_vec:​

user_vec=3vec1+vec2+vec3​

​

​

在计算用户向量与商品向量的相似度时,常用的方法是余弦相似度 。余弦相似度通过计算两个向量的夹角余弦值来衡量它们的相似程度,公式为:​

cos(v1​,v2​)=∥v1​∥∥v2​∥v1​⋅v2​​

​

​

其中,​

v1​

和​

v2​

分别为用户向量和商品向量 。相似度值越接近 1,表示用户对该商品越感兴趣;值越接近 -1,表示用户对该商品越不感兴趣;值为 0 时,表示两者之间没有明显的相关性 。​

以下是推荐系统中利用词向量的关键代码逻辑示例,使用 Python 和numpy库:​

​

python取消自动换行复制

import numpy as np​

​

​

# 假设已经训练好的商品词向量字典,键为商品ID,值为词向量​

product_vectors = {​

1: np.array([0.2, 0.3, 0.4]),​

2: np.array([0.5, 0.1, 0.7]),​

3: np.array([0.1, 0.9, 0.2])​

}​

# 假设通过用户行为数据计算得到的用户向量​

user_vector = np.array([0.3, 0.4, 0.3])​

​

# 计算余弦相似度​

def cosine_similarity(vec1, vec2):​

dot_product = np.dot(vec1, vec2)​

norm_vec1 = np.linalg.norm(vec1)​

norm_vec2 = np.linalg.norm(vec2)​

return dot_product / (norm_vec1 * norm_vec2)​

​

​

# 计算用户与各个商品的相似度​

similarities = {}​

for product_id, product_vector in product_vectors.items():​

similarity = cosine_similarity(user_vector, product_vector)​

similarities[product_id] = similarity​

​

词向量转换技术在自然语言处理领域的应用前景十分广阔 。随着人工智能技术的不断发展,词向量将在智能客服、智能写作、文本生成等更多领域发挥重要作用 。在智能客服中,词向量可以帮助客服系统更好地理解用户的问题,提供更准确的回答;在智能写作中,词向量能够为写作模型提供丰富的语义信息,生成更自然、流畅的文本 。相信在未来,词向量转换技术将不断创新和完善,为自然语言处理领域带来更多的突破和发展,进一步推动人工智能技术在各个领域的广泛应用 。​

​

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐