1. 程式人生 > >【轉載】中文word2vec的python實現

【轉載】中文word2vec的python實現

轉自https://blog.csdn.net/sinat_29694963/article/details/79177832

 

1、語料相關說明

第一種方法是去網上下載相關語料,我這裡有一個英文語料模型點我下載,它適合於使用word2vec英文訓練的語料,約96M,包括常用的英文詞彙。

而由於中文語料比較少,暫時也是寫前期程式碼測試,就去網上下載了《倚天屠龍記》小說全集,為txt格式,作為訓練文字,此檔案較小,不能達到很好的訓練效果。

2、中文訓練語料的處理

首先去網上下載了這本小說,然後將其開啟後另存為,注意選utf-8編碼格式。 
 
文字檔案準備好,現在開始用python對此txt文件進行處理。

# 此函式作用是對初始語料進行分詞處理後,作為訓練模型的語料
def cut_txt(old_file):
    import jieba
    global cut_file     # 分詞之後儲存的檔名
    cut_file = old_file + '_cut.txt'

    try:
        fi = open(old_file, 'r', encoding='utf-8')
    except BaseException as e:  # 因BaseException是所有錯誤的基類,用它可以獲得所有錯誤型別
        print(Exception, ":", e)    # 追蹤錯誤詳細資訊

    text = fi.read()  # 獲取文字內容
    new_text = jieba.cut(text, cut_all=False)  # 精確模式
    str_out = ' '.join(new_text).replace(',', '').replace('。', '').replace('?', '').replace('!', '') \
        .replace('“', '').replace('”', '').replace(':', '').replace('…', '').replace('(', '').replace(')', '') \
        .replace('—', '').replace('《', '').replace('》', '').replace('、', '').replace('‘', '') \
        .replace('’', '')     # 去掉標點符號
    fo = open(cut_file, 'w', encoding='utf-8')
    fo.write(str_out)12345678910111213141516171819

注意open中必須指明編碼方式,否則就會報錯;上面的函式若要單獨執行,須要更改old_file變數為原檔名。

3、訓練模型

準備好訓練語料(注意訓練語料檔案越大越好,越大最後的訓練效果越好),之後就開始寫訓練模型了,訓練模型的程式碼如下所示:

def model_train(train_file_name, save_model_file):  # model_file_name為訓練語料的路徑,save_model為儲存模型名
    from gensim.models import word2vec
    import gensim
    import logging
    # 模型訓練,生成詞向量
    logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)
    sentences = word2vec.Text8Corpus(train_file_name)  # 載入語料
    model = gensim.models.Word2Vec(sentences, size=200)  # 訓練skip-gram模型; 預設window=5
    model.save(save_model_file)
    model.wv.save_word2vec_format(save_model_name + ".bin", binary=True)   # 以二進位制型別儲存模型以便重用12345678910

訓練後的模型用普通方式和二進位制方式進行儲存,以便下次直接使用,避免每次訓練耗費大量時間。

4、word2vec模型呼叫

兩個功能都以函式方式實現了,現在準備編寫主函式程式碼,在主函式中負責呼叫各個方法實現預處理和模型訓練,以此做後面的相關計算。

from gensim.models import word2vec
import os
import gensim

# if not os.path.exists(cut_file):    # 判斷檔案是否存在,參考:https://www.cnblogs.com/jhao/p/7243043.html
cut_txt('倚天屠龍記.txt')  # 須注意檔案必須先另存為utf-8編碼格式

save_model_name = '倚天屠龍記.model'
if not os.path.exists(save_model_name):     # 判斷檔案是否存在
    model_train(cut_file, save_model_name)
else:
    print('此訓練模型已經存在,不用再次訓練')

# 載入已訓練好的模型
model_1 = word2vec.Word2Vec.load(save_model_name)
# 計算兩個詞的相似度/相關程度
y1 = model_1.similarity("趙敏", "韋一笑")
print(u"趙敏和韋一笑的相似度為:", y1)
print("-------------------------------\n")

# 計算某個詞的相關詞列表
y2 = model_1.most_similar("張三丰", topn=10)  # 10個最相關的
print(u"和張三丰最相關的詞有:\n")
for item in y2:
    print(item[0], item[1])
print("-------------------------------\n")1234567891011121314151617181920212223242526

最後的執行結果如下所示: 
 
最終的結果一定程式上還是取決於分詞的準確率,使用jieba分詞時可以針對性的加入使用者自定義詞典(jieba.load_userdict(“userDict.txt”)   # 載入使用者自定義詞典),可以提高對人名,地名等未登陸詞的識別效果,提高分詞效能。

如有問題,歡迎留言指出,共同進步。
--------------------- 
作者:笑傲蒼穹0 
來源:CSDN 
原文:https://blog.csdn.net/sinat_29694963/article/details/79177832 
版權宣告:本文為博主原創文章,轉載請附上博文連結!