1. 程式人生 > 實用技巧 >【大資料分析】Ch.5:潛在語義分析·LSA(Latent Semantic Analysis)

【大資料分析】Ch.5:潛在語義分析·LSA(Latent Semantic Analysis)

本章的內容是對自然語言的分析,並非單純數與字元的統計,而是嘗試去理解人類的語言描述概念。自然語言通常是指一種自然地隨文化演化的語言。例如,漢語、英語、日語為自然語言的例子,這一種用法可見於自然語言處理一詞中。

LSA(Latent Semantic Analysis)

LSA:一種分析自然語言並根據潛在本意進行統計性處理的演算法。其核心思想如下:
在這裡插入圖片描述
如果我們能製作一個表格,這個表格統計著每個單詞對於每個文件的重要程度,當我們試圖去分析某一篇具體的文章我們就可以通過表格來直觀看到關於這篇文章的核心論點,我們就能挑選出想要閱讀的文章。
舉例:當我們從搜尋引擎上鍵入某些關鍵詞,搜尋引擎根據這些關鍵詞返回一個連結頁,然後使用者從連結頁進一步選擇自己想要的。這個搜尋引擎返回的過程,就需要使用潛在語義分析。

這個演算法最初誕生的目的,並不僅僅是為了高效檢索出對應核心關鍵詞的內容,還會根據詞庫中的 相似度來返回雖然不是一個詞但是卻具有相同意義的片語來,儘量不漏掉關鍵資訊。
LSA統計了詞庫中單詞對於每個文件的關聯級別,詞庫中不同術語之間的關聯程度,反映有用程度的重要等級等。通過只選擇最重要的概念,LSA可以丟棄一些不相關的噪聲,併合並共同發生的線,從而得到更簡單的資料表示;LSA可以提供術語與其他術語之間、文件與其他文件之間以及術語與文件之間的相似性得分。這些相似性度量對於查詢與查詢術語相關的文件集、將文件分組為主題以及查詢相關單詞等任務非常理想。
在這裡插入圖片描述
那麼問題來了,這個表格中的這個值,應該用什麼來表示呢?最直觀的想法可能是應用統計次數來反饋這個資訊,但是真的出現次數最多頻率最高的詞就是最重要的詞嗎?

現在很多學術性文獻大多是英語製成,如果你試著去統計一篇英語文獻中的單詞出現頻率;並比對其他文獻,我相信統計所有文獻整體出現頻率最高的是冠詞介詞the/a/of這一類的,但是很明顯,這一類詞絕對不可能是一篇文獻的核心內容。再加上自然語言中有一些修辭手法,【你的內心像花朵一樣,花朵是這世界上最單純、最美麗又最動人的事物】在這句話中,出現頻率最高的是最,而這個詞只是個程度詞,並不能表達這個句子的核心意義。

因此很明顯,單單使用出現頻率這一變數不能表達這個詞就是關於這篇文章最重要的詞。

那麼如何表達重要程度呢?
LSA中的表達方式是:如果一個詞在謀篇文章中大量出現,且在其他文件中也大量出現,則說明這個詞一定是不重要的詞。就像我們剛剛說到英語文獻中的of/the/a之類的冠詞介詞。而如果一個詞,在本篇文件中大量出現而在其他文獻中出現頻率並沒有這麼高,說明這個詞確實是用來形容當前文章的最簡單的表達詞。

TF-IDF (Term Frequency * Inverse Document Frequency)

在這裡插入圖片描述
LSA演算法將表格變化成矩陣,其行為文件n,列為詞庫中的詞。通過上述式子來計算他們各自的值,我們來一一討論一下這個公式。

術語出現頻率:這篇文章中出現的頻率與所有待分析文件中該詞出現的總量的比值。這個值很好理解,分母是一個定值不會改變,該式子只會隨著分子變化而變化 。這個式子值越大,說明這個術語在這篇文件中出現的次數越多。。也就是說如果這個數值大,這說明該術語在本篇文件中出現頻率高

轉置·文件頻率。分子是所有待分析文件的總數,分母是出現了當前關鍵詞的文件數量,也就說這個式子的分子是定值,而分母是可變的。分母越小,說明這個術語在整體文件中出現的頻率越低,而這個式子的值越大。

OK,然後我們來整理一下,兩項相乘,兩個大的值相乘值一定也相對更大,兩個值較小的相乘結果也相對較小。一個大值乘以一個小值,其結果未必是大值。這就反映了LSA的特點。
兩個大的值相乘值一定也相對更大:這兩個因式分別代表了某術語在當前文件中出現頻率高和這個術語在所有文件中並不是高頻詞。換言之,這個術語對這篇文件有著代表意義但是對其他文件沒有關聯性。
兩個值較小的相乘結果也相對較小:這個術語在當前文件出現頻率不算高且在整體所有文件中有大部分文章它出現了,換言之這個詞本身是一個高頻詞,且在當前文件也沒有代表性,是一個不重要的詞。
一個大值乘以一個小值,其結果未必是大值:這個屬於在當前文件出現頻率很高但是在整體文件出現頻率也很高,換言之很有可能是副詞介詞冠詞等一些偏修飾和結構性的詞語,被認定為不重要;這個詞在當前文件出現頻率比較低,在整體中出現的頻率也很低,換言之這個詞本身出現就很少,可能是非常少見的表達,自然不會對當前文件有代表意義。當然因為是未必,所以也存在恰巧的情況。

那麼,理解了上面兩個因式以後,為什麼要用log函式呢?
語料庫中詞語的頻率呈指數分佈
一個普通單詞的出現頻率是普通單詞的十倍,而普通單詞的出現頻率可能是罕見單詞的十倍或一百倍基於原始IDF的度量標準會給稀有詞太大的權重,實際上忽略了所有其他詞的影響。為了捕捉這個分佈,該方案使用IDF的日誌。通過將文件之間的乘法間隙轉換為加法間隙,來弱化文件頻率的差異
那是因為,高頻詞與低頻詞相比,會出現比較極端的情況。高頻的頻率太高,低頻的頻率太低,甚至高頻詞與中頻詞的差距都非常大。假設低頻詞出現了1次,中頻詞出現了100次,而高頻詞出現了一百萬次,你就會發現相對於高頻詞而言,中頻低頻其實都是小到可以忽視的部分,不需要把他們兩類細分,這就會導致資料不夠精確。而追加log函式可以讓原本的近指數函式更接近線性函式,更方便對中低頻資料與高頻資料的對比分析。

TF-IDF的弊端:
他將文件中的單詞作為詞,以詞為單位分離出來並進行統計,這就會忽略原本的句意以及出現一詞多義的情況。

  1. 否定是一個很重要的語義成分,但是如果把所有的否定詞單獨拿出,並進行統計,那麼否定的低頻率註定被忽視,此後得出的分析結果往往不盡人意
  2. 忽略了句子結構和順序。在某些倒裝句,修辭語法中表達的潛在含義會隨著詞語拆分和詞語統計變成單純的線性單詞統計。也會對分析的結果造成影響
  3. 一詞多義。可能會有一個詞具有多種意思的情況。比如band有樂隊和波段和帶狀物的意思,“Radiohead is the best band ever” and “I broke a rubber band”中兩個band不是同一個意思,但是他會被統計為同一個詞語。

這是TF-IDF的弊端。

SVD分解

SVD分解:
在這裡插入圖片描述
首先我們要明確的事,可能出現的能夠代表一篇文件的高頻詞彙的判定方法有一條是在其他文件出現頻率不高。換言之,可能不在其他文件中出現,假如當前文件是LSA的論文,那麼其他沒有出現LSA相關知識的文章,自然就以0表示了。也就說,一個偌大的矩陣中有大量的0,是一個稀疏矩陣。一個稀疏矩陣的利用效率低開銷大,不是我們想要的,所以我們想要通過SVD分解得到一個濃密矩陣。
在這裡插入圖片描述

這裡,我們將m設為文件數量,n設為詞庫總量。並自定義一個k,令k作為濃密矩陣的引數,且必然k≤n,因為k是過渡矩陣且最大值=n
當k與n相等,因子矩陣的乘積完全重構了原始矩陣;否則乘法結果是原始矩陣的低秩近似。k的選擇一般比n小得多。SVD分解的近似往往也會過濾很多噪聲,分解過程中失真的部分很大可能是噪音部分,因此不用擔心近似值對結果造成很大的失真影響,失真的部分很大概率是噪音;

術語、文件或概念的每個向量在其各自的空間中定義了一個軸(因為它是標準正交基),賦予術語、文件或概念的權重意味著沿著該軸的長度。在對應的向量空間內,每個向量都有對應的權重。

我們來看每一個子矩陣代表的意義:

U : m ∗ k U:m*k Umk

  • 每行對應一個文件,每列對應一個概念
  • 定義了文件空間和概念空間之間的對映

S : k ∗ k S:k*k Skk

  • 具有奇異值
  • 每個