1. 程式人生 > >NLP從詞袋到Word2Vec的文字表示

NLP從詞袋到Word2Vec的文字表示

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

資料決定了機器學習的上限,而演算法只是儘可能逼近這個上限,在本文中資料指的就是文字表示,所以,弄懂文字表示的發展歷程,對於NLP學習者來說是必不可少的。接下來開始我們的發展歷程。文字表示分為離散表示和分散式表示:

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"}。

我們可以得到一個共現矩陣(對稱矩陣):

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

存在的問題:

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

3.神經網路表示

3.1 NNLM

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

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

以下是NNLM的網路結構圖:

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

  • C矩陣是投影矩陣,也就是稠密詞向量表示,在神經網路中是w引數矩陣,該矩陣的大小為D*V,正好與input層進行全連線(相乘)得到D*1的矩陣,採用線性對映將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存在的問題

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

3.3 sense2vec

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

4.程式碼實現

github Word2Vec訓練維基百科文章








歡迎新增微信交流!請備註“機器學習”