文本表示: 從 One-Hot 到 Word2Vec

在自然語言處理(NLP)領(lǐng)域,如何對文本這種非結(jié)構(gòu)化的數(shù)據(jù)進(jìn)行表示是 NLP 的一個重要研究方向。

One-Hot

One-Hot Encoding

在說文本 One-Hot Encoding 之前,先來說一說機(jī)器學(xué)習(xí)中的 One-Hot Encoding,兩者還是有一點(diǎn)點(diǎn)區(qū)別的。

One-Hot編碼,又稱獨(dú)熱編碼、一位有效編碼。其方法是使用 N 位狀態(tài)寄存器來對N個狀態(tài)進(jìn)行編碼,每個狀態(tài)都有它獨(dú)立的寄存器位,并且在任意時候,其中只有一位有效。舉個例子,假設(shè)我們有四個樣本(行),每個樣本有三個特征(列),如圖:

上圖中我們已經(jīng)對每個特征進(jìn)行了普通的數(shù)字編碼:我們的feature_1有兩種可能的取值,比如是男/女,這里男用1表示,女用2表示。那么one-hot編碼是怎么搞的呢?我們再拿feature_2來說明:

這里feature_2 有4種取值(狀態(tài)),我們就用4個狀態(tài)位來表示這個特征,one-hot編碼就是保證每個樣本中的單個特征只有 1 位處于狀態(tài) 1,其他的都是 0。

對于2種狀態(tài)、三種狀態(tài)、甚至更多狀態(tài)都是這樣表示,所以我們可以得到這些樣本特征的新表示:

one-hot編碼將每個狀態(tài)位都看成一個特征。對于前兩個樣本我們可以得到它的特征向量分別為

NLP 中的 One-Hot Encoding

在 NLP 中,在特征提取上屬于詞袋模型(bag of words)。下面通過一個例子進(jìn)行解釋:
假設(shè)我們的語料庫中有三段話:

我愛中國
爸爸媽媽愛我
爸爸媽媽愛中國

我們首先對預(yù)料庫分離并獲取其中所有的詞,然后對每個此進(jìn)行編號:

1 我; 2 愛; 3 爸爸; 4 媽媽;5 中國

然后使用one hot對每段話提取特征向量:

;

;

因此我們得到了最終的特征向量為

我愛中國  ->   1,1,0,0,1

爸爸媽媽愛我  ->  1,1,1,1,0

爸爸媽媽愛中國  ->  0,1,1,1,1

優(yōu)缺點(diǎn)分析

優(yōu)點(diǎn):一是解決了分類器不好處理離散數(shù)據(jù)的問題,二是在一定程度上也起到了擴(kuò)充特征的作用(上面樣本特征數(shù)從3擴(kuò)展到了9)

缺點(diǎn):
首先,它是一個詞袋模型,不考慮詞與詞之間的順序(文本中詞的順序信息也是很重要的);
其次,它假設(shè)詞與詞相互獨(dú)立(在大多數(shù)情況下,詞與詞是相互影響的);

最后,它得到的特征是離散稀疏的。

Word2Vec

Word2Vec 來源于2013年的論文《Efficient Estimation of Word Representation in Vector Space》,它的核心思想是通過詞的上下文得到詞的向量化表示,有兩種方法:CBOW(通過上下文的詞預(yù)測中心詞)、Skip-gram(通過中心詞預(yù)測上下文的詞):

CBOW :
通過目標(biāo)詞的上下文的詞預(yù)測目標(biāo)詞,圖中就是取大小為2的窗口,通過目標(biāo)詞前后兩個詞預(yù)測目標(biāo)詞。具體的做法是,設(shè)定詞向量的維度d,對所有的詞隨機(jī)初始化為一個d維的向量,然后要對上下文所有的詞向量編碼得到一個隱藏層的向量,通過這個隱藏層的向量預(yù)測目標(biāo)詞,CBOW中的做法是簡單的相加,然后做一個softmax的分類,例如詞匯表中一個有V個不同的詞,就是隱藏層d維的向量乘以一個W矩陣(Rd×VR d×V )轉(zhuǎn)化為一個V維的向量,然后做一個 softmax 的分類。

由于 V 詞匯的數(shù)量一般是很大的,每次訓(xùn)練都要更新整個W矩陣計(jì)算量會很大,同時這是一個樣本不均衡的問題,不同的詞的出現(xiàn)次數(shù)會有很大的差異,所以論文中采用了兩種不同的優(yōu)化方法 「層次Softmax」和「負(fù)采樣」。

Skip-gram :
跟CBOW的原理相似,它的輸入是目標(biāo)詞,先是將目標(biāo)詞映射為一個隱藏層向量,根據(jù)這個向量預(yù)測目標(biāo)詞上下文兩個詞,因?yàn)樵~匯表大和樣本不均衡,同樣也會采用多層softmax或負(fù)采樣優(yōu)化。

層次 Softmax:

由于單詞出現(xiàn)的頻率是不一樣的,所以用哈夫曼編碼構(gòu)建一個二叉樹,出現(xiàn)頻率高的詞放在前面可以減少計(jì)算量,用哈夫曼編碼記錄路徑,例如圖中單詞2(w2w 2?
,規(guī)定左邊走是1,右邊走是0)的哈夫曼編碼就是1110,在路徑上每到一個節(jié)點(diǎn)就是一個sigmoid的二分類,所以叫多層softmax。具體來說每個節(jié)點(diǎn)處會有一個d維的向量參數(shù)θ
θ,每個單詞也是d維的向量xwx w,一個sigmoid的方程決定向左或者右走的概率,往左走的概率是:

負(fù)采樣也是把模型變?yōu)槎倪壿嫽貧w,每個詞對應(yīng)一個詞向量xwx w和詞的網(wǎng)絡(luò)參數(shù)θw
θ w?,每個詞附近有2c個詞,通過負(fù)采樣,隨機(jī)采樣neg個反例,讓正例詞對目標(biāo)詞的詞向量和窗口內(nèi)詞的網(wǎng)絡(luò)參數(shù)的乘積盡可能的大,反例的盡可能小,是模型的訓(xùn)練目標(biāo)。例如在skip-gram中目標(biāo)詞A的詞向量是xAx A? ,它2c的窗口內(nèi)附近一個詞的網(wǎng)絡(luò)參數(shù)是θB
θ B ,讓這兩個的乘積盡可能的大,σ(xTAθB)σ(x AT θ B)盡可能大,反例,隨機(jī)采樣出來的詞乘積盡可能小。同理CBOW中是將2c個詞相加求平均,然后與目標(biāo)詞的網(wǎng)絡(luò)參數(shù)相乘,也是讓窗口內(nèi)真實(shí)存在的詞乘積盡可能大,隨機(jī)采樣出的詞盡可能小。
負(fù)采樣的方式是根據(jù)詞出現(xiàn)的頻率進(jìn)行采樣,出現(xiàn)頻率越高,越可能被采樣到,原文中是根據(jù)出現(xiàn)頻率的 3/4次方然后做一個歸一化作為概率進(jìn)行采樣。

另外這篇論文的作者在2016年開源了一個文本分類的工具,F(xiàn)astText,與word2vec的原理非常類似,只不過在做文本分類時是一個有監(jiān)督的分類預(yù)測文本的label。另外加入n-gram的特征,對于英文,每個單詞前后加入標(biāo)識,例如#good#,如果是3-gram的特征就是加入#go,goo,ood,od#,可以解決一些oov的問題(不在訓(xùn)練集中出現(xiàn)的生詞)和引入一些詞根的特征。對于中文“你愛我”和“我愛你”有完全不同的語義,用CNN或者h(yuǎn)ighway網(wǎng)絡(luò)處理的char embedding可以引入這部分的特征。


[1] https://www.cnblogs.com/lianyingteng/p/7755545.html
版權(quán)聲明:本文為CSDN博主「xiayto」的原創(chuàng)文章,遵循CC 4.0 by-sa版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/xiayto/article/details/84730009

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容