Gensim之Word2Vec使用手册

1.介绍

一句话,Gensim中的Word2Vec类就是用来训练词向量的,这个类实现了词向量训练的两种基本模型skip-gramCBOW,可以通过后面的参数设置来选择。但是,在Gensim这个模块中训练词向量的方法还有很多:gensim.models.doc2vec.Doc2Vec,gensim.models.fasttext.FastText,gensim.models.wrappers.VarEmbed等等都能得到词向量。

2.Word2Vec类

2.1 Word2Vec类初始化参数

在下面介绍参数时,可能不会列举完,完整的参数见word2vec.py源码。
注:参数表这一列,等号右边的值表示默认值

参数表含义
sentences=None语料句子,必须是一个可迭代的(参见后面例子)
size=100训练后词向量的维度
alpha=0.025训练网络的初始学习率,之后会线性降低
min_alpha=0.0001降低到最小的学习率
window=5当前词和预测词之间的最大间隔
min_count=5忽略词频<5的词语
max_vocab_size=None限制最大词数,防止内存溢出
workers=3设置线程数,越高训练速度(前提是你有这么多)
sg=0训练模型的选择,1表示skip-gram,0表示CBOW
hs=0训练网络代价函数的选择
iter=5迭代次数

2.2 示例

2.2.1 训练及保存模型

# 示例1

from gensim.test.utils import common_texts
from gensim.models import Word2Vec

print(common_texts)
train_model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
train_model.save('./MyModel')

train_model.wv.save_word2vec_format('./mymodel.txt', binary=False)

训练模型

只需要给Word2Vec类赋上参数,就可以直接训练了。其中common_texts是一段内置的语料,如下:

[[‘human’, ‘interface’, ‘computer’], [‘survey’, ‘user’, ‘computer’, ‘system’, ‘response’, ‘time’], [‘eps’, ‘user’, ‘interface’, ‘system’], [‘system’, ‘human’, ‘system’, ‘eps’], [‘user’, ‘response’, ‘time’], [‘trees’], [‘graph’, ‘trees’], [‘graph’, ‘minors’, ‘trees’], [‘graph’, ‘minors’, ‘survey’]]

可以看到整体格式是[['A','B'],['C','D','E']],其中这个list表示所有的文本(此处表示2个文本,里面的A,B等表示单词,如果是中文则表示分词的结果,后面也会用中文演示)

保存模型

在示例1中,第8行和第10行都是用来保存训练模型的(简称save和format_save),而两者之间的相同点就是:都可以复用,即载入之后可以得到对应单词的词向量;不同点是:save保存的模型,载入之后可以继续在此基础上接着训练(后文会介绍),而format_save保存的模型不能,但有个好处就是如果s设置binary=False则保存后的结果可以直接打开查看(一共有12个词向量,每个词向量100维)

12 100
system -0.0027418726 -0.0029260677 0.0002653271 ......
user 0.000851792 -0.004782654 0.0017041893 ......
trees 6.689873e-05 0.0027949389 -0.002869004 ......
graph -0.0038760677 -0.0021227715 0.0029032128 ......
......
......

2.2.2 载入模型和使用(英文)

为了展示方便,下面我只用4个维度来表示词向量。


#示例 2  查看词表相关信息

from gensim.test.utils import common_texts
from gensim.models import Word2Vec
model = Word2Vec.load('./MyModel')
# 对于训练好的模型,我们可以通过下面这前三行代码来查看词表中的词,频度,以及索引位置, 
# 最关键的是可以通过第四行代码判断模型中是否存在这个词
for key in model.wv.vocab:
    print(key)
    print(model.wv.vocab[key])
print('human' in model.wv.vocab)
print(len(model.wv.vocab)) #获取词表中的总词数
#结果:

trees
Vocab(count:3, index:2, sample_int:463795800)
graph
Vocab(count:3, index:3, sample_int:463795800)
minors
Vocab(count:2, index:11, sample_int:579459575)

True

12

# 示例3  获取对应的词向量及维度
model = Word2Vec.load('./MyModel')
print(model.wv.vector_size)
print(model['human'])
print(model['good'])

# 结果
4
[-0.06076013 -0.03567408 -0.07054472 -0.10322621]

KeyError: "word 'good' not in vocabulary"
Process finished with exit code 1

# 在取词向量之前一定要先判断

# 示例4  常用方法

#---------------4.1  计算两个词的相似度(余弦距离)--------
model = Word2Vec.load('./MyModel')
print(model.wv.similarity('human', 'user'))
print(model.wv.similarity('human', 'survey'))

# 结果越大越相似(此处由于维度太小,所以结果好像不怎么准确)
-0.6465453
0.55347687

#---------------4.2  计算两个词的距离--------
model = Word2Vec.load('./MyModel')
print(model.wv.distance('human', 'user'))
print(model.wv.distance('human', 'survey'))

# 结果越大越不相似
1.6465452909469604
0.44652312994003296

#---------------4.3  取与给定词最相近的topn个词--------
model = Word2Vec.load('./MyModel')
print(model.wv.most_similar(['human'],topn=3))

#结果
[('computer', 0.7984297871589661), ('response', 0.6434261798858643), ('survey', 0.5534768104553223)]

#---------------4.4  找出与其他词差异最大的词
model = Word2Vec.load('./MyModel')
print(model.wv.doesnt_match(['human','user','survey']))

#结果
user

其它的还有很多,如:
words_closer_than(),similar_by_word(),similar_by_vector(),similarity_matrix()
参见源码keyedvectors.py

2.2.3 载入模型并继续训练

载入模型并继续训练意思是,之前训练好了一个词向量模型,可能训练时间不足,或者又有了新的数据,那么此时就可以在原来的基础上接着训练而不用从头再来。

#示例 5
    model = Word2Vec(sentences=pos,size=50,min_count=5)
    model.save('./vec.model_pos')
    print('语料数:', model.corpus_count)
    print('词表长度:', len(model.wv.vocab)) 

# 结果
语料数: 5000
词表长度: 6699
    
#-------------增量训练
    model = Word2Vec.load('./vec.model_pos ')
    model.build_vocab(sentences=neg, update=True)
    model.train(sentences=neg, total_examples=model.corpus_count, epochs=model.iter)
    model.save('./vec.model')

    print('语料数:', model.corpus_count)
    print('词表长度:', len(model.wv.vocab))
# 结果
语料数: 5001
词表长度: 8296

可以看到,第一次训练时用了5000个语料,训练完成后词表中一共有6699个词;在追加训练时,用了5001个语料,此时词表中一共就有了8296个词

2.2.4 载入模型和使用(中文)
我们用之前的训练好的模型来演示:

# 示例 6

model = Word2Vec.load('./vec.model')
    print('词表长度:', len(model.wv.vocab))
    print('爱    对应的词向量为:',model['爱'])
    print('喜欢  对应的词向量为:',model['喜欢'])
    print('爱  和  喜欢的距离(余弦距离)',model.wv.similarity('爱','喜欢'))
    print('爱  和  喜欢的距离(欧式距离)',model.wv.distance('爱','喜欢'))
    print('与 爱 最相近的3个词:',model.wv.similar_by_word('爱',topn=3))
    print('与 喜欢 最相近的3个词:',model.wv.similar_by_word('喜欢',topn=3))
    print('爱,喜欢,恨 中最与众不同的是:',model.wv.doesnt_match(['爱','喜欢','恨']))


#结果
词表长度: 8296
爱    对应的词向量为: [-1.0453074  -2.5688617   1.2240907  ...
喜欢  对应的词向量为: [-0.5997423  -1.8003637   1.2935492  ...
爱  和  喜欢的距离(余弦距离) 0.89702404
爱  和  喜欢的距离(欧式距离) 0.10297596454620361
与 爱 最相近的3个词: [('喜欢', 0.89702), ('伤害', 0.88481), ('情感', 0.883626)]
与 喜欢 最相近的3个词: [('青梅竹马', 0.91182), ('轻浮', 0.91145), ('爱', 0.89702)]
爱,喜欢,恨 中最与众不同的是: 恨

更多内容欢迎扫码关注公众号月来客栈!
在这里插入图片描述

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页