現有doc-word矩陣,採用余弦計算兩兩文件之間的相似度。在實際問題中,矩陣通常是很稀疏的,為了減少計算量,通常採用倒排索引的資料結構[1], 將包含相同word的doc對映到同乙個節點上, 這樣只需計算相似度不為0的文件之間的相似度, 從而減少計算量,具體過程如圖1所示。
上述方法雖然避免了計算相似度為0的文件之間的相似度,但是當有些word對應的文件數很大時,就會出現嚴重的資料傾斜問題。如果如圖2所示中word 「b」 對應文件數有8個, 在該節點下需計算8*(8-1)/2=28個文件對之間的相似度。
圖2 建立倒排索引
當某個word對應的文件個數很多時,一種解決思路是採用矩陣分塊的思想,將其打散到多個節點,分別進行處理[2]。令m表示乙個節點上最多可以處理的文件對個數,blocksize表示乙個塊中有多少個文件,blocknum表示分多少塊,docnumi表示wordi對應的文件個數,則有:
令doc_vec表示包含word的文件-權重向量,di表示向量第i個元素。bi表示di劃分到塊的序號, 計算公式為:
然後依次遍歷分塊,對每個di重新構造blocknum個(newkey,newvalue)對,其中
具體過程參見圖2. 這樣每個節點保證不會超過m個文件對需要處理,提公升了運算效率。然後在reduce階段對相同文件對之間的相似度相加,最終得到相似度不為0的兩兩文件之間的相似度。
圖3 分塊索引
圖4 reduce階段計算文件之間的相似度
參考文獻
1. tamer elsayed, jimmy lin, douglas w. oard. pairwise document similarityin large collections with mapreduce. proceedings of acl-08:hlt, pp265-268.
2.
基於Map Reduce的相似度計算
基於map reduce的相似度計算 不久前 6.29 參加了chinahadoop的夏季沙龍,聽了人人的大牛講了基於map reduce的相似度計算的優化,感覺對map reduce程式設計模型的理解又進一步加深了,在這裡把該演算法總結成博文,以期能夠更加透徹的理解該演算法。相似度的計算在文字的分...
NLP計算文件相似度之LSH
coding utf 8 使用lsh來處理 字首樹 from sklearn.feature extraction.text import tfidfvectorizer import jieba.posseg as pseg from sklearn.neighbors import lshfor...
向量空間模型文件相似度計算實現(C )
讀者可以根據自己的需要進行加殼或改寫,本文權當拋磚引玉。筆者加的殼在 vsm模型介紹 using system using system.collections.generic using system.linq using system.text using system.text.regular...