怎樣計算兩篇文檔的相似度?
剛剛接觸這方面,還沒入門,整天自己埋頭看論文,效率太低,有沒有好心人給我一些啟發,非常感謝!
接觸到mikolov的兩篇大作:Distributed Representations of Sentences and Documents和Distributed Representations of Words and Phrases and their Compositionality。但是不知道怎樣應用到我的需求中來。我的需求是有一個語料庫(以文檔為單位),我希望新輸入一篇文檔,檢測語料庫里是否有相似或重複的文檔(指描述同一個issue)ps:我是用來寫小論文的,但是導師沒給我指導,只好自己埋頭,希望有這方面經驗的好人給我點啟發,拜謝
Washington U 有一篇Paper——《From Word Embeddings To Document Distances》應該可以在一定程度上滿足題主的要求,傳送門如下:
http://jmlr.org/proceedings/papers/v37/kusnerb15.pdf主要是將計算機影像領域的EMD(earth mover"s distance)演算法的思想,結合word2vec模型,移植到NLP領域,提出了一個文本距離的衡量概念:WMD(word mover"s distance)
通過word2vec模型,可以計算出所有詞語的n維詞向量(用於評價詞與詞之間的相似度),再用詞袋模型(Bag Of Words)得到詞語在文章中的詞頻(看作一個詞語在文章中的權重),那麼問題就轉化成為了如何在最小代價的情況下,將文章A的所有詞單元「搬運」到文章B對應詞單元中,因此變成了一個transportation optimization的問題。
其中,搬運的代價(loss)用「搬運」前後,文章AB分別對應的詞單元的相似度來衡量。例如,相同單位大小的情況下,將文章A中的詞語「President」,搬運到文章B中的詞語「Obama」的loss distance,會比「President」搬運到B中的「Banana」要小(用上面Word2vec得到的詞向量計算詞與詞之間的距離,至於用的是歐氏距離還是餘弦相似度有點忘了)
根據以上思想,用EMD演算法就可以算出兩篇文檔之間的距離。
不過根據自己的實驗,感覺這篇Paper的方法可能在短文本的處理上會比較好,如果文檔篇幅一旦變長了,可能效果就會打折扣了。
答主剛接觸NLP不久,可能理解還比較淺,所以建議題主還是親自去讀一下Paper體會一下,如果有什麼說錯的地方還請指教。
至於如何用Word2vec簡便地計算詞向量,推薦Python下的Gensim包
gensim: Tutorials如果你真想解決這個問題,TFIDF可以90%的解決問題。對於一些的應用,可能同義詞之類的比較重要,這樣的話MF/LSA/LDA等降維的方法可以提升到95%。另外一些情況下,引入一些跟問題相關的專用的feature或者轉化一下你要Factorization的Matrix中的值,可能要比上複雜的Model更有效一些。
Word2vec不是用來表示doc的,最naive的做法是做word vector的平均,但是效果肯定不如上面提到的。詞袋模型+TFIDF,LDA模型,ESA模型,LSA模型,key word list +TFIDF等。菜鳥的觀點,勿噴
Mikolov 14年又發了一篇,滿足 【word2vec計算兩篇文檔的相似度這個需求】。http://arxiv.org/abs/1405.4053微博上有人實踐過,據說實用性一般。不知道你所說的需求,準確率什麼要求。要是準確率要求不用太高的話,伯努利樸素貝葉斯應該就可以滿足了。
LDA
Diff, Match and Patch
Neil Fraser 大神對Google相似度的介紹和demo
不知道題主還需要嗎?哈哈,可以參考一下清華大學guoliang li的paper
用短語而不是用單詞。Suffix Tree Clustering + Phrase 效果甚好。http://homes.cs.washington.edu/~etzioni/papers/sigir98.pdf
gensim doc2vec
推薦閱讀: