1. 程式人生 > >【轉】Gensim庫詳解

【轉】Gensim庫詳解

一、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萬),而這個步驟不是必要的。