【转】python-word2vec模块使用详解
生活随笔
收集整理的這篇文章主要介紹了
【转】python-word2vec模块使用详解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
安裝
安裝方法:pip install --upgrade gensim
安裝分詞:pip install jieba
中文訓練預料處理
首先去網上下載一本小書,然后將其另存為utf-8格式
文本文件準備好,現在開始用python對此txt文檔進行處理。
注意open中必須指明編碼方式,否則就會報錯;上面的函數若要單獨運行,須要更改old_file變量為原文件名。
模型訓練
準備好訓練語料(注意訓練語料文件越大越好,越大最后的訓練效果越好),之后就開始寫訓練模型了,訓練模型的代碼如下所示:
from gensim.models import word2vec import gensim import loggingdef model_train(train_file_name, save_model_file): # model_file_name為訓練語料的路徑,save_model為保存模型名# 模型訓練,生成詞向量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=5model.save(save_model_file)model.wv.save_word2vec_format(save_model_file + ".bin", binary=True) # 以二進制類型保存模型以便重用參數說明:
model=gensim.models.Word2Vec(sentences,sg=1,size=100,window=5,min_count=2,negative=3,sample=0.001,hs=1,workers=4)#該步驟也可分解為以下三步(但沒必要): #model=gensim.model.Word2Vec() 建立一個空的模型對象 #model.build_vocab(sentences) 遍歷一次語料庫建立詞典 #model.train(sentences) 第二次遍歷語料庫建立神經網絡模型#sg=1是skip—gram算法,對低頻詞敏感,默認sg=0為CBOW算法 #size是神經網絡層數,值太大則會耗內存并使算法計算變慢,一般值取為100到200之間。 #window是句子中當前詞與目標詞之間的最大距離,3表示在目標詞前看3-b個詞,后面看b個詞(b在0-3之間隨機) #min_count是對詞進行過濾,頻率小于min-count的單詞則會被忽視,默認值為5。 #negative和sample可根據訓練結果進行微調,sample表示更高頻率的詞被隨機下采樣到所設置的閾值,默認值為1e-3, #negative: 如果>0,則會采用negativesamping,用于設置多少個noise words #hs=1表示層級softmax將會被使用,默認hs=0且negative不為0,則負采樣將會被選擇使用。 #workers是線程數,此參數只有在安裝了Cpython后才有效,否則只能使用單核我們并不需要全部了解,大部分參數都可以使用其默認值(不輸入),而其中比較重要的有:
# min_count,是去除小于min_count的單詞 # size,神經網絡層數 # sg, 算法選擇 # window, 句子中當前詞與目標詞之間的最大距離 # workers,線程數訓練后的模型用普通方式和二進制方式進行保存,以便下次直接使用,避免每次訓練耗費大量時間。
word2vec模型調用
兩個功能都以函數方式實現了,現在準備編寫主函數代碼,在主函數中負責調用各個方法實現預處理和模型訓練,以此做后面的相關計算。
# 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) # 計算兩個詞的相似度/相關程度 word_1 = "金毛獅" word_2 = "謝遜" y1 = model_1.similarity(word_1, word_2) print(word_1, "和", word_2, "的相似度為:", y1) print("-------------------------------\n")# 計算某個詞的相關詞列表 word_3 = "張無忌" y2 = model_1.most_similar(word_3, topn=10) # 10個最相關的 print(u"和", word_3, "最相關的詞有:\n") for item in y2:print(item[0], item[1]) print("-------------------------------\n")# 某個詞的詞向量 print(model_1['張無忌'])最后的運行結果如下所示:
最終的結果一定程序上還是取決于分詞的準確率,使用jieba分詞時可以針對性的加入用戶自定義詞典(jieba.load_userdict(“userDict.txt”) # 加載用戶自定義詞典),可以提高對人名,地名等未登陸詞的識別效果,提高分詞性能。
總結
以上是生活随笔為你收集整理的【转】python-word2vec模块使用详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大小脸矫正牙齿管用吗
- 下一篇: python中哈达玛积与矩阵乘法的区别