關於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組完全一樣的文字,通過檢視“相似度值聚集的範圍”,來衡量“模型闡述文字相似的能力”。