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