gensim中word2vec使用

时间:2024-11-07 07:26:14

       ~~~~~~       看了很多文章,对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算法时用到的辅助矩阵,即文章中的Wx
syn1neg:negative sampling算法时用到的辅助矩阵
Next_random:作者自己生成的随机数,线程里面初始化就是:

vocabulary:是类 ~.word2vec.Word2VecVocab
       ~~~~~~        模型的词汇表,除了存储单词外,还提供额外的功能,如构建一个霍夫曼树(频繁的单词更接近根),或丢弃极其罕见的单词。
trainables 是类 ~.word2vec.Word2VecTrainables
       ~~~~~~        训练词向量的内部浅层神经网络,CBOWskip-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)  # 执行这一句的时候就是在训练模型了