天天看點

使用自己的語料訓練word2vec模型

一、 準備環境和語料:
  • 新聞20w+篇(格式:

    标題

    正文

【新聞可以自己從各大新聞網站爬取,也可以下載下傳開源的新聞資料集,如
二、分詞

先對新聞文本進行分詞,使用的是結巴分詞工具,将分詞後的文本儲存在

seg201708.txt

,以備後期使用。

安裝jieba工具包:pip install jieba
# -*- coding: utf-8 -*-
import jieba
import io
# 加載自己的自己的金融詞庫
jieba.load_userdict("financialWords.txt")

def main():
    with io.open('news201708.txt','r',encoding='utf-8') as content:
        for line in content:
            seg_list = jieba.cut(line)
#           print '/'.join(seg_list)
            with io.open('seg201708.txt', 'a', encoding='utf-8') as output:
                output.write(' '.join(seg_list))
            
if __name__ == '__main__':
    main()
           
三、訓練word2vec模型

使用python的gensim包進行訓練。

安裝gemsim包:pip install gemsim
from gensim.models import word2vec

def main():

    num_features = 300    # Word vector dimensionality
    min_word_count = 10   # Minimum word count
    num_workers = 16       # Number of threads to run in parallel
    context = 10          # Context window size
    downsampling = 1e-3   # Downsample setting for frequent words
    sentences = word2vec.Text8Corpus("seg201708.txt")

    model = word2vec.Word2Vec(sentences, workers=num_workers, \
            size=num_features, min_count = min_word_count, \
            window = context, sg = 1, sample = downsampling)
    model.init_sims(replace=True)
    # 儲存模型,供日後使用
    model.save("model201708")
    
    # 可以在加載模型之後使用另外的句子來進一步訓練模型
    # model = gensim.models.Word2Vec.load('/tmp/mymodel')
    # model.train(more_sentences)

if __name__ == "__main__":
    main()
           
  • 參數說明
  • sentences:可以是一個·ist,對于大語料集,建議使用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
四、word2vec應用
model = Word2Vec.load('model201708')      #模型讀取方式
model.most_similar(positive=['woman', 'king'], negative=['man']) #根據給定的條件推斷相似詞
model.doesnt_match("breakfast cereal dinner lunch".split()) #尋找離群詞
model.similarity('woman', 'man') #計算兩個單詞的相似度
model['computer'] #擷取單詞的詞向量