本文目录一览:
- 1、如何用 word2vec 计算两个句子之间的相似度?
- 2、【zt】word to vector
- 3、python word2vec()训练中文语句,显示错误如下,求大神指教:
- 4、word2vec是如何得到词向量的?
- 5、word2vec和word embedding有什么区别
如何用 word2vec 计算两个句子之间的相似度?
word2vec这个代名词也好计算软件也好,对于一个不太懂软件的人来说真的是很陌生,也可以说是一窍不通,但是从朋友那了解了很多,所以我觉得计算两个句子之间的相似度我觉得定义句子相似度是这个问题的关键。
word2vec,处理方式
正如矢量叠加的平均值;然后Mikolov等人也提出了doc2vec来处理单词vector,但是基本的想法并不遥远,我在实践中尝试过这些方法,可能会有一些效果。Word2vec、doc2vec我使用gensim的实现,在我自己的语料库上进行培训,语料库不跑得很快,所以各种参数都尝试了很多。因为培训模式没有一个好的评价基准,我认为word模拟不是很普遍,这个模型比较主观。
在中文语境中,通过适当的调优参数,也就是对结果有重要影响,我认为是窗口大小和最小值,word2vec的结果可以看到,doc2vec的结果很差,尤其是在较长的句子文章中。在文档级别,我认为doc2vec的健壮性不足以支持产品,它的健壮性不如LSI,或者简单的tf - idf。
我觉得文档相似度取决于文档的长度,如果是一个简短的文本,传统方法tf-idf,相反如果是长文本,可以使用word2vec。
【zt】word to vector
词向量:
word2vec也叫word embeddings,中文名“词向量”,作用就是将自然语言中的字词转为计算机可以理解的稠密向量(Dense Vector)。在word2vec出现之前,自然语言处理经常把字词转为离散的单独的符号,也就是One-Hot Encoder。
比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。
使用Vector Representations可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。
如果将embed后的城市向量通过PCA降维后可视化展示出来,那就是这个样子。
我们可以发现,华盛顿和纽约聚集在一起,北京上海聚集在一起,且北京到上海的距离与华盛顿到纽约的距离相近。也就是说模型学习到了城市的地理位置,也学习到了城市地位的关系。
模型拆解
word2vec模型其实就是简单化的神经网络。
输入是One-Hot Vector,Hidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。我们要获取的dense vector其实就是Hidden Layer的输出单元。有的地方定为Input Layer和Hidden Layer之间的权重,其实说的是一回事。
Word2Vec
问题设定
对于One-hot的词向量:
无法通过两向量夹角余弦值计算其相似度,word2vec提供了Skip-Gram(跳字模型)与CBOW(连续词袋模型)两个词嵌入模型,通过这种模型训练出的词向量可以较好的表示出词之间的相似度。
即跳字模型,其核心思想是对于一个上下文,设定一个大小为m的滑窗,在滑窗内选择1个中心词,预测滑窗内m-1个背景词。即如果上下文是:
对每一个词进行One-hot编码:
设定滑窗大小为2,如果选择中心词apple,那么将会有以下训练数据:
设计一个只有1个输入层、1个隐藏层、1个输出层的神经网络,其中输出层的神经元个数等于输入层即等于One-hot编码的维度,而隐含层的神经元个数通常远小于输出层,比如One-hot维度如果是10000,隐含层可以只有300个神经元
即Continuous Bag of Words,连续词袋模型,其核心思想是对于一个上下文,设定一个大小为m的滑窗,在滑窗内选择1个背景词,m - 1个中心词,与Skip-Gram相反,设定滑窗大小为2,如果选择中心词 I, eat, every, day ,那么将会有以下训练数据:
--------------------------------------------------------------------------------------------------------------------
【其他】
『TensorFlow』读书笔记_Word2Vec :
Word2Vec又称Word Embeddings,中文称为"词向量"、"词嵌入"等。
One_Hot_Encoder
图像和语音天然可以表示为稠密向量,自然语言处理领域在Word2Vec之前都是使用离散符号,如"中国"表示为5178,"北京"表示为3987这样,即One_Hot_Encoder,一个词对应一个向量(向量中一个值为1其余值为0),这使得整篇文章变为一个稀疏矩阵。而在文本分类领域,常使用Bag of Words模型,将文章对应的稀疏矩阵进行合并,比如"中国"出现23次,则5178位置特征值为23这样。
由于One_Hot_Encoder的特征编码是随机的,完全忽视了字词之间可能的关联。而且稀疏向量作为存储格式时,其效率比较低,即我们需要更多的训练数据,另外,稀疏矩阵计算也非常麻烦。
向量空间模型
向量表达可以有效的解决这些问题,向量空间模型会将意思相近的词映射到邻近的位置。向量空间模型在NLP中依赖的假设是 Distributional Hypothesis ,即相同语境中出现的词其意义也相近。
向量空间模型有两个子类,
其一是计数模型,计数模型会统计相邻词出现的频率,然后将之处理为小而稠密的矩阵
其二是预测模型,预测模型则是根据一个词相邻的词去推测出这个词,以及其空间向量
Word2Vec就属于一种 预测模型 ,其分为两个模式,
CBOW模式从缺词的原始语句推测目标词,适用于小型数据
Skip-Gram利用目标词逆推原始语句,对大型语料库效果很好
预测模型一般是给定前h个词的情况下去最大化目标词的概率,CBOW模型并不需要计算全部词汇表中的可能性,随机选择k个词汇和目标词汇进行计算loss,这个方法由tf.nn.nce_loss()已经实现了。
以一句话为例;“the quick brown fox jumped over the lazy dog”为例,滑窗尺寸为一时映射关系有:CBOW中,【the、brown】-【quick】这样的,而Skip-Gram中相反,我们希望得到的是(quick,the)、(quick,brown)这样的关系。面对随机生成的负样本时,我们希望概率分布在the的位置尽可能的大。
再举个例子:对同样一个句子:Hangzhou is a nice city。我们要构造一个语境与目标词汇的映射关系,其实就是input与label的关系。
这里假设滑窗尺寸为1(滑窗尺寸……这个……不懂自己google吧-_-|||)
CBOW可以制造的映射关系为:[Hangzhou,a]—is,[is,nice]—a,[a,city]—nice
Skip-Gram可以制造的映射关系为(is,Hangzhou),(is,a),(a,is), (a,nice),(nice,a),(nice,city)
python word2vec()训练中文语句,显示错误如下,求大神指教:
声明的函数,需要调用。例如
def fun()
……………
fun()#调用才可执行函数里的代码
word2vec是如何得到词向量的?
word2vec是一个将单词转换成向量形式的工具。可以把对文本内容的处理简化为向量空间中的向量运算,计算出向量空间上的相似度,来表示文本语义上的相似度。
一、理论概述:
1.词向量是什么?自然语言理解的问题要转化为机器学习的问题,第一步肯定是要找一种方法把这些符号数学化。NLP 中最直观,也是到目前为止最常用的词表示方法是 One-hot Representation,这种方法把每个词表示为一个很长的向量。这个向量的维度是词表大小,其中绝大多数元素为 0,只有一个维度的值为 1,这个维度就代表了当前的词。
举个栗子:
“话筒”表示为 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]
“麦克”表示为 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]
每个词都是茫茫 0 海中的一个 1。这种 One-hot Representation 如果采用稀疏方式存储,会是非常的简洁:也就是给每个词分配一个数字 ID。比如刚才的例子中,话筒记为 3,麦克记为 8(假设从 0 开始记)。如果要编程实现的话,用 Hash 表给每个词分配一个编号就可以了。这么简洁的表示方法配合上最大熵、SVM、CRF 等等算法已经很好地完成了 NLP 领域的各种主流任务。当然这种表示方法也存在一个重要的问题就是“词汇鸿沟”现象:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,哪怕是话筒和麦克这样的同义词也不能幸免于难。Deep Learning 中一般用到的词向量并不是刚才提到的用 One-hot Representation 表示的那种很长很长的词向量,而是用 Distributed Representation(不知道这个应该怎么翻译,因为还存在一种叫“Distributional Representation”(类似,LDA中用topic表示词语的词向量的表示方法)表示的一种低维实数向量。这种向量一般是这个样子:[0.792, −0.177, −0.107, 0.109, −0.542, ...]。维度以 50 维和 100 维比较常见。
2.词向量的来历?Distributed representation 最早是 Hinton 在 1986 年的论文《Learning distributed representations of concepts》中提出的。虽然这篇文章没有说要将词做 Distributed representation但至少这种先进的思想在那个时候就在人们的心中埋下了火种,到 2000 年之后开始逐渐被人重视。
3. 词向量的训练:要介绍词向量是怎么训练得到的,就不得不提到语言模型。到目前为止我了解到的所有训练方法都是在训练语言模型的同时,顺便得到词向量的。这也比较容易理解,要从一段无标注的自然文本中学习出一些东西,无非就是统计出词频、词的共现、词的搭配之类的信息。而要从自然文本中统计并建立一个语言模型,无疑是要求最为精确的一个任务(也不排除以后有人创造出更好更有用的方法)。既然构建语言模型这一任务要求这么高,其中必然也需要对语言进行更精细的统计和分析,同时也会需要更好的模型,更大的数据来支撑。目前最好的词向量都来自于此,也就不难理解了。词向量的训练最经典的有 3 个工作,CW 2008、MH 2008、Mikolov 2010。当然在说这些工作之前,不得不介绍一下这一系列中 Bengio 的经典之作
4. 词向量的评价:词向量的评价大体上可以分成两种方式,第一种是把词向量融入现有系统中,看对系统性能的提升;第二种是直接从语言学的角度对词向量进行分析,如相似度、语义偏移等。
word2vec和word embedding有什么区别
个人理解是,word embedding 是一个将词向量化的概念,来源于Bengio的论文《Neural probabilistic language models》,中文译名有"词嵌入"。
word2vec是谷歌提出一种word embedding 的工具或者算法集合,采用了两种模型(CBOW与skip-gram模型)与两种方法(负采样与层次softmax方法)的组合,比较常见的组合为 skip-gram+负采样方法。
可以查看以下两个来源,
word embedding :Word embedding - Wikipedia
word2vec中的数学原理详解:word2vec 中的数学原理详解(一)目录和前言
对于起源与其他的word embedding方法可以查看 Deep Learning in NLP (一)词向量和语言模型