LSA的工作原理: How Latent Semantic Analysis Works
LSA被廣泛用於文獻檢索,文本分類,垃圾郵件過濾,語言識別,模式檢索以及文章評估自動化等場景。
LSA其中一個目的是解決如通過搜索詞/關鍵詞(search words)定位出相關文章。如何通過對比單詞來定位文章是一個難點,因為我們正在要做的是對比單詞背后的語義。潛在語義分析的基本原理是將文章和單詞懂映射到語義空間( “concept” space )上,並在該空間進行對比分析。
當單詞-標題(或文章)矩陣創建完成,我們將使用強大的SVD算法進行矩陣分析。關於SVD的詳細介紹可以閱讀 “Singular Value Decomposition Tutorial”。
SVD的強大在於,其通過強調強的相關關系並過濾掉噪聲來實現矩陣降維(it finds a reduced dimensional representation of our matrix that emphasizes the strongest relationships and throws away the noise)。換句話說,SVD使用盡可能少的信息來對原矩陣進行盡可能好的重構(這里的好應該是指重構矩陣失真少,且噪聲少)。其實現手段是減低噪聲,同時增強強模式和趨勢(o do this, it throws out noise, which does not help, and emphasizes strong patterns and trends, which do help)。在LSA中使用SVD時為了確定單詞-標題(或文章)矩陣有效維度數或包含“語義”數。經過壓縮后,之后少量用於有用的維度或語義模式被留下,大量噪聲將被過濾掉。這些噪聲是由於作者的隨機選擇找出。
SVD算法的實現有點復雜,幸運的是python有現成的的函數完成該工作。通過加裝python的SVD函數,我們將矩陣分解成3個矩陣。矩陣UU提供了每個單詞在語義空間的坐標。而VTVT提供了每篇文章在語義空間的坐標。奇異值矩陣SS告訴我們有詞-標題(或文章)矩陣包含了多少語義或語義空間的有效維度是多少。
def calc(self): self.U, self.S, self.Vt = svd(self.A)
參考文檔1:https://www.cnblogs.com/kemaswill/archive/2013/04/17/3022100.html
參考文檔2:https://en.wikipedia.org/wiki/Latent_semantic_analysis
參考文檔3:https://blog.csdn.net/zhzhji440/article/details/47193731(重要)
1. 總而言之,在基於單詞的檢索方法中,同義詞會降低檢索算法的召回率(Recall),而多義詞的存在會降低檢索系統的准確率(Precision)。
2. Latent Semantic Analysis (Latent Semantic Indexing)
我們希望找到一種模型,能夠捕獲到單詞之間的相關性。如果兩個單詞之間有很強的相關性,那么當一個單詞出現時,往往意味着另一個單詞也應該出現(同義詞);反之,如果查詢語句或者文檔中的某個單詞和其他單詞的相關性都不大,那么這個詞很可能表示的是另外一個意思(比如在討論互聯網的文章中,Apple更可能指的是Apple公司,而不是水果) 。
LSA(LSI)使用SVD來對單詞-文檔矩陣進行分解。SVD可以看作是從單詞-文檔矩陣中發現不相關的索引變量(因子),將原來的數據映射到語義空間內。在單詞-文檔矩陣中不相似的兩個文檔,可能在語義空間內比較相似。
SVD,亦即奇異值分解,是對矩陣進行分解的一種方法,一個t*d維的矩陣(單詞-文檔矩陣)X,可以分解為T*S*DT,其中T為t*m維矩陣,T中的每一列稱為左奇異向量(left singular bector),S為m*m維對角矩陣,每個值稱為奇異值(singular value),D為d*m維矩陣,D中的每一列稱為右奇異向量。在對單詞文檔矩陣X做SVD分解之后,我們只保存S中最大的K個奇異值,以及T和D中對應的K個奇異向量,K個奇異值構成新的對角矩陣S’,K個左奇異向量和右奇異向量構成新的矩陣T’和D’:X’=T’*S’*D’T形成了一個新的t*d矩陣。