Python gensim庫word2vec 基本用法


ip install gensim安裝好庫后,即可導入使用:

1、訓練模型定義

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)  

  

參數解釋:

0.sentences是訓練所需語料,可通過以下方式進行加載

sentences=word2vec.Text8Corpus(file)

  

此處訓練集的格式為英文文本或分好詞的中文文本

1.sg=1是skip-gram算法,對低頻詞敏感;默認sg=0為CBOW算法。

2.size是輸出詞向量的維數,值太小會導致詞映射因為沖突而影響結果,值太大則會耗內存並使算法計算變慢,一般值取為100到200之間。

3.window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,后面看b個詞(b在0-3之間隨機)。

4.min_count是對詞進行過濾,頻率小於min-count的單詞則會被忽視,默認值為5。

5.negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值為1e-3。

6.hs=1表示層級softmax將會被使用,默認hs=0且negative不為0,則負采樣將會被選擇使用。

7.workers控制訓練的並行,此參數只有在安裝了Cpython后才有效,否則只能使用單核。

詳細參數說明可查看word2vec源代碼。

 

2、訓練后的模型保存與加載

model.save(fname)  
model = Word2Vec.load(fname)  


3、模型使用

model.most_similar(positive=['woman', 'king'], negative=['man'])  
#輸出[('queen', 0.50882536), ...]  
  
model.doesnt_match("breakfast cereal dinner lunch".split())  
#輸出'cereal'  
  
model.similarity('woman', 'man')  
#輸出0.73723527  
  
model['computer']  # raw numpy vector of a word  
#輸出array([-0.00449447, -0.00310097,  0.02421786, ...], dtype=float32)  

  

 gensim  word2vec實戰

我選擇的《人民的名義》的小說原文作為語料,語料原文在這里

完整代碼參見 github: https://github.com/ljpzzz/machinelearning/blob/master/natural-language-processing/word2vec.ipynb

拿到了原文,我們首先要進行分詞,這里使用結巴分詞完成。在中文文本挖掘預處理流程總結中,我們已經對分詞的原理和實踐做了總結。

加入下面的一串人名是為了結巴分詞能更准確的把人名分出來。

# -*- coding: utf-8 -*-

import jieba
import jieba.analyse

jieba.suggest_freq('沙瑞金', True)
jieba.suggest_freq('田國富', True)
jieba.suggest_freq('高育良', True)
jieba.suggest_freq('侯亮平', True)
jieba.suggest_freq('鍾小艾', True)
jieba.suggest_freq('陳岩石', True)
jieba.suggest_freq('歐陽菁', True)
jieba.suggest_freq('易學習', True)
jieba.suggest_freq('王大路', True)
jieba.suggest_freq('蔡成功', True)
jieba.suggest_freq('孫連城', True)
jieba.suggest_freq('季昌明', True)
jieba.suggest_freq('丁義珍', True)
jieba.suggest_freq('鄭西坡', True)
jieba.suggest_freq('趙東來', True)
jieba.suggest_freq('高小琴', True)
jieba.suggest_freq('趙瑞龍', True)
jieba.suggest_freq('林華華', True)
jieba.suggest_freq('陸亦可', True)
jieba.suggest_freq('劉新建', True)
jieba.suggest_freq('劉慶祝', True)

with open('./in_the_name_of_people.txt') as f:
    document = f.read()
    
    #document_decode = document.decode('GBK')
    
    document_cut = jieba.cut(document)
    #print  ' '.join(jieba_cut)  //如果打印結果,則分詞效果消失,后面的result無法顯示
    result = ' '.join(document_cut)
    result = result.encode('utf-8')
    with open('./in_the_name_of_people_segment.txt', 'w') as f2:
        f2.write(result)
f.close()
f2.close()

 拿到了分詞后的文件,在一般的NLP處理中,會需要去停用詞。由於word2vec的算法依賴於上下文,而上下文有可能就是停詞。因此對於word2vec,我們可以不用去停詞。

 現在我們可以直接讀分詞后的文件到內存。這里使用了word2vec提供的LineSentence類來讀文件,然后套用word2vec的模型。

   這里只是一個示例,因此省去了調參的步驟,實際使用的時候,你可能需要對我們上面提到一些參數進行調參。

 
# import modules & set up logging
import logging
import os
from gensim.models import word2vec

logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

sentences = word2vec.LineSentence('./in_the_name_of_people_segment.txt') 

model = word2vec.Word2Vec(sentences, hs=1,min_count=1,window=3,size=100)  
 

模型出來了,我們可以用來做什么呢?這里給出三個常用的應用。

第一個是最常用的,找出某一個詞向量最相近的詞集合,代碼如下:

 
req_count = 5
for key in model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100):
    if len(key[0])==3:
        req_count -= 1
        print key[0], key[1]
        if req_count == 0:
            break;
 

我們看看沙書記最相近的一些3個字的詞(主要是人名)如下:

高育良 0.967257142067
李達康 0.959131598473
田國富 0.953414440155
易學習 0.943500876427
祁同偉 0.942932963371

第二個應用是看兩個詞向量的相近程度,這里給出了書中兩組人的相似程度:

print model.wv.similarity('沙瑞金'.decode('utf-8'), '高育良'.decode('utf-8'))
print model.wv.similarity('李達康'.decode('utf-8'), '王大路'.decode('utf-8'))

輸出如下:

0.961137455325
0.935589365706

第三個應用是找出不同類的詞,這里給出了人物分類題:

print model.wv.doesnt_match(u"沙瑞金 高育良 李達康 劉慶祝".split())

word2vec也完成的很好,輸出為"劉慶祝"。

 

gensim word2vec :https://www.cnblogs.com/pinard/p/7278324.html

word2vec原理:http://www.cnblogs.com/pinard/p/7160330.html  

 

原文:https://blog.csdn.net/angus_monroe/article/details/76999920


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM