NLP從詞袋到Word2Vec的文本表示

在NLP(天然語言處理)領域,文本表示是第一步,也是很重要的一步,通俗來講就是把人類的語言符號轉化爲機器可以進行計算的數字,由於普通的文本語言機器是看不懂的,必須經過轉化來表徵對應文本。早期是基於規則的方法進行轉化,而現代的方法是基於統計機器學習的方法。git

數據決定了機器學習的上限,而算法只是儘量逼近這個上限,在本文中數據指的就是文本表示,因此,弄懂文本表示的發展歷程,對於NLP學習者來講是必不可少的。接下來開始咱們的發展歷程。文本表示分爲離散表示分佈式表示github

1.離散表示

1.1 One-hot表示

One-hot簡稱讀熱向量編碼,也是特徵工程中最經常使用的方法。其步驟以下:算法

  1. 構造文本分詞後的字典,每一個分詞是一個比特值,比特值爲0或者1。
  2. 每一個分詞的文本表示爲該分詞的比特位爲1,其他位爲0的矩陣表示。

例如: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} **機器學習

每一個詞典索引對應着比特位。那麼利用One-hot表示爲:分佈式

**John: [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] **函數

likes: [0, 1, 0, 0, 0, 0, 0, 0, 0, 0] .......等等,以此類推。學習

One-hot表示文本信息的缺點優化

  • 隨着語料庫的增長,數據特徵的維度會愈來愈大,產生一個維度很高,又很稀疏的矩陣。
  • 這種表示方法的分詞順序和在句子中的順序是無關的,不能保留詞與詞之間的關係信息。

1.2 詞袋模型

詞袋模型(Bag-of-words model),像是句子或是文件這樣的文字能夠用一個袋子裝着這些詞的方式表現,這種表現方式不考慮文法以及詞的順序。

文檔的向量表示能夠直接將各詞的詞向量表示加和。例如:

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} **

那麼第一句的向量表示爲:[1,2,1,1,1,0,0,0,1,1],其中的2表示likes在該句中出現了2次,依次類推。

詞袋模型一樣有一下缺點

  • 詞向量化後,詞與詞之間是有大小關係的,不必定詞出現的越多,權重越大。
  • 詞與詞之間是沒有順序關係的。

1.3 TF-IDF

TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的經常使用加權技術。TF意思是詞頻(Term Frequency),IDF意思是逆文本頻率指數(Inverse Document Frequency)。

字詞的重要性隨着它在文件中出現的次數成正比增長,但同時會隨着它在語料庫中出現的頻率成反比降低。一個詞語在一篇文章中出現次數越多, 同時在全部文檔中出現次數越少, 越可以表明該文章。

TF_w=\frac{在某一類中詞條w出現的次數}{該類中全部的詞條數目}

IDF=log(\frac{語料庫的文檔總數}{包含詞條w的文檔總數+1}),分母之因此加1,是爲了不分母爲0。

那麼,TF-IDF=TF*IDF,從這個公式能夠看出,當w在文檔中出現的次數增大時,而TF-IDF的值是減少的,因此也就體現了以上所說的了。

**缺點:**仍是沒有把詞與詞之間的關係順序表達出來。

1.4 n-gram模型

n-gram模型爲了保持詞的順序,作了一個滑窗的操做,這裏的n表示的就是滑窗的大小,例如2-gram模型,也就是把2個詞當作一組來處理,而後向後移動一個詞的長度,再次組成另外一組詞,把這些生成一個字典,按照詞袋模型的方式進行編碼獲得結果。改模型考慮了詞的順序。

例如:

John likes to watch movies. Mary likes too

John also likes to watch football games.

以上兩句能夠構造一個詞典,{"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}

那麼第一句的向量表示爲:[1, 1, 1, 1, 1, 1, 0, 0, 0, 0],其中第一個1表示John likes在該句中出現了1次,依次類推。

**缺點:**隨着n的大小增長,詞表會成指數型膨脹,會愈來愈大。

1.5 離散表示存在的問題

因爲存在如下的問題,對於通常的NLP問題,是可使用離散表示文本信息來解決問題的,但對於要求精度較高的場景就不適合了。

  • 沒法衡量詞向量之間的關係。
  • 詞表的維度隨着語料庫的增加而膨脹。
  • n-gram詞序列隨語料庫增加呈指數型膨脹,更加快。
  • 離散數據來表示文本會帶來數據稀疏問題,致使丟失了信息,與咱們生活中理解的信息是不同的。

2. 分佈式表示

科學家們爲了提升模型的精度,又發明出了分佈式的表示文本信息的方法,這就是這一節須要介紹的。

**用一個詞附近的其它詞來表示該詞,這是現代統計天然語言處理中最有創見的想法之一。**當初科學家發明這種方法是基於人的語言表達,認爲一個詞是由這個詞的周邊詞彙一塊兒來構成精確的語義信息。就比如,物以類聚人以羣分,若是你想了解一我的,能夠經過他周圍的人進行了解,由於周圍人都有一些共同點才能彙集起來。

2.1 共現矩陣

共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(topic),用於主題模型,如LSA。

局域窗中的word-word共現矩陣能夠挖掘語法和語義信息,例如:

  • I like deep learning.
  • I like NLP.
  • I enjoy flying

有以上三句話,設置滑窗爲2,能夠獲得一個詞典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}

咱們能夠獲得一個共現矩陣(對稱矩陣):

image

中間的每一個格子表示的是行和列組成的詞組在詞典中共同出現的次數,也就體現了共現的特性。

存在的問題:

  • 向量維數隨着詞典大小線性增加。
  • 存儲整個詞典的空間消耗很是大。
  • 一些模型如文本分類模型會面臨稀疏性問題。
  • 模型會欠穩定,每新增一份語料進來,穩定性就會變化。

3.神經網絡表示

3.1 NNLM

NNLM (Neural Network Language model),神經網絡語言模型是03年提出來的,經過訓練獲得中間產物--詞向量矩陣,這就是咱們要獲得的文本表示向量矩陣。

NNLM說的是定義一個前向窗口大小,其實和上面提到的窗口是一個意思。把這個窗口中最後一個詞當作y,把以前的詞當作輸入x,通俗來講就是預測這個窗口中最後一個詞出現機率的模型。

image

如下是NNLM的網絡結構圖:

image

  • input層是一個前向詞的輸入,是通過one-hot編碼的詞向量表示形式,具備V*1的矩陣。

  • C矩陣是投影矩陣,也就是稠密詞向量表示,在神經網絡中是w參數矩陣,該矩陣的大小爲D*V,正好與input層進行全鏈接(相乘)獲得D*1的矩陣,採用線性映射將one-hot表 示投影到稠密D維表示。

    image

  • output層(softmax)天然是前向窗中須要預測的詞。

  • 經過BP+SGD獲得最優的C投影矩陣,這就是NNLM的中間產物,也是咱們所求的文本表示矩陣,經過NNLM將稀疏矩陣投影到稠密向量矩陣中。

3.2 Word2Vec

谷歌2013年提出的Word2Vec是目前最經常使用的詞嵌入模型之一。Word2Vec實際 是一種淺層的神經網絡模型,它有兩種網絡結構,**分別是CBOW(Continues Bag of Words)連續詞袋和Skip-gram。**Word2Vec和上面的NNLM很相似,但比NNLM簡單。

CBOW

CBOW是經過中間詞來預測窗口中上下文詞出現的機率模型,把中間詞當作y,把窗口中的其它詞當作x輸入,x輸入是通過one-hot編碼過的,而後經過一個隱層進行求和操做,最後經過激活函數softmax,能夠計算出每一個單詞的生成機率,接下來的任務就是訓練神經網絡的權重,使得語料庫中全部單詞的總體生成機率最大化,而求得的權重矩陣就是文本表示詞向量的結果。

image

Skip-gram

Skip-gram是經過當前詞來預測窗口中上下文詞出現的機率模型,把當前詞當作x,把窗口中其它詞當作y,依然是經過一個隱層接一個Softmax激活函數來預測其它詞的機率。以下圖所示:

image

優化方法

  • 層次Softmax:至此尚未結束,由於若是單單只是接一個softmax激活函數,計算量仍是很大的,有多少詞就會有多少維的權重矩陣,因此這裏就提出層次Softmax(Hierarchical Softmax),使用Huffman Tree來編碼輸出層的詞典,至關於平鋪到各個葉子節點上,瞬間把維度下降到了樹的深度,能夠看以下圖所示。這課Tree把出現頻率高的詞放到靠近根節點的葉子節點處,每一次只要作二分類計算,計算路徑上全部非葉子節點詞向量的貢獻便可。

image

  • **負例採樣(Negative Sampling):**這種優化方式作的事情是,在正確單詞之外的負樣本中進行採樣,最終目的是爲了減小負樣本的數量,達到減小計算量效果。將詞典中的每個詞對應一條線段,全部詞組成了[0,1]間的剖分,以下圖所示,而後每次隨機生成一個[1, M-1]間的整數,看落在哪一個詞對應的剖分上就選擇哪一個詞,最後會獲得一個負樣本集合。

    image

Word2Vec存在的問題

  • 對每一個local context window單獨訓練,沒有利用包 含在global co-currence矩陣中的統計信息。
  • 對多義詞沒法很好的表示和處理,由於使用了惟一 的詞向量

3.3 sense2vec

word2vec模型的問題在於詞語的多義性。好比duck這個單詞常見的含義有 水禽或者下蹲,但對於 word2vec 模型來講,它傾向於將全部概念作歸一化 平滑處理,獲得一個最終的表現形式。

4.代碼實現

github Word2Vec訓練維基百科文章





image.png

歡迎添加微信交流!請備註「機器學習」。

相關文章
相關標籤/搜索