【轉載】NLP從詞袋到Word2Vec的文本表示

  前面說明:近期在學習nlp方面的知識背景,恰巧看到一篇挺全面的科普性博客(來自掘金社區mantch用戶,侵權必刪),傳送門:https://juejin.im/post/5cd41afa6fb9a032332b47a4
  此文介紹了兩種文本表示的方法,**從離散表示的One-hot、詞袋模型、tfidf和n-gram到分佈表示的共現矩陣和神經網絡模型的NNLM、Word2Vec、sense2vec。**最後還給到了github的代碼實現,雖然最後對於sense2vec的說明不是特別詳細,但是整體對整個文本表示有了個基礎的介紹,對於初學、入門者而言是一個很好的材料。

下面正文:

  在NLP(自然語言處理)領域,文本表示是第一步,也是很重要的一步,通俗來說就是把人類的語言符號轉化爲機器能夠進行計算的數字,因爲普通的文本語言機器是看不懂的,必須通過轉化來表徵對應文本。早期是基於規則的方法進行轉化,而現代的方法是基於統計機器學習的方法。
  數據決定了機器學習的上限,而算法只是儘可能逼近這個上限,在本文中數據指的就是文本表示,所以,弄懂文本表示的發展歷程,對於NLP學習者來說是必不可少的。接下來開始我們的發展歷程。文本表示分爲離散表示和分佈式表示:

1.離散表示

1.1 One-hot表示

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

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

  例如:
1)John likes to watch movies. Mary likes too
2) 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),像是句子或是文件這樣的文字可以用一個袋子裝着這些詞的方式表現,這種表現方式不考慮文法以及詞的順序。
  文檔的向量表示可以直接將各詞的詞向量表示加和。例如:
1) John likes to watch movies. Mary likes too
2) 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) 詞向量化後,詞與詞之間是有大小關係的,不一定詞出現的越多,權重越大。
2) 詞與詞之間是沒有順序關係的。

1.3 TF-IDF

  TF-IDF(term frequency–inverse document frequency)是一種用於信息檢索與數據挖掘的常用加權技術。TF意思是詞頻(Term Frequency),IDF意思是逆文本頻率指數(Inverse Document Frequency)。
  字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。一個詞語在一篇文章中出現次數越多, 同時在所有文檔中出現次數越少, 越能夠代表該文章。
TFw=wTF_w=\frac{在某一類中詞條w出現的次數}{該類中所有的詞條數目}
(IDF=log(w+1)(IDF=log(\frac{語料庫的文檔總數}{包含詞條w的文檔總數+1})
分母之所以加1,是爲了避免分母爲0。
  那麼,從這個公式可以看出,當w在文檔中出現的次數增大時,而TF-IDF的值是減小的,所以也就體現了以上所說的了。

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

1.4 n-gram模型

  n-gram模型爲了保持詞的順序,做了一個滑窗的操作,這裏的n表示的就是滑窗的大小,例如2-gram模型,也就是把2個詞當做一組來處理,然後向後移動一個詞的長度,再次組成另一組詞,把這些生成一個字典,按照詞袋模型的方式進行編碼得到結果。改模型考慮了詞的順序。
  例如:
1) John likes to watch movies. Mary likes too
2) 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問題,是可以使用離散表示文本信息來解決問題的,但對於要求精度較高的場景就不適合了。
1) 無法衡量詞向量之間的關係。
2) 詞表的維度隨着語料庫的增長而膨脹。
3) n-gram詞序列隨語料庫增長呈指數型膨脹,更加快。
4) 離散數據來表示文本會帶來數據稀疏問題,導致丟失了信息,與我們生活中理解的信息是不一樣的。

2. 分佈式表示

  科學家們爲了提高模型的精度,又發明出了分佈式的表示文本信息的方法,這就是這一節需要介紹的。
  用一個詞附近的其它詞來表示該詞,這是現代統計自然語言處理中最有創見的想法之一。當初科學家發明這種方法是基於人的語言表達,認爲一個詞是由這個詞的周邊詞彙一起來構成精確的語義信息。就好比,物以類聚人以羣分,如果你想了解一個人,可以通過他周圍的人進行了解,因爲周圍人都有一些共同點才能聚集起來。

2.1 共現矩陣

  共現矩陣顧名思義就是共同出現的意思,詞文檔的共現矩陣主要用於發現主題(topic),用於主題模型,如LSA。
  局域窗中的word-word共現矩陣可以挖掘語法和語義信息,例如:

  1. I like deep learning.
  2. I like NLP.
  3. I enjoy flying

  有以上三句話,設置滑窗爲2,可以得到一個詞典:{“I like”,“like deep”,“deep learning”,“like NLP”,“I enjoy”,“enjoy flying”,“I like”}。
  我們可以得到一個共現矩陣(對稱矩陣):
轉載
  中間的每個格子表示的是行和列組成的詞組在詞典中共同出現的次數,也就體現了共現的特性。
存在的問題:
1) 向量維數隨着詞典大小線性增長。
2) 存儲整個詞典的空間消耗非常大。
3) 一些模型如文本分類模型會面臨稀疏性問題。
4) 模型會欠穩定,每新增一份語料進來,穩定性就會變化。

3.神經網絡表示

3.1 NNLM

  NNLM (Neural Network Language model),神經網絡語言模型是03年提出來的,通過訓練得到中間產物–詞向量矩陣,這就是我們要得到的文本表示向量矩陣。
  NNLM說的是定義一個前向窗口大小,其實和上面提到的窗口是一個意思。把這個窗口中最後一個詞當做y,把之前的詞當做輸入x,通俗來說就是預測這個窗口中最後一個詞出現概率的模型。
在這裏插入圖片描述
以下是NNLM的網絡結構圖:

在這裏插入圖片描述

  • input層是一個前向詞的輸入,是經過one-hot編碼的詞向量表示形式,具有V*1的矩陣。
  • C矩陣是投影矩陣,也就是稠密詞向量表示,在神經網絡中是w參數矩陣,該矩陣的大小爲DV,正好與input層進行全連接(相乘)得到D1的矩陣,採用線性映射將one-hot表 示投影到稠密D維表示。
    在這裏插入圖片描述
  • 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,可以計算出每個單詞的生成概率,接下來的任務就是訓練神經網絡的權重,使得語料庫中所有單詞的整體生成概率最大化,而求得的權重矩陣就是文本表示詞向量的結果。
在這裏插入圖片描述

Skip-gram:

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

在這裏插入圖片描述
優化方法:

  層次Softmax:至此還沒有結束,因爲如果單單只是接一個softmax激活函數,計算量還是很大的,有多少詞就會有多少維的權重矩陣,所以這裏就提出層次Softmax(Hierarchical Softmax),使用Huffman Tree來編碼輸出層的詞典,相當於平鋪到各個葉子節點上,瞬間把維度降低到了樹的深度,可以看如下圖所示。這課Tree把出現頻率高的詞放到靠近根節點的葉子節點處,每一次只要做二分類計算,計算路徑上所有非葉子節點詞向量的貢獻即可。
在這裏插入圖片描述
**負例採樣(Negative Sampling):**這種優化方式做的事情是,在正確單詞以外的負樣本中進行採樣,最終目的是爲了減少負樣本的數量,達到減少計算量效果。將詞典中的每一個詞對應一條線段,所有詞組成了[0,1]間的剖分,如下圖所示,然後每次隨機生成一個[1, M-1]間的整數,看落在哪個詞對應的剖分上就選擇哪個詞,最後會得到一個負樣本集合。
在這裏插入圖片描述
Word2Vec存在的問題
1) 對每個local context window單獨訓練,沒有利用包 含在global co-currence矩陣中的統計信息。
2) 對多義詞無法很好的表示和處理,因爲使用了唯一 的詞向量

3.3 sense2vec

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

4.代碼實現

github Word2Vec訓練維基百科文章


作者:mantch
鏈接:https://juejin.im/post/5cd41afa6fb9a032332b47a4
來源:掘金
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

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