word2vec理论基础

自然语言处理中,采用词向量表示文本。
用例子来说明
语料库:

Today is a good day.
Mona is a beautiful girl.

词典:

{"Today":1, "is":2, "a":3, "good":4, "day":5, "Mona":6, "beautiful":7,
 "girl":8}

1.one-hot表示(独热表示)

Today:[1,0,0,0,0,0,0,0]
   is:[0,1,0,0,0,0,0,0]
  ...
 girl:[0,0,0,0,0,0,0,1]

词典中的每个单词有唯一的索引。
词典中词的顺序和句子没有关联。

2.Bag of words(词袋形式)

出现次数累加:

Today is a good day. 这句话表示为[1,1,1,1,1,0,0,0]

词权重TF-IDF(Term Frequency -Inverse Document Frequency)
词t的TF-IDF权重 l o g ( 1 + N n t ) ,N表示文档总数, n t 含有t的文档数。

Today is a good day. 这句话表示为[0.693,1.099,1.099,0.693,0.693,0,0,0]

3.元模型(Bi-gram和N-gram)

2-gram索引:

{“Today is”:1,
     "is a":2,
   "a good":3,
          ...
}

优点:考虑词顺序
缺点:词表膨胀

4.共现矩阵表示(Cocurrence matrix)

Today is a good day.
Today is sunny.

共现矩阵为:这个窗口为1且为对称窗口

count      Today  is   a  good  day  sunny  .
Today        0     2   0    0    0     0    0 
 is          2     0   1    0    0     1    0
 a           0     1   0    1    0     0    0
good         0     0   1    0    1     0    0
day          0     0   0    1    0     0    1
sunny        0     1   0    0    0     0    1
  .          0     0   0    0    1     1    0

共现矩阵的行(或列)作为词向量。缺点:向量维数随着词典大小线性增长(高维并稀疏)。 解决方法:降维和矩阵压缩。降维方法有:SVD降维。

NNLM(Neural Network Language model)

从语言模型出发,将模型的最优化过程转化为求词向量的过程。
目标函数:

L ( θ ) = t l o g P ( w t | w t n + 1 , . . . , w t 1 )

NNLM结构图如下:

输入层(input):One-hot表示,(N-1)个前向词。输入为行向量 [ ] 1 × N
投影层(projection layer):采用线性映射将noe-hot表示投影到稠密D维表示。C为投影矩阵。生成稠密矩阵 D = C · T
隐藏层(hidden layer):全连接
输出层(output):Softmax分类器,输出为概率向量 [ ] 1 × V ,取概率最大的max(p)。

word2vec:CBOW-Continuous Bag of Words Model

Word2vec结构根据NNLM结构并对其进行了简化。
结构图:

目标函数:

J = w c o r p u s P ( w | c o n t e x t ( w ) )

输入层(input):直接使用低维稠密表示
投影层(projection):简化为求和(或平均)
输出层(output):输出层依然是Softmax分类器,输出为概率向量 [ ] 1 × V
特点:
1.无隐层
2.使用双向上下文窗口

CBOW的改进

由于上诉CBOW输出维度依然是词的个数维度,维度太高。因此有了以下的改进方法。

CBOW:层次Softmax

1.层次Softmax采用哈夫曼树(Huffman Tree)来编码输出层的词典
2.计算路径上非叶子结点词向量贡献。假如某个词在树的第四层,路径上的前三层每个结点的参数为 θ 1 , θ 2 , θ 3 ,含有这三个参数的sigmoid函数相乘的最大值。
3.计算量为树的深度有V变为了 l o g 2 ( V ) .

CBOW:负例采样

在样本不均衡情况下,采用负样本采样方法。将这个思想应用到word2vec中。
在输出中,我们实际就确定一个词为我们所需的词,为正例。而其他词都是不对的,也就为负例。假如有1w个词,正的为一个词,其他1w-1为负词。在计算时,不用1w-1个负词,而是从中选取300个(相当于负样本采样子集)。
接下来就是如何从中取这300个?
1.词汇表的词为V个,将长度为1的线段分为V份,每个词对应的线段长度为:

l e n ( w ) = c o u n t ( w ) t c o r p u s c o u n t ( t )

高频词对应的线段长,低频词对应的线段短.
word2vec实际应用中取 c o u n t ( w ) 3 / 4 t c o r p u s c o u n t ( t ) 3 / 4
2.将[0,1]划分为M等份M>>V,每次 随机生成一个[1,M-1]间的数,看这个数落在那个词对应的部分上。
词划分与M划分如图:
这里写图片描述

word2vec:Skip-Gram模型

Skip-Gram模型思想与CBOW思想是相反的。它是利用一次次来预测周围的词。
Skip-Gram模型结构如图:

word2vec存在问题

1.对于每个内容窗口单独训练,没有考虑全局。
2.对多义词无法很好的表示和处理,因为其使用了唯一的词向量。

gensim 中word2vec的参数

from gensim.models import word2vec

(1) sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。后面我们会有从文件读出的例子。

(2) size: 词向量的维度,默认值是100。这个维度的取值一般与我们的语料的大小相关,如果是不大的语料,比如小于100M的文本语料,则使用默认值一般就可以了。如果是超大的语料,建议增大维度。

(3) window:即词向量上下文最大距离,这个参数在我们的算法原理篇中标记为 c ,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,则算法中的 x w 为上下文的词向量之和,为1则为上下文的词向量的平均值。在我们的原理篇中,是按照词向量的平均值来描述的。个人比较喜欢用平均值来表示 x w ,默认值也是1,不推荐修改默认值。

注:文章主要为了便于自己记忆与理解,或有多处错误地方。推荐对word2vec介绍比较好的博客,参考http://www.cnblogs.com/pinard/p/7160330.html
文档:https://radimrehurek.com/gensim/models/word2vec.html
参数参考:http://www.mamicode.com/info-detail-1937943.html

猜你喜欢

转载自blog.csdn.net/yingfengfeixiang/article/details/80054729