原文連接: http://www.cnblogs.com/jacklu/p/8379726.htmlhtml
博士一年級選了這門課 SEEM 5680 Text Mining Models and Applications,記下來以便之後查閱。算法
用0和1表示某個詞是否出如今文檔中。以下圖例子,要回答「Brutus AND Caesar but NOT Calpurnia」,咱們須要對詞的向量作布爾運算,即110100 AND 110111 AND 101111=100100 對應的文檔是Antony and Cleopatra和Hamletspa
然而這種方法隨着數據的增大是很是耗費空間的。好比咱們有100萬個文檔,每一個文檔平均有1000字,總共有50萬個不一樣的詞語,那麼矩陣將是500 000 x 1 000 000。這個矩陣是稀疏的,1的個數通常不會超過1億個。3d
倒排索引是爲了解決上述布爾模型的問題。具體來講,每一個詞用鏈表順序存儲文檔編號。以下圖所示:指針
創建索引的核心是將詞按字母順序排列,合併重複詞,可是要記錄詞頻。code
一、求Brutus AND Calpurnia,即求兩個鏈表的交集。htm
算法思路是若是文檔號不一樣就移動較小的指針,僞代碼 INTERSECTION(p1, p2):blog
answer<-() while p1 != NIL and p2 != NIL do if docID(p1) = docID(p2) then ADD(answer, docID(p1)) p1 <-next(p1) p2 <-next(p2) else if docID(p1) < docID(p2) p1 <-next(p1) else p2<-next(p2) return answer
思考題,有兩個詞項A,B,其文檔編號鏈表長度分別爲3和5,那麼對A,B求交集,最少的訪問次數和最多的訪問次數分別是多少?各舉一個例子索引
最少訪問次數是4,好比A:1-2-3,B:3-4-5-6-7;最多訪問次數是8,好比A:1-7-8, B:3-4-5-7-9文檔
二、思考題:求Brutus OR Calpurnia,即求兩個鏈表的並集。僞代碼 UNION(p1,p2):
answer<-() while p1 != NIL and p2 != NIL do if docID(p1) = docID(p2) then ADD(answer, docID(p1)) p1 <-next(p1) p2 <-next(p2) else if docID(p1) < docID(p2) then ADD(answer, docID(p1)) p1<-next(p1) else ADD(answer, docID(p2)) p2<-next(p2) return answer
三、思考題:求Brutus AND NOT Calpurnia。僞代碼 INTERSECTION(p1,p2, AND NOT):
answer<-() while p1 != NIL and p2 != NIL do if docID(p1) = docID(p2) p1 <-next(p1) p2 <-next(p2) else if docID(p1) < docID(p2) then ADD(answer, docID(p1)) p1<-next(p1) else p2<-next(p2) if p1 != NIL and P2 = NIL then ADD(answer, docID(p1)) p1<-next(p1) return answer
參考資料:http://www1.se.cuhk.edu.hk/~seem5680/