【轉】Gensim庫詳解
阿新 • • 發佈:2018-12-10
一、gensim介紹
gensim是一款強大的自然語言處理工具,裡面包括N多常見模型:
基本的語料處理工具
- - LSI
- - LDA
- - HDP
- - DTM
- - DIM
- - TF-IDF
- - word2vec、paragraph2vec
二、訓練模型
1、訓練
#encoding=utf-8 from gensim.models import word2vec sentences=word2vec.Text8Corpus(u'分詞後的爽膚水評論.txt') model=word2vec.Word2Vec(sentences, size=50) y2=model.similarity(u"好", u"還行") print(y2) for i in model.most_similar(u"滋潤"): print i[0],i[1]
txt檔案是已經分好詞的5W條評論,訓練模型只需一句話:
model=word2vec.Word2Vec(sentences,min_count=5,size=50)
第一個引數是訓練語料,第二個引數是小於該數的單詞會被剔除,預設值為5, 第三個引數是神經網路的隱藏層單元數,預設為100 .
2、模型匯出
word2vec = gensim.models.word2vec.Word2Vec(sentences(), size=256, window=10, min_count=64, sg=1, hs=1, iter=10, workers=25) word2vec.save('word2vec_wx')
word2vec.save即可匯出檔案,這邊沒有匯出為.bin .
3、模型匯入
model = gensim.models.Word2Vec.load('xxx/word2vec_wx')
pd.Series(model.most_similar(u'微信',topn = 360000))
gensim.models.Word2Vec.load的辦法匯入
其中的Numpy,可以用numpy.load:
import numpy
word_2x = numpy.load('xxx/word2vec_wx.wv.syn0.npy')
還有其他的匯入方式:
from gensim.models.keyedvectors import KeyedVectors word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format
匯入txt格式+bin格式。 .
4、增量訓練
model = gensim.models.Word2Vec.load('/tmp/mymodel')
model.train(more_sentences)
不能對C生成的模型進行再訓練. .
三、gensim訓練好的word2vec使用
1、相似性
持數種單詞相似度任務: 相似詞+相似係數(model.most_similar)、model.doesnt_match、model.similarity(兩兩相似)
model.most_similar(positive=['woman', 'king'], negative=['man'], topn=1)
[('queen', 0.50882536)]
model.doesnt_match("breakfast cereal dinner lunch".split())
'cereal'
model.similarity('woman', 'man')
.73723527
2、詞向量
通過以下方式來得到單詞的向量:
model['computer'] # raw NumPy vector of a word
array([-0.00449447, -0.00310097, 0.02421786, ...], dtype=float32)
案例一:800萬微信語料訓練
訓練過程:
import gensim, logging
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
import pymongo
import hashlib
db = pymongo.MongoClient('172.16.0.101').weixin.text_articles_words
md5 = lambda s: hashlib.md5(s).hexdigest()
class sentences:
def __iter__(self):
texts_set = set()
for a in db.find(no_cursor_timeout=True):
if md5(a['text'].encode('utf-8')) in texts_set:
continue
else:
texts_set.add(md5(a['text'].encode('utf-8')))
yield a['words']
print u'最終計算了%s篇文章'%len(texts_set)
word2vec = gensim.models.word2vec.Word2Vec(sentences(), size=256, window=10, min_count=64, sg=1, hs=1, iter=10, workers=25)
word2vec.save('word2vec_wx')
這裡引入hashlib.md5是為了對文章進行去重(本來1000萬篇文章,去重後得到800萬),而這個步驟不是必要的。