赞
踩
pip install gensim
gensim
中封装了包括word2vec
、doc2vec
等模型,word2vec
采用了CBOW(Continuous Bag-Of-Words,连续词袋模型)
和Skip-Gram
两种模型。
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参数解释
1、sentences 第一个参数是预处理后的训练语料库,是可迭代列表,但是对于较大的语料库,可以直接从磁盘/网络传输句子迭代。
2、sg=1是skip-gram算法,对于低频词敏感;默认sg=0为CBOW算法
3、size(int) 是输出词向量的维数默认值是100,。这个维度的取值和我们的语料库大小有关,比如小于100M的文本语料库,则使用默认值就可以。如果是超大语料库,建议增大维度。值太小会导致词映射因为冲突而导致影响结果,值太大则会耗内存并使计算变慢,一般取值为100到200之间,不过见的比较多的也有300的维度
4、window(int) 是一个句子中当前单词和预测单词之间的最大距离,window越大,则和某一较远的词也会产生上下文关系。默认值为5。window值越大所需要枚举的预测词越多,计算时间越长。
5、min_count 忽略所有频率低于此值的但单词,默认值是5.
6、workers表示训练词向量时使用的进程数,默认是但当前运行机器的处理器核数。
* 还有关于采样和学习率的,一般不常设置。
1、negative和sample可根据训练结果进行微调,sample表示更高频率的词被随机下采样到所设置的阈值,默认值是 1e-3。
2、hs=1 表示层级softmax将会被使用,默认hs=0且negative不为0,则负采样将会被使用。
from gensim.models import Word2Vec
sentences = [["cat", "say", "meow"], ["dog", "say", "woof"]]
# 数据也可以是分好词的文档,按行进项读取
# sentences = word2vec.Text8Corpus('xxx.txt')
model = Word2Vec(sentences,min_count=1
模型保存有两种方式:
model = Word2Vec(common_texts,size=100,windows=5,min_count=1,workers=4)
model.save(path)
#或者
model.wv.save(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")
模型的继续训练
训练是流式的,这意味着句子可以是一个生成器,动态的从磁盘读取数据,而无需将整个语料库加载到RAM中。这也意味着你可以在以后继续训练模型
from gensim.test.utils import commom_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'] #如果已经完成模型的训练(即不再进项更新,只进行查询),可以切换到KeyedVectors实例 word_vectors = model.wv def model
如要继续训练,需要save()存储完整的Word2Vec对象状态,而不仅仅是Keyedvector。如果不需要继续训练模型,在加载时设置参数model.wv.save(path)
以及KeyedVectots.load("model.wv",mmap='r')
分离训练向量到KeyedVectots,得到更小、更快的模型对象。
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(apth)
wv=KeyedVectors.load("model.wv",mmap='r')
vector = wv['computer']
如果从文件加载训练好的模型(人民日报词向量):
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)
wv_from_bin = KeyedVectors.load_word2vec_format(datapath("euclidean_vectors.bin"),binary=True)
在已经获取模型的前提下可以进行
model['computer']
model.most_similar(postive=['woman','king'],negative=['man'])
model.similarity('好','还行')
model.most_similar("word")
model.similar_by_word('贪污',topn=100) # 最接近的100个词
当出现某个词语不再这个训练集合中的时候,会报错。
list_sim1 = model.n_similarity(list1,list2)
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)) 纽约 西瓜
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。