2017-08-30 33 views
0

我使用gensimwmdistance來計算參考句子和其他1000個句子之間的相似度。針對速度(wmdistance)優化Gensim字移動器的距離函數

model = gensim.models.KeyedVectors.load_word2vec_format(
    'GoogleNews-vectors-negative300.bin', binary=True) 
    model.init_sims(replace=True) 

    reference_sentence = "it is a reference sentence" 
    other_sentences = [1000 sentences] 
    index = 0 
    for sentence in other_sentences: 
     distance [index] = model.wmdistance(refrence_sentence, other_sentences) 
     index = index + 1 

gensimsource codemodel.wmdistance返回如下:

emd(d1, d2, distance_matrix) 

其中

d1 = # Compute nBOW representation of reference_setence. 
d2 = # Compute nBOW representation of other_sentence (one by one). 
distance_matrix = see the source code as its a bit too much to paste it here. 

此代碼是在兩個方面對我的使用情況下,效率不高。

1)對於參考語句,重複計算距離函數emd(d1, d2, distance_matrix)的d1(1000次)。

2)這個距離函數被來自不同點的多個用戶調用,它重複這個model.wmdistance(doc1, doc2)的整個過程,用於相同的other_sentences並且它在計算上是昂貴的。對於這1000個比較,大約需要7-8秒。

因此,我想分離兩個任務。距離的最終計算:emd(d1, d2, distance_matrix)並準備這些輸入:d1,d2和距離矩陣。由於距離矩陣取決於兩者,因此至少應將其輸入準備與最終矩陣計算分開。

我最初的計劃是創建三個自定義功能:

d1 = prepared1(reference_sentence) 
d2 = prepared2(other_sentence) 
distance_matrix inputs = prepare inputs 

是否有可能與此gensim功能來做到這一點,或者我應該只是走自己的定製版?任何想法和解決方案以更好的方式處理這個問題?

回答

1

爲了避免重複操作,特別是在一個參考/查詢文檔針對大量文檔進行評估的常見情況下,您有必要觀察此代碼可能被重構爲&。 (任何這樣的改進也將是對gensim的一個值得歡迎的貢獻。)

簡單地在計算之外準備單個文檔可能不會節省很多;在每種情況下,兩個文檔之間的所有字與詞之間的距離大大地被計算出來。預先計算一個較大的distance_matrix(在相關詞彙表&系統存儲器允許的範圍內)可能是有意義的,其中包括許多成對WMD計算所需的所有單詞。 (如同可能預先計算所有字與詞之間的距離一樣,詞彙量爲300萬字(如GoogleNews矢量集),以及僅爲4字節的浮點距離,但將它們全部存儲起來至少需要至少兩秒鐘的時間18TB。因此,計算相關字的距離,對於可管理批次的文檔,可能更有意義。)

可能的啓動方法是創建一個wmdistance()的變體,該變體明確地在一個文檔上對一組文檔進行操作,文件,並且因此可以一次爲許多比較組合創建直方圖/距離矩陣。對於不需要的常見情況全部 WMD值,但只是想要前N個最近的結果,在原始WMD文件中描述了一個優化,其中可以使用另一個更快的計算(稱爲'RWMD')推斷何時沒有機會將文檔納入前N項結果,從而完全針對這些文檔跳過完整的WMD計算。

+0

然後讓我探索RWMD的選項。不是WmdSimilarity(wmd_corpus,model,num_best = 10)與RWMD相同嗎? – utengr

+0

您必須檢查紙張的RWMD定義。儘管開始了一些工作,但我不相信gensim代碼還在執行該優化。要找到最接近的10個項目,它會計算* all *項目的WMD,沒有快捷方式/優化,然後排序以僅返回10個最小距離。 – gojomo

+0

啊,好吧。我將以單獨函數中的單個文檔計算單詞向量和nbow向量的方式進行修改。它可以爲我節省很多時間,因爲我將數千個項目與單個參考進行比較。如果您希望將它作爲gensim中的wmdistance變體,我可以將其作爲功能請求開始。 – utengr