我在自己的開源語義網絡項目graph-mind(其實是自己寫的壹個小玩具)中使用了這些函數。妳可以直接用我的進壹步包裝在上面完成壹些操作。下面分享壹下調用方法和壹些代碼上的經驗。
1.壹些類成員變量:
【python】?觀平原?復制
def?__init__(self,模型路徑,?_size=100,?_window=5,?_minCount=1,?_ workers =多重處理. cpu_count()):?
self.modelPath?=?模型路徑?
自我。_size?=?_size?
自我。_window?=?_window?
自我。_minCount?=?_minCount?
自我。_工人?=?_工人?
ModelPath是word2vec訓練模型的磁盤存儲文件(模型在內存中總是不可靠的),_size是詞向量的維數,_window是詞向量訓練時上下文掃描窗口的大小,後壹個未知。_workers默認為訓練進程數(請指正),默認為當前運行機器的處理器核數。先記住這些參數就行了。
2.第壹次初始化和訓練word2vec模型。
該函數的核心函數是initTrainWord2VecModel,傳入兩個參數:corpusFilePath和safe_model,分別代表訓練語料的路徑和是否選擇“安全模式”進行初始訓練。這個“安全模式”我們以後再說。讓我們先看看代碼:
【python】?觀平原?復制
def?initTrainWord2VecModel(self,?corpusFilePath,?safe_model=False):?
'''''?
初始化?然後呢。火車?答?新的?w2v?模特?
(corpusFilePath?可以嗎?是嗎?答?路徑?的?語料庫?文件?還是?目錄?還是?答?文件?直接,?在?壹些?時間?它?可以嗎?是嗎?句子?直接?
關於什麽?軟_模型:?
如果?安全_模型?是嗎?真的嗎?那個?流程?的?培訓?用途?更新?方式?去哪?刷新?型號,?
然後呢。這個?可以嗎?保持?那個?用法?的?os的?記憶?安全嗎?但是呢?慢慢地。?
然後呢。如果?安全_模型?是嗎?假的,?那個?流程?的?培訓?用途?那個?方式?那個?加載?全部?
語料庫?臺詞?變成?答?句子?列表?然後呢。火車?他們?壹個?時間。)?
'''?
extraSegOpt()。reLoadEncoding()?
文件類型?=?localfileoptnunit . check filestate(corpus file path)?
如果?文件類型?==?u'error ':
warnings.warn('load?文件?“錯誤!”)?
回歸?沒有嗎?
否則:?
模特?=?沒有嗎?
如果?文件類型?==?u'opened ':?
打印('培訓?模特?從哪裏?單列!)?
模特?=?word 2 vec(LineSentence(corpus file path),?尺寸=自身。_size,?窗口=自己。_window,min _ count =自身。_minCount,?工人=自己。_workers)?
埃利夫?文件類型?==?u'file ':
corpusFile?=?打開(corpusFilePath,u'r ')?
打印('培訓?模特?從哪裏?單列!)?
模特?=?word 2 vec(LineSentence(corpus file),?尺寸=自身。_size,?窗口=自己。_window,min _ count =自身。_minCount,?工人=自己。_workers)?
埃利夫?文件類型?==?u“目錄”:
corpusFiles文件?=?localfileoptnunit . listallfileindirectory(corpus file path)?
打印('培訓?模特?從哪裏?列表文件?的?“目錄!”)?
如果?安全_模型?==?真實:?
模特?=?word 2 vec(line sentence(corpus files[0])、?尺寸=自身。_size,?窗口=自己。_window,min _ count =自身。_minCount,?工人=自己。_workers)?
為了什麽?文件?在?corpus files[1:len(corpus files)]:?
模特?=?self.updateW2VModelUnit(型號,?文件)?
否則:?
句子?=?self . loadsetencesfromfiles(corpus files)?
模特?=?Word2Vec(句子,?尺寸=自身。_size,?窗口=自己。_window,min _ count =自身。_minCount,?工人=自己。_workers)?
埃利夫?文件類型?==?u'other ':
#?托多?補充?句子?列表?直接?
通過?
model.save(self.modelPath)?
model.init_sims()?
打印('生產?word2vec?模特?...?好吧!)?
回歸?模特?
首先是壹些雜七雜八的東西。判斷輸入文件路徑下的訪問結果的類型,根據不同的類型做出不同的文件處理反應。這個大家應該都能理解。以corpusFilePath作為打開的文件對象為例,創建word2vec模型的代碼為:
【python】?觀平原?復制
模特?=?word 2 vec(LineSentence(corpus file path),?尺寸=自身。_size,?窗口=自己。_window,min _ count =自身。_minCount,?工人=自己。_workers)?
其實就是這麽簡單,但是為了代碼健壯,就變得和上面壹樣長了。問題是當面對壹個路徑下的大量訓練文檔時,壹次性加載內存可能不太靠譜(不去研究gensim在Word2Vec的構造方法中是否考慮過這個問題,只是習慣性的警惕),所以我設置了壹個參數safe_model來判斷初始訓練是否啟動“安全模式”。所謂安全模式,就是壹開始只加載壹個語料庫,後續的初始訓練文檔采用增量學習的方式進行更新。
在上面的代碼中,corpusFilePath可以傳入壹個打開的file對象,或者單個文件的地址,或者壹個文件夾的路徑,類型已經被函數checkFileState判斷過了。另壹個功能是updatew2vModelUnit,用於增量訓練和更新W2V的模型,下面會詳細介紹。loadSetencesFromFiles函數用於將所有語料庫的所有句子加載到壹個文件夾中。這是源代碼裏的,很簡單,就不多說了。
3.更新word2vec模型的增量培訓
增量訓練w2v模型,上面提到了這麽做的壹個原因:避免壹次性將所有訓練語料加載到內存中。另壹個原因是為了應對隨時增加的語料庫。Gensim當然給出了這樣壹個解決方案,叫做如下:
【python】?觀平原?復制
def?update w2 model unit(self,?型號,?corpusSingleFilePath):?
'''''?
(只?可以嗎?是嗎?答?單列)?
'''?
文件類型?=?localfileoptnunit . check filestate(corpusSingleFilePath)?
如果?文件類型?==?u“目錄”:
warnings.warn('can?不是嗎?成交?答?“目錄!”)?
回歸?模特?
如果?文件類型?==?u'opened ':?
trainedWordCount?=?model . train(line sentence(corpusSingleFilePath))?
打印('更新?型號,?更新?文字?num?是:?'?+?trainedWordCount)?
埃利夫?文件類型?==?u'file ':
corpusSingleFile?=?打開(corpusSingleFilePath,u'r ')?
trainedWordCount?=?model . train(line sentence(corpus single file))?
打印('更新?型號,?更新?文字?num?是:?'?+?trainedWordCount)?
否則:?
#?托多?補充?句子?列表?直接?(壹樣?作為?最後?功能)?
通過?
回歸?模特?
在簡單地檢查了文件類型之後,可以通過調用模型對象的train方法來更新模型。該方法傳入新語料庫的句子,並返回模型中新單詞的數量。執行完所有函數後,return後更新模型的源代碼有增強的方法,可以處理各種文件參數(同2),這裏就不介紹了。
4.各種基本查詢
當妳確定模型已經訓練好,不會再更新的時候,就可以鎖定模型了,而且據說預加載相似度矩陣可以提高後期的查詢速度,但是妳的模型從此只讀。
【python】?觀平原?復制
def?finishTrainModel(self,?modelFilePath=None):?
'''''?
警告:?之後?這個,?那個?模特?是嗎?只讀?(不能?是嗎?更新)?
'''?
如果?modelFilePath?==?無:?
modelFilePath?=?self.modelPath?
模特?=?self . loadmodelfromfile(modelFilePath)?
model.init_sims(replace=True)?
可以看到,所謂的鎖模型方法是init_sims,裏面的replace參數設置為True。
然後是word2vec模型的壹些查詢方法:
【python】?觀平原?復制
def?getWordVec(self,?型號,?wordStr):?
'''''?
得到?那個?有消息嗎?向量?作為?數組列表?類型?從哪裏?w2v?模特?
'''?
回歸?model[wordStr]?
【python】?觀平原?復制
def?querymostmisailarwodvec(self,?型號,?wordStr,?topN=20):?
'''''?
MSimilar?文字?基礎?查詢?功能?
回歸?2-dim?列表?[0]?是嗎?詞?[1]?是嗎?雙概率?
'''?
similarPairList?=?model . most _ similar(wordstr . decode(' utf-8 '),?topn=topN)?
回歸?similarPairList?
【python】?觀平原?復制
def?culSimBtwWordVecs(self,?型號,?wordStr1,?wordStr2):?
'''''?
兩個?文字?相似?基礎?查詢?功能?
回歸?雙概率?
'''?
相似的價值?=?model . similarity(wordstr 1 . decode(' utf-8 '),?wordStr2.decode('utf-8 ')?
回歸?相似的價值?
以上方法很簡單,基本壹行解決。在源代碼中,每個函數下面的函數仍然匹配相應的模型文件處理版本。其中,getWordVec是獲取查詢詞的word2vec詞向量本身,打印出來的詞是數組;純數字的;QueryMostSimilarWordVec是獲取與查詢詞相關度最高的n個詞及其對應的相似度,返回的是壹個二維列表(評論裏寫的很清楚);CulSimBtwWordVecs是獲取兩個給定單詞的相似度值,直接返回double值。
5.5的計算。Word2Vec單詞向量
學過w2v理論的童鞋壹定知道單詞向量是可以加減的。基於這個性質,gensim給出了相應的方法,調用如下:
【python】?觀平原?復制
def?querymysimilarvecswithposneg(self,型號,?posWordStrList,?negWordStrList,?topN=20):?
'''''?
陽性陰性?MSimilar?文字?基礎?查詢?功能?
回歸?2-dim?列表?[0]?是嗎?詞?[1]?是嗎?雙概率?
'''?
posWordList?=?[]?
negWordList?=?[]?
為了什麽?wordStr?在?posWordStrList:?
poswordlist . append(wordstr . decode(' utf-8 '))?
為了什麽?wordStr?在?negWordStrList:?
neg word list . append(wordstr . decode(' utf-8 '))?
pnSimilarPairList?=?model . most _ similar(positive = posWordList,?負數=negWordList,?topn=topN)?
回歸?pnSimilarPairList?
因為使用了py27,所以之前對傳入的單詞列表數據進行了編碼和過濾,其中posWordList可以認為是對結果產生正能量的單詞集,negWordList是對結果產生負能量的單詞集,同時發送給most_similar方法。當設置了返回答案的topN時,返回結果的形式與4中的queryMostSimilarWordVec函數相同。您可以從數學上理解這個操作:
以下操作是我自己創作的。假設我想用上面的單詞向量topN的形式來表示兩個單詞或兩組單詞之間的關聯。我這樣做:
【python】?觀平原?復制
def?copemsimilarvecsbtwordlists(self,?型號,?wordStrList1,?wordStrList2,?topN_rev=20,?topN=20):?
'''''?
範圍?詞?vec?res?為了什麽?兩個?單詞表?從哪裏?來源?去哪?目標?
使用?wordVector?去哪?快遞?那個?關系?之間?src-單詞表?然後呢。標簽單詞表?
第壹,?使用?那個?標簽單詞表?作為?負面詞匯列表?去哪?得到?那個?rev-單詞表,?
然後呢?使用?那個?SCR-單詞表?然後呢。那個?rev-單詞表?作為?那個?新的?src-tag-wordList?
topN_rev?是嗎?topN?的?rev-單詞表?然後呢。topN?是嗎?那個?決賽?topN?的?關系?vec?
'''?
srcWordList?=?[]?
tagWordList?=?[]?
srcwordlist . extend(wordstr . decode(' utf-8 ')?為了什麽?wordStr?在?wordStrList1)?
tagwordlist . extend(wordstr . decode(' utf-8 ')?為了什麽?wordStr?在?wordStrList2)?
revSimilarPairList?=?self . querysimilarvecswithposneg(型號,?[],?tagWordList?topN_rev)?
revWordList?=?[]?
revWordList.extend(pair[0])。解碼(' utf-8 ')?為了什麽?配對?在?revSimilarPairList)?
stSimilarPairList?=?self . querysimilarvecswithposneg(型號,?srcWordList,?revWordList,?topN)?
回歸?stSimilarPairList?
這個操作的思路是,首先將兩組單詞中的壹組作為negWordList,傳入上面的querymisimilarvecswithPosneg函數,得到壹組topN的及物單詞。用這些及物詞和原來的另壹組詞進行querymisimilarvecswithPosneg運算後,很容易理解第壹步是得到壹組詞作為negWordList的逆向結果,然後通過這個逆向結果和另壹組詞,可以得到壹個否定結果。這樣,兩組單詞之間的關系就可以用壹組topN的“單詞相關性”配對表來表示。