one-hot(独热)、bag of word(词袋)、word-Embedding(词嵌入)浅析
目錄
詞袋模型
one-hot
word-embedding
我們知道,傳統的數據挖掘任務面向的是結構化數據。結構化數據很好理解,就是很有結構的數據嘛。
比如下面這張銀行客戶數據庫中的表格:
| 編號 | 姓名 | 年齡 | 年收入 | 職業 | 有無欠貸 |
| 01 | 夕小瑤 | 16(就好了) | 100 | 學生 | 無 |
| 02 | 王大錘 | 40 | 1,000,000 | 副總裁 | 有 |
| 03 | 吳名 | 30 | 200,000 | 程序員 | 無 |
而基于上述歷史信息來完成某項數據挖掘任務的話,每一維度的特征很明確,表格的每一列,或者說每個屬性(attribute)就是一個特征。因此每一個樣本,即每一行就可以輕松的表示為一個特征向量。
但是我們知道,自然語言文本是非結構化的。因此基于自然語言文本的數據挖掘任務,也就是文本挖掘任務,該如何下手呢?或者說,如何從文本中抽象出機器學習算法認識的特征向量呢?
詞袋模型
一個很容易想到的是,將自然語言文本的每個詞作為一個特征。因此對應的特征向量即這些特征的組合。這種思路雖然na?ve,但是很有效哦。基于這種思想的模型就是詞袋模型(Bag of Words),也叫向量空間模型(Vector Space Model)。
?
有了詞袋模型后,每個特征(即每個詞)的值該如何定義呢?或者說每個詞該如何編碼呢?如何進一步生成我們需要的特征向量呢?
one-hot
?
同樣一個很naive的想法就是:設詞典的大小為n(詞典中有n個詞),假如某個詞在詞典中的位置為k,則設立一個n維向量,第k維置1,其余維全都置0。這個思想就是one-hot編碼,中文叫獨熱編碼(茫茫0海中有一個1,不就是孤獨的熱點嗎)。
比如這里有三句話,即三個樣本:
“我喜歡你”;
“你喜歡你的狗狗”;
“你是狗狗”。
假設已經分詞完成,那么如果我們要從這三個樣本中挖掘信息的話,根據詞袋模型的思想:
首先就要將這些句子中出現過的詞構建一個詞典。這個詞典依次包含[我,喜歡,你,的,是,狗狗]這六個詞。根據one-hot編碼,“我”就會被編碼為[1,0,0,0,0,0],而“喜歡”就被編碼為[0,1,0,0,0,0],以此類推。
那么如何繼續推進,利用one-hot編碼來生成特征向量呢?
一個樣本的特征向量即該樣本中的每個單詞的one-hot向量直接相加。這三個樣本的特征向量便會表示為:
我喜歡你:[1,1,1,0,0,0]
你喜歡你的狗狗:[0,1,2,1,0,1]
你是狗狗:[0,0,1,0,1,1]
其中,第二個句子中“你”出現了兩次,因此第三維的值為2。但是注意一下,在有的機器學習模型,比如貝努利分布的樸素貝葉斯模型中,僅考慮每個詞出現與否,此時第二個句子的詞袋模型就變成了[0,1,1,1,0,1]。
看,特征向量構建完成啦,剩下的就交給機器學習吧~
但是這樣的話,仔細一想,好像麻煩挺大的。比如涉及到的單詞很多時,詞典會變得超大,動輒幾千上萬維。因此每個樣本的特征向量也會變得極其稀疏(大部分維度的值為0),這么高的維數對于很多機器學習模型比如神經網絡,那簡直是訓練的災難吶。
再一想,好像更不合理。因為這樣編碼的話,還忽略了單詞的語義!比如明明“喵星人”和“貓”是同一個意思,卻被編碼成了兩個不同的詞。
有沒有辦法同時解決上述這兩個問題呢?
?
word-embedding
解決方案就是word-embedding,中文叫詞向量,也叫詞嵌入。實質就是將單詞編碼成低維實數向量。(專業的說法是將單詞映射到一個低維空間,就像一個嵌入的過程,因此叫word-embedding)
比如“狗”或許會被編碼成[0.192, 0.221, -0.442, ...],一般來說維度會控制在500維以下,幾十維也是常有的。但是一般不會上升到千維。
那么怎么表示單詞之間的語義關系呢?其實將每個詞映射到低維向量空間后就很明朗啦。比如我們的詞向量限制為2維。那么詞“貓”、“狗”、“開心”、“驚訝”、“手機”映射成詞向量后在向量空間中可能是這樣子的:
可以看到,“狗”和“貓”都是動物,語義相近,因此具有很小的夾角,同理還有“開心”和“驚訝”。而“狗”和“手機”這兩個關系不大的詞語便會有很大的夾角。這種度量夾角來計算向量之間距離的專業說法叫計算余弦相似度。
合格的詞向量除了在語義上相近會被編碼到鄰近的區域,還應該支持簡單的語義運算,將語義運算映射為向量運算。比如:
“中國”+“首都”=“北京”;
“王子”-“公主”=“男”-“女“;
在向量空間看起來是類似這個樣子的
看,有了詞向量這么智能的編碼方法,是不是感覺用它來做文本挖掘的信心強了很多呢?
?
雖然詞向量很智能,然而詞向量的生成并不是一件容易的事情。至今如何訓練高精度的詞向量依然是NLP、IR領域的熱門topic,也是深度學習在NLP領域的一個應用重點(小夕悄悄告訴你,其實目前來看,關于詞向量的生成,淺層神經網絡跟深度神經網絡的效果差不多)。如果有喵喵對詞向量的生成產生了極大的興趣,又具備足夠的機器學習,尤其是神經網絡的基礎的話,可以Google一下下面小夕推薦的論文:
?
1、Yoshua Bengio, Rejean Ducharme, Pascal Vincent, and Christian Jauvin.?A neural probabilistic language model. Journal of Machine Learning Research (JMLR),3:1137–1155, 2003
2、Turian Joseph, Lev Ratinov, and Yoshua Bengio.?Word representations: a simple and general method for semi-supervised learning. Proceedings of the 48thAnnual Meeting of the Association for Computational Linguistics (ACL). 2010
3、MikolovT, Sutskever I, Chen K, et al. Distributed representations of words and phrases and their compositionality[C]//Advancesin neural information processing systems. 2013: 3111-3119.
4、Mikolov T, Chen K, Corrado G, et al. Efficient estimation of word representations in vector space[J]. arXiv preprintarXiv:1301.3781, 2013.
?
總結
以上是生活随笔為你收集整理的one-hot(独热)、bag of word(词袋)、word-Embedding(词嵌入)浅析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 预训练卷不动,可以卷输入预处理啊!
- 下一篇: 写了一篇关于 NLP 综述的综述!