深度学习:详解word2vec + 实践操作(包括text2word)
Text2vec 的输入是整个文本序列,输出是文本序列对应的向量表示。Word2vec 的训练目标是最小化相似单词在空间中的距离或最大化不相似单词在空间中的距离。Text2vec 的训练目标是最小化文本之间的距离或最大化相似文本的相似度。Text2vec 和 Word2vec 都是用于将文本(文本中的单词或字符)转换为向量的方法。Word2vec 的输入是单个单词,输出是单词对应的向量表示。Tex
一、白话word2vec
-
Word2Vec是一种用于自然语言处理(NLP)的机器学习算法,由2012年谷歌提出的文本生成词向量模型,包括CBOW(continous bag of words)和Skip Gram。
CBOW模型:是通过一个或多个单词的上下文来进行这个词语的预测
Skip Gram模型:是通过一个或多个单词来进行上下文的预测。
Word2Vec是一个预训练模型,已经训练好的。但也支持在不重新训练的情况下再继续添加新文本进行训练补充 -
为什么要对词进行编码(词向量化)?
任何数学模型,其输入都需要是数值型的,因为计算机只能理解数字,词语是人类语言的抽象总结,计算机时无法理解的,而在自然语言处理中,我们面对的是文字,而文字是无法直接被数学模型所直接利用的。所以我们需要将文字进行编码,将每一个字符用一个向量进行表示,即把文本分散嵌入到另一个离散空间,,称作分布式表示,又称为词嵌入(word embedding)或词向量。
在word2vec出来之前,我们常用的主要是one hot encoding(独热编码)的方法。 -
自己理解:我觉得,我们使用word2vec将一个词语转化为向量,其实就是训练一个神经网络的过程,学习单词之间的位置关系,从而得到每个单词对应的向量表示。而CBOW 和 Skip-gram只是 是 Word2Vec 的两种不同训练方式,并通过它们得到向量矩阵。
-
关于具体的CBOW和Skip-gram内部是怎么样的,可以看https://cloud.tencent.com/developer/article/1164487?areaSource=102001.7&traceId=h5OTw1daZ2XfMP8SPzrXU。
-
Word2Vec算法的核心思想是使用神经网络来学习每个词语的向量表示。在CBOW模型中,输入是上下文中的词语向量,再乘以输入权重矩阵,所得的向量求平均,作为隐藏层向量,再乘以输出权重矩阵,输出是目标词语的向量,在这个过程中不断最小化目标loss。在Skip-gram模型中,输入是目标词语的向量,输出是上下文中的词语向量。(输入层一般使用 one-hot将文字 -> 向量)。
-
Word2vec预训练模型是通过对大量文本数据进行训练而得到的。在训练过程中,模型会学习单词之间的关系,以及它们在上下文中的出现方式。这些关系和出现方式被编码为向量,使得相似的单词在向量空间中距离更近。
1)词语 -> 向量:我们使用时,将一个文本传入word2vec时,可以将其先分词,再转为向量
2)微调:使用自己文本对word2vec进行微调 -
word2vec训练后得到两个权重矩阵,它们都可以作为embedding层,但我们更多的的还是使用输入权重矩阵,而不是输出权重矩阵。
-
word2vec模型其实也就只有3层而已,输入/输出/隐藏。
-
具体应该就是通过文本生成训练数据集进行训练,是的CBOW的上下文推测中心词,Skip-Gram的中心词推测剩下文,不断减少损失,是的从输入层到隐藏层的参数不断更新,最后得到loss最小的参数,训练完成后,再将文本带入,获得隐藏层处的编码(即为向量)。
-
如何理解word2vec的相似度计算:
使用word2vec将词语 -》向量,维度由自己设置。我们如何理解这个维度呢?以二维为例,如果词语用二维表示,假设美国的向量为(-0.8,-1.2),中国为(-0.4, 0.7),而亚洲为(-0.3,1.2),这就是各自单词的向量了,那么相似度要如何计算呢?使用余弦相似度计算(即计算两个向量的夹角余弦值来评估他们的相似度),就会发现亚洲和中国比较相似(我们也可以直接画二维x,y轴,也能观察出)。两个向量有相同的指向时,余弦相似度的值为1;两个向量夹角为90°时,余弦相似度的值为0;两个向量指向完全相反的方向时,余弦相似度的值为-1。这结果是与向量的长度无关的,仅仅与向量的指向方向相关。我们由这个二维拓展到五维,十维同理(尽管我们都没有见过,也不会画高维的向量箭头)。
因此如果将人和事务表示为向量,我们就可以很容易计算出相似向量之间的关系(一个单词表达成Word Embedding后,便很容易找出语义相近的其它词汇) -
词向量的维度(其实就是隐含层节点数,调用word2vec时可设置)一般情况下要远远小于词语总数 V 的大小,所以 Word2vec 本质上是一种降维操作——把词语从 one-hot encoder 形式的表示降维到10-20维度
二、独热编码、word2vec
-
独热编码:对于每一个单词 or 字母 or 汉字,我们用在一个位置为1,其余位置为0的向量进行表示。(用一个很长的向量来表示一个词,向量长度为词典的大小N,每个向量只有一个维度是1,表示该词语在词典的位置,其余维度全部为0)
以pytorch为例:
import torch.nn.functional as F
F.one_hot(word_index, len(vocab))
说明:
1)vocab为词典,例如,将一个中文句子/文本划分为一个个汉字时,需要对其进行统计不同单词。第0个位置为第一个汉字,第1个位置为第二个汉字,以此类推(注意相同汉字不能重复出现在词典中,需要确保一个汉字值对应一个位置)。
2)word_index为句子每个词所对应的词典位置的集合。例如:”我去过北京天安门“ 使用word_index表示为[idx_0,idx_1,,idx_2…]
3)假设我们的有词表只有10个单词,分别是:今,天,是,你,我,他,买,水,果,家。这里我们分别用one hot encoding的方法来表示每一个词,那么F.one_hot返回有下面的结果:
可以看到对于每一个单词,我们用唯一的一个向量对它进行了表示 -
独热编码缺陷:
1)维度灾难:当文本越大时,词表越大,则表示一个词的向量维度越高,势必加大了任何机器学习模型的计算量,降低了计算效率。
2)无法度量词语之间的相似度。词向量与词向量之间都是相互独立的;但我们都知道,词与词之间是有一定的联系的,我们无法通过这种词向量得知两个词在语义上是否相似,例如,我们使用余弦相似度来计算任意两个词语之间的相似度,结果会是0,因为每个词之间独立。 -
word2vec:词向量解决了以上独热编码的缺陷,而词向量主要有以下一些特点:
1)如果单词量为N,那么可以用一个n维的向量来表示每一个单词,并且n远远小于N,常见的n为100到300,也可以更具具体和需求问题设定
2)词向量每一个位置不再是只能取0和1的数值,而是可以取任意的实数。这样有限的维度(n为100-300),可以表示无限的词语。例:今 -> [0.2154521, -2.326536, -3.3652666, 2.12255521,…]。10维的one-hot表示10个词语,10维的向量可以表示无数个词语。
3)词向量之间的差在一定程度上是有意义的,比如,中国的词向量为v1,北京的词向量为v2,美国的词向量为s1,华盛顿的词向量为s2,通过word2vec学习出来的这些词向量大致有这样的特征v1-v2 = s1 -s2 。这个是很漂亮的一个近似关系,相当于说v1-v2近似的等于首都这种关系
4)除此之外,地名和地名在词向量空间中的距离比地名和动物的词向量距离近,等等,换句话说就是描述同一属性和种类的词向量的距离要小于不同属性和种类的词向量的距离 -
word2vec缺陷:(只学习位置信息,不学习语义信息)
word2vec存在最大的问题就是由于它是静态词向量表示导致不能表示一词多义的情况,举个例子“苹果”一词,在果蔬的句子中表示的就是水果的含义,要是在高科技产品句子中表示的就是“苹果”公司。但是word2vec的静态词向量表示只能表示同一种形式,不能很好的表示上下文语义,这也是为什么ELMO,GPT,bert问世之后word2vec就不再有以前的光环了,因为ELMO,GPT,bert都是用的动态词向量表示,可以很好的表示上下文语义。 -
word2vec为什么是是静态词向量表示导致不能表示一词多义的情况:
当word2vec模型训练完后参数w就固定了,当输入一个词时,它的向量为w * x,且x一般为one-hot编码,所以w*x其实就是查字典操作,取对应词的词向量,是固定的,与上下文无关(因为one-hot编码与上下文无关)。而bert在计算每个词的词向量时,并不是简单的查字典操作,而是会与其他词做交互,在这个交互的基础上得到自己的词向量(通过自注意力的q,k,v)。它是可以结合上下文的语境的。所以当在预测,重新走一遍模型的时候,不同的句子,上下文不同,经过self-attention之后,得到的词向量也是不同的,从而可以解决一词多义的问题。
三、text2vec及word2vec区别:
Text2vec 和 Word2vec 都是用于将文本(文本中的单词或字符)转换为向量的方法。它们之间的主要区别在于训练目标、输入和输出以及应用场景。
1.训练目标:
Text2vec 的训练目标是最小化文本之间的距离或最大化相似文本的相似度。Text2vec 模型通过神经网络学习文本的向量表示,从而捕捉文本的全局语义信息。
Word2vec 的训练目标是最小化相似单词在空间中的距离或最大化不相似单词在空间中的距离。Word2vec 模型通过神经网络学习单词的向量表示,从而捕捉单词的语义信息。
2.输入和输出:
Text2vec 的输入是整个文本序列,输出是文本序列对应的向量表示。在训练过程中,Text2vec 会将文本序列划分为多个窗口,并对每个窗口生成一个上下文向量。这些上下文向量经过加权平均后,得到整个文本序列的向量表示。
Word2vec 的输入是单个单词,输出是单词对应的向量表示。Word2vec 通过将单词作为输入,神经网络输出对应单词的向量表示。
3.应用场景:
Text2vec 通常用于处理整个文本序列的任务,如文本分类、文本相似度计算、文本聚类等。
Word2vec 主要用于处理单个词汇的任务,如词汇相似度计算、词汇嵌入空间分析等。
文本嵌入模型主要关注于将整个文本(如句子或文档)映射为一个连续的向量表示,从而捕捉文本的全局语义信息。这有助于模型理解文本中的长距离依赖关系和上下文信息。
词嵌入模型则关注于将单个词汇(如单词或汉字)映射为向量表示,从而捕捉词汇的语义信息。
四、word2txt实践
- 需要下载word2vec相关包:sklearn,gensim(pip install即可)
- 使用方法如图所示:包括文本读取、分词、预处理、训练、词向量、类比关系
五、text2vec实践
这个实践部分是之间调用网上开源的中文文本嵌入模型text2vec-base-chinese,将句子转化为词向量。
- 下载text2vec相关包:
第一种方式:pip install -U text2vec
第二种方式:git clone https://github.com/shibing624/text2vec.git
cd text2vec
pip install --no-deps
注意:在这之前需要torch环境,没有的搜教程安装即可 - 下载text2vec-base-chinese模型(也自己在网上找,正好锻炼一下百度能力)
- 具体使用代码及输出如图所示:
六、Word2Vec应用
自然语言处理(文本分类、情感分析、命名实体识别):通过word2vec,可以将文本中的每个单词映射为一个稠密向量,从而将离散的词语转换为连续的向量空间表示。
词义相似度计算:衡量两个词语之间的相似程度。利用word2vec得到的词向量,可以通过计算向量之间的距离或相似度来衡量词语之间的语义关系
推荐系统:通过将用户行为序列和文本内容映射为词向量表示,可以建立用户和文本之间的关联关系,从而为用户推荐相关的文本内容。
信息检索:通过将查询词语和文本内容转换为词向量表示,可以计算它们之间的相似度,
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)