自然語言處理中文本數值化表方法
詞向量是什么,自然語言理解的問題要轉化為機器學習的問題,第一步肯定是要找一種方法把這些符號數學化,NLP中大多是將文本表示為空間向量后再進行處理。
離散表示: one-hot表示
舉例:
語料庫:
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,"game":8,“Mary”:9,"too":10}
one-hot 表示:John: [1,0,0,0,0,0,0,0,0,0]
Mary: [0,0,0,0,0,0,0,0,1,0]
also: [0,0,0,0,0,1,0,0,0,0]
詞典中包含10個單詞,每個單詞有唯一索引,值的表示在詞典中的順序和在句子中的順序沒有關聯。
講解:由上可知one-hot表示當前詞的索引位置為1,其他值為0,表示非常稀疏。
離散表示:Bag of Words (詞袋表示)
- 根據one-hot的思想,文檔的空間向量表示可以之間將各詞的詞向量表示相加。這樣
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] - 由one-hot表示出的模型為基礎,也可以根據詞的權重來進行詞向量的表示。
- TF-IDF(Term Frequency-Inverse Document Frequency)
tf = n, n表示某詞在當前文檔中出現的次數。IDF權重是log(1 + N/Nt), N指所有的文檔數,Nt指含有詞t的文檔數 。
John likes to watch movies. Mary likes too. 就可以表示為 [0.693,1.386,0.693,0.693,1.099,0,0,0,0.693,0.693]
雖然FT-IDF能夠體現出各個詞在文檔中的重要程度(一般用于關鍵詞提取,主題分類),但是基于one-hot的模型的基礎,它是沒有考慮文檔中詞之間的順序問題,句子中詞之間沒有聯系,會丟失很重要的信息。
(用宜以上方法,I will help you 和 You will help me,兩個句子的空間向量表示是相同的)
- TF-IDF(Term Frequency-Inverse Document Frequency)
離散表示: Bi-gram和N-gram (考慮詞的順序)
語言模型: 通常在NLP中,人們基于一定的語料庫,可以利用語言模型(N-Gram)來預計或者評估一個句子是否合理。(N-gram詳解 )
N-gram是基于這樣一種假設,第n個詞的出現只與前面N-1個詞相關,而與其它任何詞都不相關. Bi-gram就是假設第n個詞只與它前面的一個詞有關。
和one-hot表示方法相似,這里為Bi-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]
缺點: 隨著字典size的增大,參數數量會非常大.
以后文本表示方法屬于離散表示,即各個詞之間是相互獨立的,并沒有表現出關聯關系.另外,利用以上方法我們也無法衡量向量之間的關系.比如
由"酒店","賓館"的向量:
酒店 [0,1,0,0,0,0,0,0,0,0]
賓館 [0,0,0,0,1,0,0,0,0,0]
按常識來講,我們是認為"酒店"和"賓館"是有相似含義的,但是由于向量表示的稀疏性我們很難捕捉到兩者之間的關系.
而且詞表的長度會隨著語料庫的增長而膨脹,n-gram序列隨著語料庫膨脹更快(因為是組合詞的詞典).
分布式表示(Distributed representation)
如上圖所示,如果我們利用離散文本表示方法對本文進行表示時,"紅色的大型卡車","黃色的中型SUV","紫色的小型電動車"無法表達任何相似的信息. 那么考慮用顏色,型號,車型分布式對相應文本進行表示. 那么對于"紅色的大型卡車"和"紅色的小型電動車"的表示就會有相同部分表示,基于此我們就可以來進行文本信息處理.
共現矩陣(Cocurrence matrix)
word-word共現矩陣可以挖掘語法和語義信息.對于以下含有三句話的語料庫我們進行word-word共現矩陣表示.
I like deep learning.
I like NLP.
I enjoy flying.
為了理解,這里window length設為1 (一般為5~10)
使用對稱的窗函數(左右window length都為1)
正如上圖,對于"I", 左右窗口中出現"I"的次數為0,"like"出現為2次,"enjoy"出現次數為1,"deep","learning","NLP","flying","."都為0. 以此類推,得到一個對稱矩陣.這樣,也同時得到了每個word的分布式表示,如'I' [0,2,1,0,0,0,0,0]
但由共現矩陣得到的詞向量存在一下問題:
- 向量維數隨著字典大小線性增長;
- 存儲整個字典的空間消耗會非常大;
- 一些模型如文本分類模型會面臨稀疏性問題;
- 模型會欠穩定.
NNML(Neural Network Language Model)
詞向量通過神經網絡語言模型得到,一定程度上解決數據稀疏性.
如上圖所示,神經網絡模型包括投影層,隱藏層和輸出層.假如有語料"我愛北京天安門",經過分詞得到"我" "愛" "北京" "天安門".模型的訓練過程如下:
- 將"我" "愛" "北京" "天安門"分別用one-hot embedding 的形式表示出來(各向量維數和字典大小相同).
"我" [1,0,0,0]
"愛" [0,1,0,0]
"北京" [0,0,1,0]
"天安門" [0,0,0,1] - "我" "愛" "北京" 三個空間向量作為輸入, 通過語言模型"我愛北京"之后的詞,每個輸入是1x4的矩陣Ai,經過投影層和200x4的矩陣Ci相乘,即Ci*Ai',投影出200x1的向量(這也是此層叫投影層的原因) 然后對這三個向量進行拼接(concate),得到一個800維的向量;
- 隱藏層將一個800的向量經過激活函數tanh處理;
- 輸出層輸出的是維數是4的概率向量,每一維表示字典中每個詞是要預測的那個詞的概率;
- 輸出層經過softmax分類函數,得到一個概率向量和已知正確的向量即"天安門" [0,0,0,1]求KL(Kullback Leibler)距離,然后利用BP(Backpropagation algorithm 反向傳播算法)和SGD(Stochastic Gradient Descent 隨機梯度下降)對模型進行調優.
根據訓練好的模型就可以得到文本內容的詞向量.
備注: 投影矩陣C和w,b 相似,模型訓練時被初始化,然后經過逐漸學習和調優而確定.
word2vec CBOW(Continuous Bag-of-Words 連續詞袋)
CBOW模型是利用前后的詞來預測當前的詞.比如"我愛中華人民共和國",假如窗口為2,即利用"我" "愛"和"人民" "共和國"來預測"中華"這個詞, 此模型相對NNML計算量要小很多, 該模型沒有隱藏層并且直接使用低維稠密的向量來進行表示. 投影層是進行了求和處理. 假如我們的輸入都是200維的向量,字典size大小為40000, 那么輸出就是一個40000維的向量,而且中間從映射層到輸出層的參數w是200x40000,這是很不好處理的. 所以CBOW最后一層采用了霍夫曼壓縮編碼(huffman tree). 輸出為一個200維的向量.
word2vec Skip-gram模型
Skip-gram和CBOW模型相反, 是由當前詞來預測context, 該模型同樣也沒要隱藏層,投影層也可以忽略. 最后也是進行霍夫曼編碼.關于word2vec的詳細講解可參考word2vec的數學原理詳解.
wor2vec存在的問題
- 對同一個詞使用了唯一的詞向量的表示,無法表達一次多義的情況.
- 對每個local context window 單獨訓練, 沒有利用包含在Global co-currence矩陣中的統計信息.