文本表示

文本表示就是將文本轉化成數學上的向量表示,怎麼把字符串轉化爲向量,就是文本表示的核心問題。

一、離散表示

1、詞袋模型(Bag of Words)

詞袋模型就是將字符串看成一個裝滿詞的袋子,詞是在袋子裏隨機放着的。

假設語料庫爲:

                      John likes to watch movies. Mary likes too.

                      John also likes to watch football games.

詞典(袋子)就是:{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also":6, "football": 7, "games": 8, "Mary": 9, "too": 10}

John likes to watch movies. Mary likes too. 就可以表示爲: [1, 2, 1, 1, 1, 0, 0, 0, 1, 1]。

John also likes to watch football games.      就可以表示爲: [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]。

詞袋模型的優點:

        (1)、簡單、方便、快捷。

        (2)、在語料充足的條件下,對簡單的自然語言處理任務效果不錯,例如文本分類。

詞袋模型的缺點:

        (1)、其準確率往往比較低。凡是出現在文本中的詞一視同仁,不能體現不同詞在一句話中的不同的重要性。

        (2)、無法關注詞語之間的順序,如“武松打老虎”跟“老虎打武松”在詞袋子模型中是認爲一樣的。

2、TF-IDF(Term Frequency - Inverse Document Frequency)

在文本表示中不僅考慮詞,還考慮出現詞的重要程度,就用到TF-IDF。

每個詞的IDF權重計算公式爲: 

                                                                          idf=log(1+\frac{N}{n_t})                                     

其中N爲文檔總數,n_t爲包含該詞的文檔總數。那麼:

                                                                         TF-IDF=tf*idf

3、One-hot

One-hot用來對詞向量編碼,假設我們的詞庫總共有n個詞,那麼我們就可以用一個1*n的向量表示每一詞,每個詞所在位置的索引位置爲1,其餘位置的元素都爲0。

        John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] 

        likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]

        ...

        too : [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]

4、Bi-gram和N-gram

爲2-gram建立索引:

        "John likes”:      1,

        "likes to”:         2,

        "to watch”:       3,

        "watch movies”:   4,

        "Mary likes”:      5,

        "likes too”:       6,

        "John also”:      7, 

        "also likes”:      8, 

        “watch football”:  9,

        "football games": 10, 


  John likes to watch movies. Mary likes too.    就可以表示爲: [1, 1, 1, 1, 1, 1, 0, 0, 0, 0] 

 John also likes to watch football games.          就可以表示爲: [0, 1, 1, 0, 0, 0, 1, 1, 1, 1] 

優點:考慮了詞的順序

缺點:隨着N的增大,詞表膨脹

5、基於共現矩陣的列向量

自然語言處理的矩陣表示有:(1)詞-文檔矩陣;(2)基於窗口的共現矩陣

 I  like  deep  learning.               

 I like  NLP.         

 I enjoy  flying.      

給出基於窗口的共現矩陣:

缺點:

        (1)、向量隨着字典(文檔)大小呈線性增長

        (2)、消耗空間較大

        (3)、稀疏問題

二、分佈式表示

1、基於矩陣降維的方法

一般對詞-文檔矩陣,或者共現矩陣進行PCA或者SVD進行降維。將原來 m×n 的矩陣降爲 m×r的矩陣,其中 r<n,即將詞向量的長度進行縮減。下面爲奇異值分解的步驟:

擴展:

        基於聚類的分佈表示又稱作分佈聚類(distributional clustering),這類方法通過聚類手段構建詞與其上下文之間的關係。其中最經典的方法是布朗聚類(Brown clustering)。布朗聚類是一種層級聚類方法,聚類結果爲每個詞的多層類別體系。因此可以根據兩個詞的公共類別判斷這兩個詞的語義相似度。不常用,讀者可自行研究。

2、基於神經網絡

(1)、NNLM (Neural Network Language model) 

2003年提出了A Neural Probabilistic Language Model,其用前n-1個詞預測第n個詞的概率,並用神經網絡搭建模型。目標函數爲:

                                                                    L(\theta)=\sum_{t}logP(w_{t}|w_{t-n},w_{t-n-1},...,w_{t-1})

使用非對稱的前向窗口,長度爲n-1,滑動窗口遍歷整個語料庫求和,使得目標概率最大化,其計算量正比於語料庫大小。同時,預測所有詞的概率總和應爲1。

                                                                 \sum_{w\in {vocabulay}}logP(w_{t}|w_{t-n},w_{t-n-1},...,w_{t-1})=1

網絡結構爲:

樣本的一組輸入是第n個詞的前n-1個詞的one-hot表示,目標是預測第n個詞,輸出層的大小是語料庫中所有詞的數量,然後sotfmax迴歸,使用反向傳播不斷修正神經網絡的權重來最大化第n個詞的概率。當神經網絡學得到權重能夠很好地預測第n個詞的時候,輸入層到映射層,即​ 這層,其中的權重Matrix C 被稱爲投影矩陣,輸入層各個詞的ont-hot表示法只在其對應的索引位置爲1,其他全爲0,在與Matrix C 矩陣相乘時相當於在對應列取出列向量投影到映射層。

                                            Matric\;C=(w_{1},w_{2},...,w_{v})=\begin{vmatrix} (w_{1})_{1}\;\; (w_{2})_{1} \;\; ... \;\; (w_{v})_{1} \\ (w_{1})_{2}\;\; (w_{2})_{2} \;\; ... \;\; (w_{v})_{2} \\ ...\\ (w_{1})_{D}\;\; (w_{2})_{D} \;\; ... \;\; (w_{v})_{D}\\ \end{vmatrix}

此時的向量​就是原詞​的分佈式表示,其是稠密向量而非原來one-hot的稀疏向量了。

在後面的隱藏層將這n-1個稠密的詞向量進行拼接,如果每個詞向量的維度爲D,則隱藏層的神經元個數爲 (n-1)×D,然後接一個所有待預測詞數量的全連接層,最後用softmax進行預測。

擴展(我沒做詳細的推導,在這裏不做介紹,有興趣的同學可以自行研究):

       (a)2007 年,Mnih和Hinton在神經網絡語言模型(NNLM)的基礎上提出了log雙線性語言模型(Log-Bilinear Language Model,LBL);

       (b)循環神經網絡語言模型(RNNLM),該模型就是把NNLM隱層變成RNN,每一個隱層包含此前所有上文信息,RNNLM裏面最厲害的就屬ELMO,順着這個路線,大家可以繼續研究GPT和BERT。

(2)、Word2vec

(a)CBOW(連續詞袋模型)

CBOW是以{"The", "cat", ’over", "the’, "puddle"}爲上下文,來夠預測或產生它們中心的詞語"jumped"。原理圖爲:

損失函數爲:     

                                              \begin{align*} minimize\;J&=-logP(w_{c}|w_{c-m},...,w_{c-1},w_{c+1},...,w_{c+m})\\ &=-logP(u_c|\hat{v})\\ &=-log\frac{exp(u_c^T\hat{v})}{\sum_{j=1}^{|V|}}exp(u_j^T\hat{v}) \\ &=-logu_c^T+log\sum_{j=1}^{|V|}exp(u_{j}^{T}\hat{v}) \end{align*}

與NNLM相比:

        (a)取消了隱藏層,減少了計算量

        (b)採用上下文劃窗而不只是前文劃窗,即用上下文的詞來預測當前詞

        (c)投影層不再使用各向量拼接的方式,而是簡單的求和平均

(b)、Skip-gram

Skip-gram是以中心的詞語"jumped"爲輸入,能夠預測或產生它周圍的詞語"The", "cat", ’over", "the”, "puddle"等。原理圖爲:

損失函數爲:

                                                \begin{align*} minimize\;J &= -log P(w_{c-m},...,w_{c-1},w_{c+1},...,w_{c+m}|w_c)\\ &= -log \prod_{j=0,j\neq m}^{2m} P(w_{c-m+j}|w_c) \\ &= -log \prod_{j=0,j\neq m}^{2m} P(w_{c-m+j}|v_c) \\ &= -log \prod_{j=0,j\neq m}^{2m} \frac{exp(u_{c-m+j}^{T}v_{c})}{\sum_{k=1}^{|V|}exp(u_k^Tv_c)}\\ &=-\prod_{j=0,j\neq m}^{2m} u_{c-m+j}^{T}v_{c}+2mlog \sum_{k=1}^{|V|}exp(u_{k}^{T}v_{c}) \end{align*}

從上面兩個損失函數可以看出,在計算概率時的softmax操作,需要計算隱藏層和輸出層所有V中單詞之間的概率,這是一個非常耗時的操作,因此,爲了優化模型的訓練,minkov文中提到Hierarchical softmax 和 Negative sampling 兩種方法對上述模型進行訓練。在這裏對這兩種方法就不做介紹了,有興趣的同學可以看相關論文。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章