天然语言处理之word2vec

  在word2vec出现以前,天然语言处理常常把字词转为one-hot编码类型的词向量,这种方式虽然很是简单易懂,可是数据稀疏性很是高,维度不少,很容易形成维度灾难,尤为是在深度学习中;其次这种词向量中任意两个词之间都是孤立的,存在语义鸿沟(这样就不能体现词与词之间的关系)而有Hinton大神提出的Distributional Representation 很好的解决了one-hot编码的主要缺点。解决了语义之间的鸿沟,能够经过计算向量之间的距离来体现词与词之间的关系。Distributional Representation 词向量是密集的。word2vec是一个用来训练Distributional Representation 类型的词向量的一种工具。算法

一、CBOW与Skip-Gram模型网络

  word2vec模型其实就是简单化的神经网络,主要包含两种词训练模型:CBOW模型和Skip-gram模型。模型的结构图以下(注意:这里只是模型结构,并非神经网络的结构)函数

  

  CBOW模型根据中心词W(t) 周围的词来预测中心词;Skip-gram模型则根据中心词W(t) 来预测周围的词。工具

  1)CBOW模型的第一层是输入层,输入的值是周围每一个词的one-hot编码形式,隐藏层只是对输出值作了权值加法,没有激活函数进行非线性的转换,输出值的维度和输入值的维度是一致的。学习

  2)Skip-gram模型的第一层是输入层,输入值是中心词的one-hot编码形式,隐藏层只是作线性转换,输出的是输出值的softmax转换后的几率。编码

  神经网络结构以下spa

  

  神经网络的训练是有监督的学习,所以要给定输入值和输出值来训练神经网络,而咱们最终要得到的是隐藏层的权重矩阵。由于隐藏层的输出事实上是每一个输入单词的 “嵌入词向量”。咱们来看个图code

  

  上如中左边的式子是输入词向量和隐藏层权重矩阵的乘积,在作这个乘法时是不会进行矩阵的运算的,而是直接经过输入值中1的位置索引来寻找隐藏层中的权重矩阵中对应的索引的行。xml

  词向量的两个优势:blog

    1)下降输入的维度。词向量的维度通常取100-200,对于大样本时的one-hot向量甚至可能达到10000以上。

    2)增长语义信息。两个语义相近的单词的词向量也是很类似的。

 

二、word2vec API讲解

  在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法须要注意的参数有:

    1) sentences:咱们要分析的语料,能够是一个列表,或者从文件中遍历读出(word2vec.LineSentence(filename) )。

    2) size:词向量的维度,默认值是100。这个维度的取值通常与咱们的语料的大小相关,若是是不大的语料,好比小于100M的文本语料,则使用默认值通常就能够了。若是是超大的语料,建议增大维度。

    3) window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5,在实际使用中,能够根据实际的需求来动态调整这个window的大小。

     若是是小语料则这个值能够设的更小。对于通常的语料这个值推荐在[5;10]之间。

    4) sg:即咱们的word2vec两个模型的选择了。若是是0, 则是CBOW模型;是1则是Skip-Gram模型;默认是0即CBOW模型。

    5) hs:即咱们的word2vec两个解法的选择了。若是是0, 则是Negative Sampling;是1的话而且负采样个数negative大于0, 则是Hierarchical Softmax。默认是0即Negative Sampling。

    6) negative:即便用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。这个参数在咱们的算法原理篇中标记为neg。

    7) cbow_mean:仅用于CBOW在作投影的时候,为0,则算法中的xw为上下文的词向量之和,为1则为上下文的词向量的平均值。在咱们的原理篇中,是按照词向量的平均值来描述的。我的比较喜欢用平均值来表示xw,默认值也是1,不推荐修改默认值。

    8) min_count:须要计算词向量的最小词频。这个值能够去掉一些很生僻的低频词,默认是5。若是是小语料,能够调低这个值。

    9) iter:随机梯度降低法中迭代的最大次数,默认是5。对于大语料,能够增大这个值。

    10) alpha:在随机梯度降低法中迭代的初始步长。算法原理篇中标记为η,默认是0.025。

    11) min_alpha: 因为算法支持在迭代的过程当中逐渐减少步长,min_alpha给出了最小的迭代步长值。随机梯度降低中每轮的迭代步长能够由iter,alpha, min_alpha一块儿得出。这部分因为不是word2vec算法的核心内容,所以在原理篇咱们没有提到。

          对于大语料,须要对alpha, min_alpha,iter一块儿调参,来选择合适的三个值。

  word2vec是能够进行增量式训练的,所以能够实现一:在输入输入值时能够将数据用生成器的形式导入到模型中;二:能够将数据一个磁盘中读取出来,而后训练完保存模型;以后加载模型再从其余的磁盘上读取数据进行模型的训练。初始化模型的类似度以后,模型就没法再进行增量式训练了,至关于锁定模型了。

 

三、三个最多见的应用

  当训练完模型以后,咱们就能够用模型来处理一些常见的问题了,主要包括如下三个方面:

  1)找出某一个词向量最相近的集合

    model.wv.similar_by_word()

    从这里能够衍生出去寻找类似的句子,好比“北京下雨了”,能够先进行分词为{“北京”,“下雨了”},而后找出每一个词的前5或者前10个类似的词,好比”北京“的前五个类似词是

      {“上海”, “天津",”重庆“,”深圳“,”广州“}

    "下雨了"的前五个类似词是

      {”下雪了“,”刮风了“,”天晴了“,”阴天了“,”来台风了“}

    而后将这两个集合随意组合,能够获得25组不一样的组合,而后找到这25组中发生几率最大的句子输出。

  2)查看两个词向量的相近程度

    model.wv.similarity()

    好比查看"北京"和”上海“之间的类似度

  3)找出一组集合中不一样的类别

    model.wv.doesnt_match()

    好比找出集合{“上海”, “天津",”重庆“,”深圳“,”北京“}中不一样的类别,可能会输出”深圳“,固然也可能输出其余的

相关文章
相关标签/搜索