训练语料格式

语料需要处理为可迭代的列表见word2vec教程 语料处理,形成我们的参数“sentences”

模型训练

1.安装gensim

pip3.6 install gensim

gensim中封装了包括了word2vec, doc2vec等模型,word2vec采用了CBOW(Continuous Bag-Of-Words,连续词袋模型)和Skip-Gram两种模型。

2.模型训练

from gensim.models import Word2Vec
model = Word2Vec(sentences, sg=1, size=100,  window=5,  min_count=5,  negative=3, sample=0.001, hs=1, workers=4)

gensim参数解释 

sentences:可以是一个list,对于大语料集,建议使用BrownCorpus,Text8Corpus或ineSentence构建。
sg: 用于设置训练算法,默认为0,对应CBOW算法;sg=1则采用skip-gram算法。
size:是指特征向量的维度,默认为100。大的size需要更多的训练数据,但是效果会更好. 推荐值为几十到几百。
window:表示当前词与预测词在一个句子中的最大距离是多少
alpha: 是学习速率
seed:用于随机数发生器。与初始化词向量有关。
min_count: 可以对字典做截断. 词频少于min_count次数的单词会被丢弃掉, 默认值为5
max_vocab_size: 设置词向量构建期间的RAM限制。如果所有独立单词个数超过这个,则就消除掉其中最不频繁的一个。每一千万个单词需要大约1GB的RAM。设置成None则没有限制。
sample: 高频词汇的随机降采样的配置阈值,默认为1e-3,范围是(0,1e-5) workers参数控制训练的并行数。
hs: 如果为1则会采用hierarchica·softmax技巧。如果设置为0(defau·t),则negative sampling会被使用。
negative: 如果>0,则会采用negativesamp·ing,用于设置多少个noise words
cbow_mean: 如果为0,则采用上下文词向量的和,如果为1(defau·t)则采用均值。只有使用CBOW的时候才起作用。
hashfxn:hash函数来初始化权重。默认使用python的hash函数
iter: 迭代次数,默认为5
trim_rule:用于设置词汇表的整理规则,指定那些单词要留下,哪些要被删除。可以设置为None(min_count会被使用)或者一个接受()并返回RU·E_DISCARD,uti·s.RU·E_KEEP或者uti·s.RU·E_DEFAU·T的
sorted_vocab如果为1(defau·t),则在分配word index 的时候会先对单词基于频率降序排序。
batch_words:每一批的传递给线程的单词的数量,默认为10000
workers表示训练词向量时使用的线程数,默认是当前运行机器的处理器核数。还有关采样和学习率的,一般不常设置

 
from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
#数据也可以时分好词的文档,按行读取
#sentences=word2vec.Text8Corpus("分词后文件.txt")
model = Word2Vec(sentences, min_count=1)
详细请参考gensim的word2vec的官方说明,里面讲的很详细,不过常用到的参数就是上面介绍的。

3.模型保存

模型保存两种方式:

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.save(path) 或者 
model.wv.save(path)
两种的区别见3.1及3.2。

ps:model.save_word2vec_format("w2v_vector.bin", binary=False)这种方式是二进制保存,已经弃用改为 model.wv.save

3.1模型训练保存与加载1(模型可继续训练)

model.save(path)

Word2Vec.load(path)

使用以下命令初始化模型
from gensim.test.utils import common_texts, get_tmpfile
from gensim.models import Word2Vec

path = get_tmpfile("word2vec.model") #创建临时文件

model = Word2Vec(sentences, size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")

#加载模型
model = Word2Vec.load("word2vec.model")

3.1.1模型继续训练

训练是流式的,这意味着句子可以是一个生成器,动态地从磁盘读取输入数据,而无需将整个语料库加载到RAM中。这也意味着您可以在以后继续培训模型:

#训练模型
使用以下命令初始化模型
from gensim.test.utils import common_texts, get_tmpfile
from gensim.models import Word2Vec

path = get_tmpfile("word2vec.model") #创建临时文件

model = Word2Vec(sentences, size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")

#加载模型
model = Word2Vec.load("word2vec.model")

#继续训练
model.train([["hello", "world"]], total_examples=1, epochs=1)
#(0, 2)
#调用模型
vector = model['computer'] # numpy vector of a word

# 如果已经完成了模型的培训(即不再更新,只进行查询),可以切换到KeyedVectors实例
word_vectors = model.wv
del model

3.2模型训练保存与加载2(模型不可继续训练)

from gensim.models import KeyedVectors

model.wv.save(path)

wv = KeyedVectors.load("model.wv", mmap='r')

要继续进行培训,需要save()存储的完整Word2Vec对象状态,而不仅仅是keyedvector。如果不需要继续训练模型,在加载时设置参数 model.wv.save(path)  以及 KeyedVectors.load("model.wv", mmap='r')分离训练向量到KeyedVectors,得到更小、更快的模型对象。

from gensim.models import KeyedVectors

path = get_tmpfile("model.wv")
model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.wv.save(path)
wv = KeyedVectors.load("model.wv", mmap='r')
vector = wv['computer'] # numpy vector of a word

如果从文件加载训练好的模型(人民日报词向量): 

from gensim.models import KeyedVectors
from gensim.test.utils import datapath
model= KeyedVectors.load_word2vec_format(datapath('E:\Mypython3\wenshu_my\data_my\sgns.renmin.bigram-char'), binary=False)
for key in model.similar_by_word('人民',topn=10):
print(key)

('各族人民', 0.6978535652160645)
('人民大众', 0.6294125318527222)
('亿万人民', 0.6256287097930908)
('群众', 0.5972658395767212)
('民众', 0.567489504814148)
('城乡人民', 0.5603191256523132)
('广大群众', 0.5412135124206543)
('新疆各族人民', 0.5377484560012817)
('百姓', 0.5321395993232727)
('劳苦大众', 0.530288577079773)


gensim官网例子训练一个完整的模型,然后访问它的模型。wv属性,它包含独立键控向量。例如,使用Word2Vec算法来训练向量

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

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
word_vectors = model.wv
将单词vector保存到磁盘 

from gensim.test.utils import get_tmpfile
from gensim.models import KeyedVectors

fname = get_tmpfile("vectors.kv")
word_vectors.save(fname)
word_vectors = KeyedVectors.load(fname, mmap='r')
 这些向量还可以从磁盘上的现有文件实例化,以原始谷歌的word2vec C格式作为KeyedVectors实例

from gensim.test.utils import datapath

wv_from_text = KeyedVectors.load_word2vec_format(datapath('word2vec_pre_kv_c'), binary=False) # C text format
wv_from_bin = KeyedVectors.load_word2vec_format(datapath("euclidean_vectors.bin"), binary=True) # C binary format

这篇博客讲的比较细致,简单的例子见https://blog.csdn.net/shuihupo/article/details/85226128 python训练work2vec词向量实例
work2vec词向量使用汇总(词语相似度、集合相似度、词向量计算等)
在已经获取模型的前提下可以进行:

1.获取每个词的词向量

model['computer']  # raw numpy vector of a word

2支持词语的加减运算。(实际中可能只有少数例子比较符合)

model.most_similar(positive=['woman', 'king'], negative=['man'])

3计算两个词之间的余弦距离

model.similarity("好", "还行")

4计算余弦距离最接近“word”的10个词,或topn个词

model.most_similar("word")

model.similar_by_word('贪污', topn =100) 最接近的100个词

5计算两个集合之间的余弦似度

当出现某个词语不在这个训练集合中的时候,会报错
list_sim1 =  model.n_similarity(list1, list2)

6.选出集合中不同类的词语

model.doesnt_match("breakfast cereal dinner lunch".split())

#使用以下命令初始化模型
from gensim.test.utils import common_texts, get_tmpfile
from gensim.models import Word2Vec

path = get_tmpfile("word2vec.model") #创建临时文件

model = Word2Vec(common_texts, size=100, window=5, min_count=1, workers=4)
model.save("word2vec.model")
#加载模型
model = Word2Vec.load("word2vec.model")
--------------------- 
#获取每个词的词向量
model['computer'] # raw numpy vector of a word
#输出array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
--------------------- 
# 支持词语的加减运算。(实际中可能只有少数例子比较符合)
model.most_similar(positive=['woman', 'king'], negative=['man'])
#输出[('queen', 0.50882536), ...]
--------------------- 
#计算两个词之间的余弦距离
model.similarity("好", "还行")
model.most_similar("人民")#计算余弦距离最接近“滋润”的10个词
for i in model.most_similar("人民"):
print i[0],i[1]
--------------------- 
#model.similar_by_word('人民',topn=100) 输出与“人民”相似的前100个词
for key in model.similar_by_word('人民',topn=10):
print(key)
for key in model.wv.similar_by_word('人民', topn =10):
print(key)
---------------------
#计算两个集合之间的余弦似度,当出现某个词语不在这个训练集合中的时候,会报错
list1 = [u'今天', u'我', u'很', u'开心']
list2 = [u'空气',u'清新', u'善良', u'开心']
list3 = [u'国家电网', u'再次', u'宣告', u'破产', u'重新']
list_sim1 = model.n_similarity(list1, list2)
print (list_sim1)
list_sim2 = model.n_similarity(list1, list3)
print( list_sim2) 
0.541874230659
0.13056320154
--------------------- 
#选出集合中不同类的词语
model.doesnt_match("breakfast cereal dinner lunch".split())
#输出'cereal'
list = ['纽约', '北京', '上海', '西安']
print( model.doesnt_match(list))
list = ['纽约', '北京', '上海', '西瓜']
print(model.doesnt_match(list))
纽约
西瓜