LSI(Latent semantic indexing, 潛語義索引)和LSA(Latent semantic analysis,潛語義分析)這兩個名字實際上是一回事。咱們這裏稱爲LSA。 app
LSA源自問題:如何從搜索query中找到相關的文檔?當咱們試圖經過比較詞來找到相關的文本時,就很機械、存在必定的侷限性。在搜索中,文檔的類似性並不該該由兩個文本包含的詞直接決定,而是應該去比較隱藏在詞以後的意義和概念。但傳統向量空間模型使用精確的詞匹配,即精確匹配用戶輸入的詞與向量空間中存在的詞。好比用戶搜索「automobile」,即汽車,傳統向量空間模型僅僅會返回包含「automobile」單詞的頁面,而實際上包含」car」單詞的頁面也多是用戶所須要的。潛語義分析試圖去解決這個問題,它把詞和文檔都映射到一個潛在語義空間,文檔的類似性在這個空間內進行比較。潛語義空間的維度個數能夠本身指定,每每比傳統向量空間維度更少,因此LSA也是一種降維技術。 spa
LSA的整個過程以下: .net
1. 將文檔集構形成Term-Document矩陣M,矩陣中的每一個位置的值能夠是該行表明個詞在該列表明的文檔中的詞頻、TFIDF值或其餘。 code
2. 對Term-Document矩陣進行SVD奇異值分解,此時M = U * S * VT。SVD奇異值分解的詳細過程能夠查看此文。 索引
3. 對SVD分解後的矩陣進行降維,只保留矩陣S前K個最大的奇異值獲得S’。相應的U、V分別爲U’、V’。 V’中的每行即爲每一個文檔在潛在語義空間上的K維表示。 token
4. 使用降維後的矩陣重建Term-Document矩陣M’ = U’ * S’ * V’T。 文檔
5. 對於一個列向量表示的新文檔Q,其在潛在語義空間上的K維表示爲Q’ = QT*U’*S’-1。 get
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’)。 it
(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三個類別。