Word2Vec

w

自然语言处理之Word2Vec - 慕希颜的日志 - 网易博客  http://blog.163.com/xh_ding/blog/static/1939032892014312102457581

  由于之前做过评论挖掘,所以涉及到了一些自然语言处理(NLP)的东西。最近google的一个开源的项目Word2Vec比较火,就去大概了解了一下。

       word2vec可以看做是一个将单词转换成向量形式的工具。那什么是词向量以及什么是语言模型呢?
       首先来说语言模型。语言模型是根据语言客观事实而进行的语言抽象数学建模,是一种对应关系。简单地说,语言模型就是用来计算一个句子的概率的模型。利用语言模型,可以确定哪个词序列的可能性更大,或者给定若干个词,可以预测下一个最可能出现的词语。例如说:小明正在家里看电视,可以翻译为Xiao Ming is watching TV at home、Xiao Ming at home is watching TV……,根据语言模型,我们知道前者的概率大于后者,所以翻译成前者比较合理。
       再说一下词向量。要将自然语言交给机器学习中的算法来处理,通常需要首先将语言数学化、量化,词向量就是用来将语言中的词进行数学化的一种方式。有了词向量之后就可以对词进行聚类、分类、计算相似度等等。
        一种最简单的词向量方式是 one-hot representation,就是用一个很长的向量来表示一个词,向量的长度为词典的大小,向量的分量只有一个 1,其他全为 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 ...]

        这种向量表示,如果要编程实现的话,用 Hash 表给每个词分配一个编号就好。用这种简洁的表示方法再加上最大熵、SVM、CRF 等算法就可以很好地完成了 NLP 领域的各种主流任务。但这种词表示有两个缺点:(1)容易受维数灾难的困扰,尤其是将其用于 Deep Learning 的一些算法时;(2)不能很好地刻画词与词之间的相似性。即:任意两个词之间都是孤立的。光从这两个向量中看不出两个词是否有关系,比如上面的例子中的“杯子”和“水杯”。这种现象叫做“词语鸿沟”。
        还有一种词向量就是 Distributed Representation ,它最早是 Hinton 于 1986 年提出的,可以克服 one-hot representation 的缺点。其基本想法是:
        通过训练将某种语言中的每一个词映射成一个固定长度的短向量(相对于 one-hot representation 而言),将所有这些向量放在一起形成一个词向量空间,而每一向量则为该空间中的一个点,在这个空间上引入“距离”,则可以根据词之间的距离来判断它们之间的(词法、语义上的)相似性了。
       word2vec主要核心是:神经网络,赫夫曼编码, 梯度下降。
       word2vec 中神经网络是一个三层的神经网络。并且word2vec的作者通过haffman创造了隐藏层。出现频率差不多的词对于隐藏层激活的内容是相近的。出现频率越高的词语他们激活的隐藏层数目越少,这样有效的降低了计算的复杂度,同时作为对隐藏层的激活结果利用了所有隐藏层神经元左右的特性来表征。
        不过,word2vec也有不足之处,那就是vector的表达取决于语料库,而实际上每个词是无法用一个向量表示的。这又涉及到NLP的另一个有意思的问题:Word Sense Disambiguation。因为如果是近义词的话,不仅两个词出现的上下文语境(context)要相似,还有很多信息需要考虑(例如:同一个词的名词和形容词语境相似,算不算近义词?)。word2vec应该没考虑过类似信息。实际上每个模型肯定都有局限性,这也正是计算机没法完全理解人类语言的原因之一。
原文地址:https://www.cnblogs.com/rsapaper/p/6839024.html