深度學習當下炙手可熱,但大部分集中在圖片識別,視頻識別領(lǐng)域。前兩年google開源的word2vec可看做深度學習在NLP文本領(lǐng)域的一大應用,無監(jiān)督,簡法,優(yōu)雅,效果良好。 無論是圖像識別,還是視頻識別,語音還是文本,都需要數(shù)學符號化,計算機才可以處理。詞向量就是把文本里的詞向量化的一種表示。 文本最簡單的處理方式是one-hot,中文叫“獨熱編碼”,比如:
就是按詞表的長度,只有一個1,其余都為0的表示方式。這種方式傳統(tǒng)機器學習(SVM,CRF),或深度學習都可以很好處理。 但有兩個缺陷:一是維數(shù)太高,二是詞語的孤立表示,話筒和麥克也沒什么關(guān)系,它們之間在語義上其實是很近。 它的改進方案就是詞的分布式表示,比如: [0.792, ?0.177, ?0.107, 0.109, ?0.542, ...] 這種向量維度可就是幾十幾百,這是hinton在1986年提出的表示方式,但如何得到這樣的向量,有許多訓練方法,word2vec就是其中之一。每個詞是空間中的一個向量表示,也就是一個高維的點,點與點之間是有距離的,距離(歐式距離或cos值)越近的,在語義上也越相近。 語言模型是個比較模糊的概念,傳統(tǒng)有專家系統(tǒng)的形式去表征語言模型,幾十年基本沒有進展,后來改用統(tǒng)計模型才有了很大進步。 大概簡單理解一下,”大家喜歡吃蘋果“這句話是正常自然語言的概率有多大,按統(tǒng)計理論可以展開如下: P(大家,喜歡,吃,蘋果)=p(大家)p(喜歡|大家)p(吃|大家,喜歡)p(蘋果|大家,喜歡,吃) 但問題在于,這個公式雖然簡單,但這么展開下去,維度非常高,普通計算機是無法承受的,也就是計算上不可行的,比如中文有幾千詞匯,這樣排列組合一下,計算量太大了。 后來就有了“N-gram”的簡化。就是只算這個詞前邊的n-1個詞就好了。一般也就是2-gram,google的算力也就3-gram。 假設詞表是20000個詞,那表計算量如下: 這里對所有詞是一視同仁的,只考慮位置。但又有人提出“n-pos”問題,就是考慮當前詞的詞性,然后再分別考慮不同的概率,當然都是很好的研究。 思路清楚了,那下面就是建模和實現(xiàn)了。 google實現(xiàn)的版本,采用了兩個模型:CBOW(連續(xù)詞袋模型)和skip-gram。這里要致謝一下這個圈子里的大神。 gensim里有一個python的實現(xiàn),后面有時間,我們可以用tensorflow自己實現(xiàn)一遍,加深理解,我們先使用gensim里的word2vec來訓練自己的行業(yè)word2vec。 gensim里的word2vec使用是非常簡單的,我們準備好語料,中文用空格分好詞即可。word2vec會遍歷兩輪素材,一輪是建詞表,第二輪才是訓練。 import gensim 關(guān)于作者:魏佳斌,互聯(lián)網(wǎng)產(chǎn)品/技術(shù)總監(jiān),北京大學光華管理學院(MBA),特許金融分析師(CFA),資深產(chǎn)品經(jīng)理/碼農(nóng)。偏愛python,深度關(guān)注互聯(lián)網(wǎng)趨勢,人工智能,AI金融量化。致力于使用最前沿的認知技術(shù)去理解這個復雜的世界。 |
|