词向量模型word2vec的理解
1、CBOW与Skip-Gram模型
word2vec模型可以理解为简化的神经网络,主要包含两种词训练模型:CBOW与Skip-Gram模型。其模型结构如下:
CBOW模型:根据中心词w(t)的词来预测中心词。该模型的第一层是输入层,输入的值是周围每个词的one-hot编码形式,第二层隐含层是对输入值做了加权求和SUM操作,这里并不想神经元一样,这里没有激活函数进行非线性变换,输出值的维度和输入值得维度是一致的。
Skip-gram模型:根据中心词W(t)来预测周围的词。该模型的第一层也是输入层,输入值W(t)中心词是one-hot形式,隐含层只是做线性变换,输出的是输出值的softmax转换后的概率。模型的神经网络结构如下:
神经网络是可以有输入值、输出值和模型参数决定。在这里,我们认为模型的参数就是隐含层的权重矩阵。隐含层的输出是每个输出单词的“嵌入词向量”,如下图所示:
上式子,输入的是中心词one-hot编码形式,事实上,在做运算是并不是直接进行算法运算,而是利用one-hot编码的特性,直接用过输入值中的位数的索引来寻找隐含层中权重矩阵中对应的索引行。
词向量的优点:一、降低输入的维度,如上面式子所示,5维的one-hot编码转换为了三维的形式。二、增加了语义信息,即两个相互接近的词向量也是具有一定的相似性。
2、word2vec的实现API
class gensim.models.word2vec.Word2Vec(sentences=None, corpus_file=None, size=100,
alpha=0.025, window=5, min_count=5,
max_vocab_size=None, sample=0.001, seed=1, workers=3,
min_alpha=0.0001, sg=0, hs=0, negative=5,
ns_exponent=0.75, cbow_mean=1, hashfxn=<built-in
function hash>, iter=5, null_word=0, trim_rule=None,
sorted_vocab=1, batch_words=10000, compute_loss=False,
callbacks=(), max_final_vocab=None)
主要参数介绍如下:
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给出了最小的迭代步。
词向量的训练代码:
import logging
import gensim
from gensim.models import word2vec
wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin", binary=True)
sentences = word2vec.LineSentence("../data/preProcess/wordEmbdiing.txt")
a = list(sentences)
len(a)
model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8)
model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True)
# 加载bin格式的模型
#wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin", binary=True)