~~~~~~
看了很多文章,对word2vec的原理讲解很清楚,还有一些源码解读和实现。但是在真正工作中如何熟练使用更是必须的。翻了下网页发现这个内容比较少。就记录一下关键它的使用。
~~~~~~
word2vec的实现是位于gensim包中gensim\models\
文件里面的Word2Vec类中
参数24个:
参数名称 | 默认值 | 用途 |
---|---|---|
sentences | None | 训练的语料,一个可迭代对象。对于从磁盘加载的大型语料最好用. ,.word2vec.Text8Corpus ,. 去生成sentences |
size | 100 | 生成词向量的维度 |
alpha | 0.025 | 初始学习率 |
window | 5 | 句子中当前和预测单词之间的最大距离,取词窗口大小 |
min_count | 5 | 文档中总频率低于此值的单词忽略 |
max_vocab_size | None | 构建词汇表最大数,词汇大于这个数按照频率排序,去除频率低的词汇 |
sample | 1e-3 | 高频词进行随机下采样的阈值,范围是(0, 1e-5) |
seed | 1 | 向量初始化的随机数种子 |
workers | 3 | 几个CPU进行跑 |
min_alpha | 0.0001 | 随着学习进行,学习率线性下降到这个最小数 |
sg | 0 | 训练时算法选择 0:skip-gram, 1: CBOW |
hs | 0 | 0: 当这个为0 并且negative 参数不为零,用负采样,1:层次 softmax |
negative | 5 | 负采样,大于0是使用负采样,当为负数值就会进行增加噪音词 |
ns_exponent | 0.75 | 负采样指数,确定负采样抽样形式:1.0:完全按比例抽,0.0对所有词均等采样,负值对低频词更多的采样。流行的是0.75 |
cbow_mean | 1 | 0:使用上下文单词向量的总和,1:使用均值; 只适用于cbow |
hashfxn | hash | 希函数用于随机初始化权重,以提高训练的可重复性。 |
iter | 5 | 迭代次数,epoch |
null_word | 0 | 空填充数据 |
trim_rule | None | 词汇修剪规则,指定某些词语是否应保留在词汇表中,默认是 词频小于 min_count则丢弃,可以是自己定义规则 |
sorted_vocab | 1 | 1:按照降序排列,0:不排序;实现方法:.word2vec.Word2VecVocab.sort_vocab() |
batch_words | 10000 | 词数量大小,大于10000 cython会进行截断 |
compute_loss | False | 损失(loss)值,如果是True 就会保存 |
callbacks | () | 在训练期间的特定阶段执行的回调序列~.CallbackAny2Vec
|
max_final_vocab | None | 通过自动选择匹配的min_count将词汇限制为目标词汇大小,如果min_count有参数就用给定的数值 |
模型保存使用:
完成训练后只存储并使用~
该模型可以通过以下方式存储/加载:~.word2vec.
保存模型~.word2vec.
加载模型
训练过的单词向量也可以从与其兼容的格式存储/加载:.save_word2vec_format
实现原始
w
o
r
d
2
v
e
c
word2vec
word2vec 的保存.load_word2vec_format
单词向量的加载
模型的属性
wv
: 是类 ~.Word2VecKeyedVectors
生产的对象,在word2vec是一个属性
为了在不同的训练算法(Word2Vec,Fastext,WordRank,VarEmbed)之间共享单词向量查询代码,gensim将单词向量的存储和查询分离为一个单独的类 KeyedVectors
~~~~~~
包含单词和对应向量的映射。可以通过它进行词向量的查询
model_w2v.wv.most_similar("民生银行") # 找最相似的词
model_w2v.wv.get_vector("民生银行") # 查看向量
model_w2v.wv.syn0 # model_w2v. 一样都是查看向量
model_w2v.wv.vocab # 查看词和对应向量
model_w2v.wv.index2word # 每个index对应的词
小提示:
需要注意的是word2vec采用的是标准hash table存放方式,hash码重复后挨着放 取的时候根据拿出index找到词表里真正单词,对比一下syn0
:就是词向量的大矩阵,第i行表示vocab中下标为i的词syn1
:用hs算法时用到的辅助矩阵,即文章中的Wxsyn1neg
:negative sampling算法时用到的辅助矩阵Next_random
:作者自己生成的随机数,线程里面初始化就是:
vocabulary
:是类 ~.word2vec.Word2VecVocab
~~~~~~
模型的词汇表,除了存储单词外,还提供额外的功能,如构建一个霍夫曼树(频繁的单词更接近根),或丢弃极其罕见的单词。trainables
是类 ~.word2vec.Word2VecTrainables
~~~~~~
训练词向量的内部浅层神经网络,CBOW
和skip-gram(SG)
略有不同,它的weights
就是我们后面需要使用的词向量,隐藏层的size
和词向量特征size
一致
sentences相关
训练首先是语料集的加载。首先要生成Word2Vec需要的语料格式:
1.对于简单的句子可以:
from gensim.models import Word2Vec
# sentences只需要是一个可迭代对象就可以
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
model = Word2Vec(sentences, min_count=1) # 执行这一句的时候就是在训练模型了
2.对于大型语料库:
Gemsim 的输入只要求序列化的句子,而不需要将所有输入都存储在内存中。简单来说,可以输入一个句子,处理它,删除它,再载入另外一个句子。.
: BrownCorpus是一个英国语料库,可以用这个直接处理.word2vec.Text8Corpus
,.
# 使用LineSentence()
sentences = LineSentence('') # 文本格式是 单词空格分开,一行为一个文档
# 使用Text8Corpus()
sentences = Text8Corpus('') # 文本格式是 单词空格分开,一行为一个文
model = Word2Vec(sentences, min_count=1) # 执行这一句的时候就是在训练模型了