1. 程式人生 > >關於gensim中doc2vec的使用參考

關於gensim中doc2vec的使用參考

工具:anaconda2

TaggedDocumnet 和TaggedLineDocument

前者的輸入有兩個引數:一行分詞後的文字,標籤;
後者的輸入:分詞之後的文字檔案,每個文字佔一行.

庫版本的差異

python的gensim有2.3.0和3.4.0兩個版本,載入模型推測文字向量時所用的gensim版本一定要和訓模型時使用的版本一樣。

推測文字向量時的注意事項

我想計算兩個本文的語義相似,一開始我用如下方式推測文字向量,然後計算兩個向量的餘弦值:

model = Doc2Vec.load("model.model",mmap='r')
#推測文字的向量
Vector1 = model.infer_vector(text1,steps=6,alpha=0.025) Vector2 = model.infer_vector(text2,steps=6,alpha=0.025)

後來我發現模型load一次,用這個模型對同一段文字推測兩次,兩次結果是不一樣的,即下面的v1和v2是不一樣的:

model = Doc2Vec.load("model.model",mmap='r')
#推測文字的向量
v1 = model.infer_vector(text1,steps=6,alpha=0.025)
v2 = model.infer_vector(text1,steps=6
,alpha=0.025)

關於gensim的doc2vec該如何推測非訓練語料庫裡文字的向量(訓練語料庫裡的文字直接用函式model.docvecs[]便可求得),查了一些資料,雖然還是含糊不清,大概有以下3種方法:

  • model.random.seed()[1][2]
    即模型載入後,每次推測之前都要設定model.random.seed()引數,但具體怎麼設定並沒有查到詳細資料,舉例如下:
model = Doc2Vec.load("model.model",mmap='r')
model.random.seed(0)
v1 = model.infer_vector(text1,steps=6
,alpha=0.025) model.random.seed(0) v2 = model.infer_vector(text1,steps=6,alpha=0.025)
  • 每次推測之前都要載入一次模型,這種方式太耗時,不適合頻繁使用,舉例如下:[2]
model = Doc2Vec.load("model.model",mmap='r')
v1 = model.infer_vector(text1,steps=6,alpha=0.025)
model = Doc2Vec.load("model.model",mmap='r'
v2 = model.infer_vector(text1,steps=6,alpha=0.025)
  • steps引數設定大一點[2],只是有人這麼說,我沒有試過。

資料量大時,預處理的指令碼要寫成分散式的形式

資料量大時,寫“資料預處理“指令碼一定要寫成分散式的,一定要寫成分散式的,一定要寫成分散式的!!!(300M資料量,分詞和去停用詞,普通機器,我至少跑了一天一夜,具體時間我記不得了)

預處理時要給資料去重和去噪

模型載入速度慢

“文字相似度計算“這是一個需要實時跑的需求,也就是說我需要根據web頁面點選實時載入模型,推測向量,計算餘弦值。但載入模型(模型1.28g)就花了4s,太慢,這個問題後來解決了。

計算文字相似性的思考

可以用兩段文字重合詞百分比來衡量兩段文字是否在說同一件事,如是否都在說武俠,是否都在說天氣,但更細一層的語義便沒法衡量了。

模型評估的思考

有老師說相似度值的大小並不能確切地說明模型的好與不好,所以設計了衡量標準:不同模型,根據文字的topN是否穩定來決定調參的方向。
於此同時,儘管有老師說“不能看相似度的數值”來判斷模型好和不好,我還是認為數值具有借鑑意義。模型最終確定時,用完全一樣的兩個文字的相似度來衡量“模型闡述文字相似的能力”。如300組完全一樣的文字,通過檢視“相似度值聚集的範圍”,來衡量“模型闡述文字相似的能力”。

參考資料