1. 程式人生 > >主題模型TopicModel:LSA(隱性語義分析)模型和其實現的早期方法SVD

主題模型TopicModel:LSA(隱性語義分析)模型和其實現的早期方法SVD

傳統方法向量空間模型(VSM)的缺點

傳統向量空間模型使用精確的詞匹配,即精確匹配使用者輸入的詞與向量空間中存在的詞。由於一詞多義(polysemy)和一義多詞(synonymy)的存在,使得該模型無法提供給使用者語義層面的檢索。比如使用者搜尋”automobile”,即汽車,傳統向量空間模型僅僅會返回包含”automobile”單詞的頁面,而實際上包含”car”單詞的頁面也可能是使用者所需要的。

下面是LDA原始Paper[Deerwester, S., Dumais, S. T., Furnas, G. W., Landauer, T. K., & Harshman, R.(1990). Indexing By Latent Semantic Analysis. Journal of the American Society For Information Science, 41, 391-407. 10

]裡舉的一個例子:


上圖是一個Term-Document矩陣,X代表該單詞出現在對應的檔案裡,星號表示該詞出現在查詢(Query)中,當用戶輸入查詢”IDF in computer-based information look up” 時,使用者是希望查詢與資訊檢索中IDF(文件頻率)相關的網頁,按照精確詞匹配的話,文件2和3分別包含查詢中的兩個詞,因此應該被返回,而文件1不包含任何查詢中的詞,因此不會被返回。但我們仔細看看會發現,文件1中的access, retrieval, indexing, database這些詞都是和查詢相似度十分高的,其中retrieval和look up是同義詞。顯然,從使用者的角度看,文件1應該是相關文件,應該被返回。再來看文件2:computer information theory,雖然包含查詢中的一次詞information,但文件2和IDF或資訊檢索無關,不是使用者需要的文件,不應該被返回。從以上分析可以看出,在本次檢索中,和查詢相關的文件1並未返回給使用者,而無查詢無關的文件2卻返回給了使用者。這就是同義詞和多義詞如何導致傳統向量空間模型檢索精確度的下降。


LSA and SVD

        LSA(latent semantic analysis)潛在語義分析,也被稱為LSI(latent semantic index),是Scott Deerwester, Susan T. Dumais等人在1990年提出來的一種新的索引和檢索方法。該方法和傳統向量空間模型(vector space model)一樣使用向量來表示詞(terms)和文件(documents),並通過向量間的關係(如夾角)來判斷詞及文件間的關係;而不同的是,LSA將詞和文件對映到潛在語義空間,從而去除了原始向量空間中的一些“噪音”,提高了資訊檢索的精確度。LSA的基本思想就是把高維的文件降到低維空間,那個空間被稱為潛在語義空間。這個對映必須是嚴格線性的而且是基於共現表(就是那個矩陣啦)的奇異值分解。

        LSA(隱性語義分析)的目的是要從文字中發現隱含的語義維度-即“Topic”或者“Concept”。LSA的目標就是要尋找到能夠很好解決實體間詞法和語義關係的資料對映。我們知道,在文件的空間向量模型(VSM)中,文件被表示成由特徵詞出現概率組成的多維向量,這種方法的好處是可以將query和文件轉化成同一空間下的向量計算相似度,可以對不同詞項賦予不同的權重,在文字檢索、分類、聚類問題中都得到了廣泛應用,在基於貝葉斯演算法及KNN演算法的newsgroup18828文字分類器的JAVA實現基於Kmeans演算法、MBSAS演算法及DBSCAN演算法的newsgroup18828文字聚類器的JAVA實現系列文章中的分類聚類演算法大多都是採用向量空間模型。然而,向量空間模型沒有能力處理一詞多義和一義多詞問題,例如同義詞也分別被表示成獨立的一維,計算向量的餘弦相似度時會低估使用者期望的相似度;而某個詞項有多個詞義時,始終對應同一維度,因此計算的結果會高估使用者期望的相似度。

        原理:LSA潛在語義分析的目的,就是要找出詞(terms)在文件和查詢中真正的含義,也就是潛在語義,從而解決上節所描述的問題。具體說來就是對一個大型的文件集合使用一個合理的維度建模,並將詞和文件都表示到該空間,比如有2000個文件,包含7000個索引詞,LSA使用一個維度為100的向量空間將文件和詞表示到該空間,進而在該空間進行資訊檢索。而將文件表示到此空間的過程就是SVD奇異值分解和降維的過程。降維是LSA分析中最重要的一步,通過降維,去除了文件中的“噪音”,也就是無關資訊(比如詞的誤用或不相關的詞偶爾出現在一起),語義結構逐漸呈現。相比傳統向量空間,潛在語義空間的維度更小,語義關係更明確。

LSA方法的引入就可以減輕類似的問題。基於SVD分解,我們可以構造一個原始向量矩陣的一個低秩逼近矩陣,具體的做法是將詞項文件矩陣做SVD分解


  其中以詞項(terms)為行, 文件(documents)為列做一個大矩陣. 設一共有t行d列,  矩陣的元素為詞項的tf-idf值。然後的r個對角元素的前k個保留(最大的k個保留), 後面最小的r-k個奇異值置0, 得到;最後計算一個近似的分解矩陣


在最小二乘意義下是的最佳逼近。由於最多包含k個非零元素,所以的秩不超過k。通過在SVD分解近似,我們將原始的向量轉化成一個低維隱含語義空間中,起到了特徵降維的作用。每個奇異值對應的是每個“語義”維度的權重,將不太重要的權重置為0,只保留最重要的維度資訊,去掉一些資訊“nosie”,因而可以得到文件的一種更優表示形式。

LSA的步驟:

1. 分析文件集合,建立Term-Document矩陣。

2. 對Term-Document矩陣進行奇異值分解。

3. 對SVD分解後的矩陣進行降維,也就是奇異值分解一節所提到的低階近似。

4. 使用降維後的矩陣構建潛在語義空間,或重建Term-Document矩陣。

{這時,一個項(term)其實就是K維向量空間的的一個向量。把意義相同的項(term)做同一對映。到這裡就很清楚的看出來,LSA沒有建立統計學基礎}

一個例子:Introduction to Latent Semantic Analysis

假設文件集合如下:

Technical Memo Example
Titles:
c1: Human machine interface for Lab ABC computer applications
c2: A survey of user opinion of computer system response time
c3: The EPS user interface management system
c4: System and human system engineering testing of EPS
c5: Relation of user-perceived response time to error measurement
m1: The generation of random, binary, unordered trees
m2: The intersection graph of paths in trees
m3: Graph minors IV: Widths of trees and well-quasi-ordering
m4: Graph minors: A survey

原始的Term-Document矩陣如下:

Terms Documents
c1 c2 c3 c4 c5 m1 m2 m3 m4
__ __ __ __ __ __ __ __ __
human 1 0 0 1 0 0 0 0 0
interface 1 0 1 0 0 0 0 0 0
computer 1 1 0 0 0 0 0 0 0
user 0 1 1 0 1 0 0 0 0
system 0 1 1 2 0 0 0 0 0
response 0 1 0 0 1 0 0 0 0
time 0 1 0 0 1 0 0 0 0
EPS 0 0 1 1 0 0 0 0 0
survey 0 1 0 0 0 0 0 0 1
trees 0 0 0 0 0 1 1 1 0
graph 0 0 0 0 0 0 1 1 1
minors 0 0 0 0 0 0 0 1 1


對其進行奇異值分解:


然後對分解後的矩陣降維,這裡保留{S}的最大兩個奇異值,相應的{W}{P}矩陣如圖,注意{P}在公式中需要轉置。(只有陰影部分需要保留,減少儲存容量)

到了這一步後,我們有兩種處理方法,論文Introduction to Latent Semantic Analysis是將降維後的三個矩陣再乘起來,重新構建了{X}矩陣如下:


觀察{X}矩陣和{X^}矩陣可以發現:

LSA的效果顯示{X}中human-C2值為0,因為C2中並不包含human單詞,但是{X^}中human-C2為0.40,表明human和C2有一定的關係,為什麼呢?因為C2:”A survey of user opinion of computer system response time”中包含user單詞,和human是近似詞,因此human-C2的值被提高了。同理還可以分析其他在{X^}中數值改變了的詞。以上分析方法清晰的把LSA的效果顯示出來了,也就是在{X^}中呈現出了潛在語義,然後希望能建立潛在語義空間,並在該空間中檢索資訊。

文件和單詞在潛在語義空間的座標這裡以比較兩個單詞為例:設奇異值分解形式為:X = T S DT,T代表term,s代表single value矩陣,D代表Document,DT表示D的轉置。X的兩個行向量點乘的值代表了兩個詞在文件中共同出現的程度。

比如T1在D1中出現10詞,T2在D1中出現5次,T3在D1中出現0詞,那麼只考慮在D1維度上的值,T1(dot)T2=50,T1(dot)T2=0,顯然T1與T2更相似,T1與T3就不那麼相似。那麼用矩陣X(dot)XT就可以求出所有詞與詞的相似程度。而由奇異值分解的公式的:        X(dot)XT = T(dot)S2(dot)TT = TS(dot)(TS)T        上面公式表明了,我們想求X(dot)XT的(i,j)個元素時,可以點乘TS矩陣的第i和j列來表示。因此我們可以TS矩陣的行看作是term的座標這個座標就是潛在語義空間的座標。

同理我們還可以推出XT(dot)X = D(dot)S2(dot)DT,從而DS的行表示了文件的座標這時我們就可以通過向量間的夾角來判斷兩個物件的相似程度,方法和傳統向量空間模型相同。

三個矩陣的物理含義:    A is doc-term(row-col) matrix:

第一個矩陣X中的每一列表示一類主題,其中的每個非零元素表示一個主題與一篇文章的相關性,數值越大越相關。中間的矩陣表示文章主題keyword之間的相關性。最後一個矩陣Y中的每一列表示100個關鍵詞,每個key word與500,000個詞的相關性。因此,我們只要對關聯矩陣A進行一次奇異值分解,w 我們就可以同時完成了近義詞分類和文章的分類。(同時得到每類文章和每類詞的相關性)。{PS:100是A的SVD分解中的奇異值部分,也就是說有100個奇異值,物理解釋為latent項數}

image      這就是一個矩陣,不過不太一樣的是,這裡的一行表示一個詞在哪些title中出現了(一行就是之前說的一維feature),一列表示一個title中有哪些詞,(這個矩陣其實是我們之前說的那種一行是一個sample的形式的一種轉置,這個會使得我們的左右奇異向量的意義產生變化,但是不會影響我們計算的過程)。比如說T1這個title中就有guide、investing、market、stock四個詞,各出現了一次,我們將這個矩陣進行SVD,得到下面的矩陣:

image      左奇異向量表示詞的一些特性,右奇異向量表示文件的一些特性,中間的奇異值矩陣表示左奇異向量的一行與右奇異向量的一列的重要程式,數字越大越重要。

      繼續看這個矩陣還可以發現一些有意思的東西,首先,左奇異向量的第一列表示每一個詞的出現頻繁程度,雖然不是線性的,但是可以認為是一個大概的描述,比如book是0.15對應文件中出現的2次,investing是0.74對應了文件中出現了9次,rich是0.36對應文件中出現了3次;

      其次,右奇異向量中一的第一行表示每一篇文件中的出現詞的個數的近似,比如說,T6是0.49,出現了5個詞,T2是0.22,出現了2個詞。

      然後我們反過頭來看,我們可以將左奇異向量和右奇異向量都取後2維(之前是3維的矩陣),投影到一個平面上,可以得到:

image     在圖上,每一個紅色的點,都表示一個詞,每一個藍色的點,都表示一篇文件,這樣我們可以對這些詞和文件進行聚類,比如說stock 和 market可以放在一類,因為他們老是出現在一起,real和estate可以放在一類,dads,guide這種詞就看起來有點孤立了,我們就不對他們進行合併了。按這樣聚類出現的效果,可以提取文件集合中的近義詞,這樣當用戶檢索文件的時候,是用語義級別(近義詞集合)去檢索了,而不是之前的詞的級別。這樣一減少我們的檢索、儲存量,因為這樣壓縮的文件集合和PCA是異曲同工的,二可以提高我們的使用者體驗,使用者輸入一個詞,我們可以在這個詞的近義詞的集合中去找,這是傳統的索引無法做到的。

【】

檢索文字的步驟

使用者輸入的檢索語句被稱為偽文字,因為它也是有多個詞彙構成,和文字相似。所以很自然的想法就是將該偽文字轉換為文件座標,然後通過比較該偽文件與每個文件的空間夾角,檢索出該偽文字的相關文件。

Xq表示偽文字的列向量,其中該列代表文件集合的索引詞,該列的值代表偽文字中該索引詞出現的次數。比如一個文件集合有索引詞{T1,T2,T3},偽文字為t1,t3,t2,t1,則Xq={2,1,1}。獲得Xq後,通過公式

Dq = XqT T S-1計算偽文件的文件座標。其中T和S分別代表奇異分解中得到的矩陣(X = T S DT).

Dq計算出來後,就可以迭代比較Dq和文件集合中所有文件,計算兩者個cosine夾角


關鍵字查詢
          可以將查詢的字串看著一個document,後面稱為查詢文件,同樣可以將其轉換為了Term-Document矩陣,不過對此有兩種方案可以選擇。
          方案一:根據郵件樣本訓練出的Term-Document矩陣,將查詢文件對映成其中一列,然後利用奇異值分解的方程,計算得到其潛在因子的數值,再利用相似度演算法,找出前十個最相似的郵件。
          方案二:簡單處理得到查詢文件的Term-Document矩陣,然後根據查詢文件中Termu中找到對應的潛在因子,根據TermDocument的潛在因子的相似度進行加權,找到前十個最相似的郵件。

【Indexing by Latent Semantic Analysis - 4.2.4 Finding representations for pseudo-documents】

LSA的python實現:


LSA的C++實現:

1. 建立Term-Document矩陣

LSA是基於向量空間模型的,因此首先需要建立一個M x N的Term-Document矩陣,其中行表示每一個詞,列表示每一個文件。而矩陣的值等於相應詞的TF*IDF值。待檢索的文件集合放在程式根目錄下的corpus資料夾,每一個文件一個檔案。首先需要建立語料的單詞列表,作為T-D矩陣的列向量,每一個單詞對應一個id。

 迴圈讀入每個文件,在迴圈的過程中,識別每一個單詞,並判斷該單詞是否為stop word。

接下來需要處理單詞,由於英文單詞有字首和字尾,如單詞的單複數(book->books),過去時(like->liked),這些詞雖然形式不同但含義相同,因此要將它們處理為同一的形式,也就是單詞的原型。相關的演算法為Porter Stemming[6]演算法。

獲得單詞列表後,就可以構造T-D矩陣了,過程是依次讀入每個文件,遇到單詞列表中存在的詞,相應的矩陣單元加1。這裡用到了GSL的幾個函式,用法可參考GSL手冊。

T-D矩陣建立完成。

現在已經建立了T-D矩陣,但是矩陣單元值為單詞在文件中出現的頻率,因此下一步是求每個單詞的TF*IDF值[7]。TF代表單詞在某一文件中出現的頻率,IDF為inverse document frequency,代表的含義是如果一個單詞在很多文件中都出現了,那麼用它來區分文件的價值就降低。具體公式:


2. SVD分解

SVD分解使用GSL庫中的gsl_linalg_SV_decomp函式

3. 降維

降維在程式你實現十分簡單,也就是給矩陣(由於是對角矩陣,因此程式裡表示為向量)賦值零。

4. 查詢

SVD分解完成後,我們就已經獲得了潛在語義空間,接下來就可以接受使用者的輸入,將偽文字轉換到文件座標,然後通過比較向量的夾角,找出相關文件。


奇異值SVD分解說明圖例:

例如Data是32*32影象矩陣,經過SVD分解後

U\VT都是3 2*2 的矩陣,有兩個奇異值。因此總數字數目是64+64+2=130。

和原數目1024=32*32相比,我們獲得了幾乎10倍的壓縮比。


應用:

PS:
儘管基於SVD的LSA取得了一定的成功,但是其缺乏嚴謹的數理統計基礎,而且SVD分解非常耗時。

LSA對一詞多義問題依然沒有解決,僅僅解決了一義多詞。因為LSA將每一個詞表示為潛在語義空間中的一個點,因此一個詞的多個意義在空間中對於的是一個點,沒有被區分。

LSA通過對潛在語義空間的建模,提高的資訊檢索的精確度。

Hofmann在SIGIR’99上提出了基於概率統計的PLSA模型,並且用EM演算法學習模型引數。

SVD TUTORIAL:

SVD(Singular value decomposition奇異值分解),而SVD的作用不僅僅侷限於LSI,在很多地方都能見到其身影,SVD自誕生之後,其應用領域不斷被髮掘,可以不誇張的說如果學了線性代數而不明白SVD,基本上等於沒學。快速瞭解或複習SVD參考這個英文tutorail:Singular Value Decomposition Tutorial , 更推薦MIT教授Gilbert Strang的線性代數公開課和相關書籍,可以直接在網易公開課看相關章節的視訊。