文本向量化(理论篇)
本文介紹常見的文本表示模型,One-hot、詞袋模型(BOW)、TF-IDF、N-Gram和Word2Vec
離散表示
One-hot編碼
one-hot編碼是常用的方法,我們可以用one-hot編碼的方式將句子向量化,大致步驟為:
用構(gòu)造文本分詞后的字典
對(duì)詞語進(jìn)行One-hot編碼
John likes to watch movies. Mary likes too
John also likes to watch football games.
上面的兩句話分詞后可以構(gòu)造一個(gè)字典,字典內(nèi)容如下,字典的鍵是詞語,值是ID
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}
我們可以根據(jù)ID值對(duì)每個(gè)詞語進(jìn)行向量化,用0和1代表這個(gè)詞是否出現(xiàn)
# John [1, 0, 0, 0, 0, 0, 0, 0, 0, 0] # too [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
one-hot 詞向量構(gòu)造起來簡單,但通常不是一個(gè)好的選擇,它有明顯的缺點(diǎn):
維數(shù)過高。我們這里只有短短的2句話,每個(gè)詞語已經(jīng)是一個(gè)10維的向量了,隨著語料的增加,維數(shù)會(huì)越來越大,導(dǎo)致維數(shù)災(zāi)難
矩陣稀疏。利用One-hot編碼的另一個(gè)問題就是矩陣稀疏,從上面也可以看到,每一個(gè)詞向量只有1維是有數(shù)值的,其他維上的數(shù)值都為0
不能保留語義。用這種方式得到的結(jié)果不能保留詞語在句子中的位置信息, “我愛你” 和 “你愛我” 的向量化結(jié)果并沒有什么不同。
詞袋(BOW)模型
詞袋模型(Bag-of-words model,BOW),BOW模型假定對(duì)于一個(gè)文檔,忽略它的單詞順序和語法、句法等要素,將其僅僅看作是若干個(gè)詞匯的集合,文檔中每個(gè)單詞的出現(xiàn)都是獨(dú)立的,不依賴于其它單詞是否出現(xiàn)。
John likes to watch movies. Mary likes too
John also likes to watch football games.
使用之前同樣的例子,跟前面一樣,將上面的兩句話中看作一個(gè)文檔集,列出文檔中出現(xiàn)的所有單詞(忽略大小寫與標(biāo)點(diǎn)符號(hào)),構(gòu)造一個(gè)字典
{"John": 1, "likes": 2, "to": 3, "watch": 4, "movies": 5, "also": 6, "football": 7, "games": 8, "Mary": 9, "too": 10}
再用再將句子向量化,維數(shù)和字典大小一致,第 $i$ 維上的 數(shù)值 代表 ID 為 $i$ 的詞語在這個(gè)句子里出現(xiàn)的頻次
# 第一個(gè)文本 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] # 第二個(gè)文本 [1, 1, 1, 1, 0, 1, 1, 1, 0, 0]
以第一個(gè)文本的向量化結(jié)果 [1, 2, 1, 1, 1, 0, 0, 0, 1, 1] 為例,2在第二維上,ID為2的詞語是likes,在第一個(gè)文本中出現(xiàn)了2次,所以第二維上的數(shù)值是2
這種方式不像one-hot編碼那樣導(dǎo)致維數(shù)非常大,但也有自己的缺點(diǎn)
不能保留語義:不能保留詞語在句子中的位置信息,“你愛我” 和 “我愛你” 在這種方式下的向量化結(jié)果依然沒有區(qū)別。“我喜歡北京” 和 “我不喜歡北京” 這兩個(gè)文本語義相反,利用這個(gè)模型得到的結(jié)果卻能認(rèn)為它們是相似的文本。
維數(shù)高和稀疏性:當(dāng)語料增加時(shí),那么維數(shù)也會(huì)不可避免的增大,一個(gè)文本里不出現(xiàn)的詞語就會(huì)增多,導(dǎo)致矩陣稀疏
TF-IDF
TF-IDF(term frequency–inverse document frequency)是一種用于信息檢索與數(shù)據(jù)挖掘的常用加權(quán)技術(shù)。TF意思是詞頻(Term Frequency),IDF意思是逆文本頻率指數(shù)(Inverse Document Frequency)。
字詞的重要性隨著它在文件中出現(xiàn)的次數(shù)成正比增加,但同時(shí)會(huì)隨著它在語料庫中出現(xiàn)的頻率成反比下降。一個(gè)詞語在一篇文章中出現(xiàn)次數(shù)越多, 同時(shí)在所有文檔中出現(xiàn)次數(shù)越少, 越能夠代表該文章。
TF-IDF公式如下:
$TF(t,d)$表示詞語t在文檔d 中出現(xiàn)的頻率,$IDF(t)$是逆文本頻率指數(shù),它可以衡量 單詞t用于區(qū)分這篇文檔和其他文檔的重要性。IDF的公式如下,分母加1是為了避免分母為0
比如在10篇文檔中,1篇是猴子的,9篇是關(guān)于人的,關(guān)于人的文章中不出現(xiàn) “尾巴” 這個(gè)詞語,10篇文章中都出現(xiàn) “嘴巴” 這個(gè)詞語,那么 “尾巴” 這個(gè)詞在這些文章中就很有區(qū)分度。從公式的角度也很容易看出。以10為底數(shù)的話,$IDF(尾巴)$ = 0.70, $IDF(嘴巴)$ = -0.04,說明 “尾巴” 重要性更高點(diǎn),它有區(qū)分性。
前面說的缺點(diǎn)依然存在,它依然不能保留詞語在句子中的位置關(guān)系。
N-Gram
N-Gram語言模型的思想就是,給定一串字母,下一個(gè)最大可能出現(xiàn)的詞語是什么?比如 “今天你”,后面跟 “吃飯” 可能性大,但跟著 “后天” 的可能性就很小。
N=1時(shí)稱為unigram,N=2稱為bigram,N=3稱為trigram,假設(shè)下一個(gè)詞的出現(xiàn)依賴它前面的一個(gè)詞,即 bigram,假設(shè)下一個(gè)詞的出現(xiàn)依賴它前面的兩個(gè)詞,即 trigram,以此類推。
以下面的文本為例
你幫我
我?guī)湍?/p>
它的bigram依次為:
你,你幫,幫,幫我,我
我,我?guī)?,幫,幫你,?/pre>同樣地,我們可以構(gòu)造一個(gè)字典
{"你": 1, "你幫"; 2, "幫": 3,"幫我": 4, "我": 5, "我?guī)?: 6, "幫你": 7}向量化結(jié)果可以表示為
# 第一個(gè)文本 [1, 1, 1, 1, 1, 0, 0] # 第二個(gè)文本 [1, 0, 1, 0, 1, 1, 1]N-Gram基于一個(gè)假設(shè):第n個(gè)詞出現(xiàn)與前n-1個(gè)詞相關(guān),而與其他任何詞不相關(guān)(這也是隱馬爾可夫當(dāng)中的假設(shè))。整個(gè)句子出現(xiàn)的概率就等于各個(gè)詞出現(xiàn)的概率乘積,公式如下:
上面的表達(dá)式并不好計(jì)算,引入馬爾科夫假設(shè),那么可以將式子寫成
馬爾可夫鏈(Markov chain)為狀態(tài)空間中經(jīng)過從一個(gè)狀態(tài)到另一個(gè)狀態(tài)的轉(zhuǎn)換的隨機(jī)過程。該過程要求具備“無記憶”的性質(zhì):下一狀態(tài)的概率分布只能由當(dāng)前狀態(tài)決定,而與之前的狀態(tài)無關(guān)
特別地,對(duì)unigram,有
對(duì)bigram,有
對(duì)trigram,有
N-Gram考慮了詞的順序,信息量更充分。
但缺點(diǎn)是隨著N的增大,詞表迅速膨脹,數(shù)據(jù)出現(xiàn)大量稀疏的問題。
總結(jié)
由于存在以下的問題,對(duì)于一般的NLP問題,是可以使用離散表示文本信息來解決問題的,但對(duì)于要求精度較高的場(chǎng)景就不適合了。
無法衡量詞向量之間的關(guān)系。
詞表的維度隨著語料庫的增長而膨脹。
n-gram詞序列隨語料庫增長呈指數(shù)型膨脹,更加快。
離散數(shù)據(jù)來表示文本會(huì)帶來數(shù)據(jù)稀疏問題,導(dǎo)致丟失了信息,與我們生活中理解的信息是不一樣的。分布式表示
科學(xué)家們?yōu)榱颂岣吣P偷木龋职l(fā)明出了分布式的表示文本信息的方法。
用一個(gè)詞附近的其它詞來表示該詞,這是現(xiàn)代統(tǒng)計(jì)自然語言處理中最有創(chuàng)見的想法之一。當(dāng)初科學(xué)家發(fā)明這種方法是基于人的語言表達(dá),認(rèn)為一個(gè)詞是由這個(gè)詞的周邊詞匯一起來構(gòu)成精確的語義信息。就好比,物以類聚人以群分,如果你想了解一個(gè)人,可以通過他周圍的人進(jìn)行了解,因?yàn)橹車硕加幸恍┕餐c(diǎn)才能聚集起來。
共現(xiàn)矩陣
共現(xiàn)矩陣顧名思義就是共同出現(xiàn)的意思,詞文檔的共現(xiàn)矩陣主要用于發(fā)現(xiàn)主題(topic),用于主題模型,如LSA。
局域窗中的word-word共現(xiàn)矩陣可以挖掘語法和語義信息,例如:
I like deep learning.
I like NLP.
I enjoy flying.有以上三句話,設(shè)置滑窗(對(duì)稱窗口)為2,可以得到一個(gè)詞典:{"I like","like deep","deep learning","like NLP","I enjoy","enjoy flying","I like"}。
我們可以得到一個(gè)共現(xiàn)矩陣(對(duì)稱矩陣):
中間的每個(gè)格子表示的是行和列組成的詞組在詞典中共同出現(xiàn)的次數(shù),也就體現(xiàn)了共現(xiàn)的特性。比如例如:“I like”出現(xiàn)在第1,2句話中,一共出現(xiàn)2次,所以=2。對(duì)稱的窗口指的是,“like I”也是2次
存在的問題:
向量維數(shù)隨著詞典大小線性增長。
存儲(chǔ)整個(gè)詞典的空間消耗非常大。
一些模型如文本分類模型會(huì)面臨稀疏性問題。
模型會(huì)欠穩(wěn)定,每新增一份語料進(jìn)來,穩(wěn)定性就會(huì)變化。Word2Vec
谷歌2013年提出的Word2Vec是目前最常用的詞嵌入模型之一。Word2Vec實(shí)際 是一種淺層的神經(jīng)網(wǎng)絡(luò)模型,它有兩種網(wǎng)絡(luò)結(jié)構(gòu),分別是CBOW(Continues Bag of Words)連續(xù)詞袋和Skip-gram。
CBOW
CBOW是一個(gè)三層神經(jīng)網(wǎng)絡(luò),特點(diǎn)是輸入已知上下文,輸出對(duì)當(dāng)前單詞的預(yù)測(cè)。 CBOW通過中間詞來預(yù)測(cè)窗口中上下文詞出現(xiàn)的概率模型,把中間詞當(dāng)做y,把窗口中的其它詞當(dāng)做x輸入,x輸入是經(jīng)過one-hot編碼過的,然后通過一個(gè)隱層進(jìn)行求和操作,最后通過激活函數(shù)softmax,可以計(jì)算出每個(gè)單詞的生成概率,接下來的任務(wù)就是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的權(quán)重,使得語料庫中所有單詞的整體生成概率最大化,而求得的權(quán)重矩陣就是文本表示詞向量的結(jié)果。。
舉一個(gè)例子,我們有以下文本
I drink coffee everyday
假設(shè)我們輸入為 I, drink, everyday,那么我們訓(xùn)練的神經(jīng)網(wǎng)絡(luò)要使 coffee 的輸出概率最大。首先,我們將原來的文本的單詞用One-hot編碼表示,如下圖所示
初始化輸入權(quán)重矩陣 $W$ 和輸出權(quán)重矩陣 $W^{'}$,利用這個(gè)權(quán)重矩陣W和One-hot編碼完的向量相乘,可以得到唯一的向量 $V$,相當(dāng)于根據(jù)One-hot編碼中1的位置取出W中的對(duì)應(yīng)的列,除非兩列完全相同,否則得到的向量不會(huì)是一樣的。
我們這里有3個(gè)輸入值,將3個(gè)輸入值與 $W$ 相乘得到的向量相加做平均,得到隱藏層向量
隱藏層向量再乘以輸出權(quán)重矩陣 $W^{'}$ ,得到一個(gè)輸出向量
對(duì)輸出向量做softmax,得到輸出概率
Skip-Gram
Skip-Gram與CBOW相反,即已知某個(gè)詞語,預(yù)測(cè)周圍的詞語。通過當(dāng)前詞來預(yù)測(cè)窗口中上下文詞出現(xiàn)的概率模型,把當(dāng)前詞當(dāng)做 $x$,把窗口中其它詞當(dāng)做 $y$,依然是通過一個(gè)隱層接一個(gè)Softmax激活函數(shù)來預(yù)測(cè)其它詞的概率。
以下圖舉例,我們選定句子“The quick brown fox jumps over lazy dog”,設(shè)定我們的窗口大小為2(window_size=2),也就是說我們將輸入詞前后各兩個(gè)詞和輸入詞進(jìn)行組合作為訓(xùn)練樣本。下圖中,藍(lán)色代表input word,方框內(nèi)代表位于窗口內(nèi)的單詞。
以第一條為例,The為輸入詞,但是The開頭,前面沒有詞跟它組合,所以只能和后面兩個(gè)單詞分別組合。
當(dāng)quick輸入時(shí),它前面只有1個(gè)單詞,所以一共只有3個(gè)組合。
從brown開始,前面才會(huì)有2個(gè)及以上的單詞,所以從這里開始有4個(gè)組合。
我們的模型將會(huì)從每對(duì)單詞出現(xiàn)的次數(shù)中習(xí)得統(tǒng)計(jì)結(jié)果。例如,我們的神經(jīng)網(wǎng)絡(luò)可能會(huì)得到更多類似(“可樂“,”百事“)這樣的訓(xùn)練樣本對(duì),而對(duì)于(”可樂“,”醬油“)這樣的組合卻看到的很少。因此,當(dāng)我們的模型完成訓(xùn)練后,給定一個(gè)單詞”可樂“作為輸入,輸出的結(jié)果中”百事““要比”醬油“的概率高。
加速優(yōu)化方法
有Hierarchical Softmax(層次Softmax)和Negative Sample(負(fù)采樣)兩個(gè)加速方法,參考以下鏈接
Hierarchical Softmax:https://www.cnblogs.com/pinard/p/7243513.html,https://cloud.tencent.com/developer/article/1387413
Negative Sample:https://www.cnblogs.com/pinard/p/7249903.html參考資料
https://github.com/mantchs/machine_learning_model/tree/master/Word2Vec
https://www.jianshu.com/p/f8300129b568
https://blog.csdn.net/weixin_43112462/article/details/88669902
https://blog.csdn.net/lxg0807/article/details/78615917
https://www.cnblogs.com/bep-feijin/p/9430164.html
https://blog.csdn.net/yu5064/article/details/79601683
https://www.jianshu.com/p/471d9bfbd72f
https://www.zhihu.com/question/44832436
http://www.dataguru.cn/article-13488-1.html
總結(jié)
以上是生活随笔為你收集整理的文本向量化(理论篇)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linus Torvalds:回顾Lin
- 下一篇: RBF神经网络