LSI(Latent semantic indexing, 潛語義索引)和LSA(Latent semantic analysis,潛語義分析)這兩個名字其實是一回事。我們這里稱為LSA。
LSA源自問題:如何從搜索query中找到相關的文檔?當我們試圖通過比較詞來找到相關的文本時,就很機械、存在一定的局限性。在搜索中,文檔的相似性並不應該由兩個文本包含的詞直接決定,而是應該去比較隱藏在詞之后的意義和概念。但傳統向量空間模型使用精確的詞匹配,即精確匹配用戶輸入的詞與向量空間中存在的詞。比如用戶搜索“automobile”,即汽車,傳統向量空間模型僅僅會返回包含“automobile”單詞的頁面,而實際上包含”car”單詞的頁面也可能是用戶所需要的。潛語義分析試圖去解決這個問題,它把詞和文檔都映射到一個潛在語義空間,文檔的相似性在這個空間內進行比較。潛語義空間的維度個數可以自己指定,往往比傳統向量空間維度更少,所以LSA也是一種降維技術。
LSA的整個過程如下:
1. 將文檔集構造成Term-Document矩陣M,矩陣中的每個位置的值可以是該行代表個詞在該列代表的文檔中的詞頻、TFIDF值或其他。
2. 對Term-Document矩陣進行SVD奇異值分解,此時M = U * S * VT。SVD奇異值分解的詳細過程可以查看此文。
3. 對SVD分解后的矩陣進行降維,只保留矩陣S前K個最大的奇異值得到S’。相應的U、V分別為U’、V’。 V’中的每行即為每個文檔在潛在語義空間上的K維表示。
4. 使用降維后的矩陣重建Term-Document矩陣M’ = U’ * S’ * V’T。
5. 對於一個列向量表示的新文檔Q,其在潛在語義空間上的K維表示為Q’ = QT*U’*S’-1。
6. 將新文檔Q於文檔集中的每個文檔在潛在語義空間進行相似度計算,得到與Q最相似的文檔。
下面是一個具體的例子,例子中能展現LSA的效果:M中human-C2值為0,因為文檔C2中並不包含詞human,但是重建后的M’中human-C2為0.40,表明human和C2有一定的關系,為什么呢?因為C2中包含user單詞,和human是近似詞,因此human-C2的值被提高了。(U、S、V中陰影部分別降維后的U’、S’、V’)。
(1)從分類語料中選取了Computer、Agriculture、Sports三個類別的文章,每個類別各取50篇左右。對每篇文章進行切詞,停用詞過濾后得到這里需要的的實驗文檔集。
(2) 使用Gensim對實驗文檔集進行LSA
1: from gensim import corpora, models, similarities
2:
3: textset = 'C:\\Users\\Administrator\\Desktop\\LSA\\textset.txt'
4: texts = [line.lower().split() for line in open(textset)]
5:
6: # Map word to wordid, delete word occur only once
7: dictionary = corpora.Dictionary(texts)
8: once_ids = [tokenid for tokenid, docfreq in dictionary.dfs.iteritems() if docfreq == 1]
9: dictionary.filter_tokens(once_ids)
10: dictionary.compactify()
11:
12: corpus = [dictionary.doc2bow(text) for text in texts]
13:
14: # Use TF-IDF
15: tfidf = models.TfidfModel(corpus)
16: corpus_tfidf = tfidf[corpus]
17:
18: # Use LSI
19: lsi = models.LsiModel(corpus_tfidf, id2word=dictionary, num_topics=3)
20: corpus_lsi = lsi[corpus_tfidf]
21:
22: for doc in corpus_lsi:
23: print doc
(3) 畫出每個文檔在3維的潛語義空間上的對應坐標點,得到下圖。可以看到整個文檔集內的文檔,朝3個方向分布,分別對應Computer、Agriculture、Sports三個類別。
轉自本人博客:http://www.datalab.sinaapp.com/



