word2vec是Google在2013年開源的一個工具,核心思想是將詞表徵映
射爲對應的實數向量。算法
目前採用的模型有一下兩種工具
項目連接:https://code.google.com/archive/p/word2vec學習
詞向量就是用來將語言中的詞進行數學化的一種方式,顧名思義,詞向量
就是把一個詞表示成一個向量。這樣作的初衷就是機器只認識0 1 符號,換句話說,在天然語言處理中,要想讓機器識別語言,就須要將天然語言抽象表示成可被機器理解的方式。因此,詞向量是天然語言到機器語言的轉換。優化
詞向量有一下兩種google
向量的長度爲詞典的大小,向量的份量只有一個 1,其餘全爲 0, 1 的位置對應該詞在詞典中的位置,例如spa
「話筒」表示爲 [0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 ...]翻譯
「麥克」表示爲 [0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 ...]code
優勢: 若是使用稀疏方式存儲,很是簡潔,實現時就能夠用0,1,2,3,...來表示詞語進行計算,這樣「話筒」就爲3,「麥克」爲8.three
缺點:1.容易受維數災難的困擾,尤爲是將其用於 Deep Learning 的一些算法時;2.任何兩個詞都是孤立的,存在語義鴻溝詞(任意兩個詞之間都是孤立的,不能體現詞和詞之間的關係)。ip
最先是 Hinton 於 1986 年提出的,能夠克服 one-hot representation的缺點。解決「詞彙鴻溝」問題,能夠經過計算向量之間的距離(歐式距離、餘弦距離等)來體現詞與詞的類似性
。
其基本想法是直接用一個普通的向量表示一個詞,這種向量通常長成這個樣子:[0.792, −0.177, −0.107, 0.109, −0.542, ...],常見維度50或100。
優勢:解決「詞彙鴻溝」問題
缺點:訓練有難度。沒有直接的模型可訓練獲得。因此採用經過訓練語言模型的同時,獲得詞向量 。
固然一個詞怎麼表示成這麼樣的一個向量是要通過一番訓練的,訓練方法較多,word2vec是其中一種。值得注意的是,每一個詞在不一樣的語料庫和不一樣的訓練方法下,獲得的詞向量多是不同的。
詞向量在機器翻譯領域的一個應用,就是google的TomasMikolov 團隊開發了一種詞典和術語表的自動生成技術,該技術經過向量空間,把一種語言轉變成另外一種語言,實驗中對英語和西班牙語間的翻譯準確率高達90%。
論文http://arxiv.org/pdf/1309.4168.pdf在介紹算法工做原理的時候舉了一個例子:考慮英語和西班牙語兩種語言,經過訓練分別獲得它們對應的詞向量空間 E 和 S。從英語中取出五個詞 one,two,three,four,five,設其在 E 中對應的詞向量分別爲 v1,v2,v3,v4,v5,爲方便做圖,利用主成分分析(PCA)降維,獲得相應的二維向量 u1,u2,u3,u4,u5,在二維平面上將這五個點描出來,以下圖左圖所示。相似地,在西班牙語中取出(與 one,two,three,four,five 對應的) uno,dos,tres,cuatro,cinco,設其在 S 中對應的詞向量分別爲 s1,s2,s3,s4,s5,用 PCA 降維後的二維向量分別爲 t1,t2,t3,t4,t5,將它們在二維平面上描出來(可能還需做適當的旋轉),以下圖右圖所示:
觀察左、右兩幅圖,容易發現:五個詞在兩個向量空間中的相對位置差很少,這說明兩種不一樣語言對應向量空間的結構之間具備類似性,從而進一步說明了在詞向量空間中利用距離刻畫詞之間類似性的合理性。
語言模型其實就是看一句話是否是正常人說出來的。意義在於機器翻譯、語音識別獲得若干候選以後,能夠利用語言模型挑一個儘可能靠譜的結果。在 NLP 的其它任務裏也都能用到。
用數學符號描述爲:給定一個字符串"w1,w2,...,wt",計算它是天然語言的機率P(w1,w2,…,wt)。w1到wT 依次表示這句話中的各個詞。有個很簡單的推論是:
\[{\rm{p}}\left( s \right) = {\rm{p}}\left( {{w_1},{w_2}, \cdots {w_T}} \right) = {\rm{p}}\left( {{w_1}} \right){\rm{p(}}{w_2}{\rm{|}}{w_1}){\rm{p}}({w_3}|{w_1},{w_2}) \cdots {\rm{p}}({w_t}|{w_1},{w_2}, \cdots {w_{T - 1}})\]
上面機率公式的意義爲:第一次詞肯定後,看後面的詞在前面次出現的狀況下出現的機率。
例如,有個句子「你們喜歡吃蘋果」,一共四個詞"你們,喜歡,吃,蘋果"
P(你們,喜歡,吃,蘋果)=p(你們)p(喜歡|你們)p(吃|你們,喜歡)p(蘋果|你們,喜歡,吃)
p(你們)表示「你們」這個詞在語料庫裏面出現的機率;
p(喜歡|你們)表示「喜歡」這個詞出如今「你們」後面的機率;
p(吃|你們,喜歡)表示「吃」這個詞出如今「你們喜歡」後面的機率;
p(蘋果|你們,喜歡,吃)表示「蘋果」這個詞出如今「你們喜歡吃」後面的機率。
把這些機率連乘起來,獲得的就是這句話平時出現的機率。
若是這個機率特別低,說明這句話不常出現,那麼就不算是一句天然語言,由於在語料庫裏面不多出現。若是出現的機率高,就說明是一句天然語言
爲了表示簡單,上面的公式用下面的方式表示
\[{\rm{p}}\left( {\rm{s}} \right) = {\rm{p}}\left( {{w_1},{w_2}, \cdots {w_T}} \right) = \prod \limits_{i = 1}^T p({w_i}|Contex{t_i})\]
其中,若是Contexti是空的話,就是它本身p(w),另外如「吃」的Context就是「你們」、「喜歡」,其他的對號入座。
現有模型有
接下來講 \(p({w_i}|Contex{t_i})\) 的計算方法,上面看的是跟據這句話前面的全部詞來計算,這樣計算就很複雜,像上面那個例子得掃描四次語料庫,這樣一句話有多少個詞就得掃描多少趟。語料庫通常都比較大,越大的語料庫越能提供準確的判斷。這樣計算開銷太大。
能夠想到的優化方法就是提早將\(p({w_i}|Contex{t_i})\) 提早算好了,那麼根據排列組上面的來算,對於一個只有四個詞的語料庫,總共就有4!+3!+2!+1!個狀況要計算,那就是24個狀況要計算;換成1000個詞的語料庫,就是 \( \sum \limits_{i = 1}^{1000} i!\)個狀況須要統計,對於計算機來講,這根本不可能。
因此誕生了N-gram模型是大詞彙連續語音識別中經常使用的一種語言模型,對中文而言,咱們稱之爲漢語語言模型(CLM, Chinese Language Model)。漢語語言模型利用上下文中相鄰詞間的搭配信息,在須要把連續無空格的拼音、筆畫,或表明字母或筆畫的數字,轉換成漢字串(即句子)時,能夠計算出最大機率的句子,從而實現從到漢字的自動轉換,無需用戶手動選擇,避開了許多漢字對應一個相同的拼音(或筆畫串、數字串)的重碼問題。
咱們給定一個詞,而後猜想下一個詞是什麼。當我說「豔照門」這個詞時,你想到的下一個詞時什麼?我想你們頗有可能會想到「陳冠希」,基本上不會有人想到「陳志傑」吧。N-Gram模型的主要思想就是這樣的。
上面的context都是這句話中這個詞前面的全部詞做爲條件的機率,N-gram就是隻管這個詞前面的n-1個詞,加上它本身,總共n個詞,計算\(p({w_i}|Contex{t_i})\)只考慮用這n個詞來算,換成數學的公式來表示,就是 \(
{\rm{p}}\left( {{w_i}{\rm{|}}Contex{t_i}} \right) = {\rm{p}}({w_i}|{w_{i - n + 1}},{w_{i - n + 2}}, \cdots ,{w_{i - 1}}) \)
通常來講,n取2或者3
假設詞表中詞的個數 |V| = 20,000 詞,那麼有下面的一些數據。
照圖中的數據看去,取n=3是目前計算能力的上限了。在實踐中用的最多的就是bigram和trigram了,並且效果也基本夠了。
若是一個詞的出現僅依賴於它前面出現的一個詞,那麼咱們就稱之爲bigram。即
P(T) = P(W1W2W3…Wn)=P(W1)P(W2|W1)P(W3|W1W2)…P(Wn|W1W2…Wn-1)≈P(W1)P(W2|W1)P(W3|W2)…P(Wn|Wn-1)
若是一個詞的出現僅依賴於它前面出現的兩個詞,那麼咱們就稱之爲trigram。
那麼咱們怎麼獲得P(Wn|W1W2…Wn-1)呢?一種簡單的估計方法就是最大似然估計(Maximum Likelihood Estimate)了。即P(Wn|W1W2…Wn-1) = (C(W1 W2…Wn))/(C(W1 W2…Wn-1))
下面咱們用bigram舉個例子。假設語料庫總詞數爲13,748
P(I want to eat Chinese food)
=P(I)P(want|I)P(to|want)P(eat|to)P(Chinese|eat)*P(food|Chinese)
=0.251087/3437786/1215860/325619/938*120/213
=0.000154171
N-gram模型也會有寫問題,總結以下:
一、n不能取太大,取大了語料庫常常不足,因此基本是用降級的方法
二、沒法建模出詞之間的類似度,就是有兩個詞常常出如今同一個context後面,可是模型是無法體現這個類似性的。
三、有些n元組(n個詞的組合,跟順序有關的)在語料庫裏面沒有出現過,對應出來的條件機率就是0,這樣一整句話的機率都是0了,這是不對的,解決的方法主要是兩種:平滑法(基本上是分子分母都加一個數)和回退法(利用n-1的元組的機率去代替n元組的機率)
該博文主要是前段時間學習word2vec的一個總結,大部分都是網上資料,主要是作了個整理。算是作個備份,方便之後複習之類的。在此感謝前輩們的資料~~~
該部分僅僅回顧一些基本概念和背景知識,明天繼續更。