1. 程式人生 > >NLP自然語言處理

NLP自然語言處理

# NLP ## 應用例子 - 垃圾郵件過濾 Spam Filtering - 機器翻譯 Machine Translation - 資訊檢索 Information Retrieval - 問答系統 Question Answering - 資訊提取 Information Extraction - 內容摘要 Summarization - 情感分析 Sentiment Analysis - 命名實體識別 Entity Recognition ## 核心技術 - 語言模型 Language modelling - 分詞 Segmentation ``` 它|是|一隻|老虎 ``` - 詞性標註 Part-of-speech tagging ``` DT VBX DT JJ NN This is a simple question. ``` - 句法分析 Syntactic parsing ![nlp-Syntactic-parsing](http://upload-images.jianshu.io/upload_images/24077087-4f2ad9f1ce189caf.PNG) - 命名實體識別 Name-entity recognition - 語義角色標註 Word sanseis ambiguation ## 例子 ![nlp-example](http://upload-images.jianshu.io/upload_images/24077087-3fca9d834a287e24.PNG) ## 自然語言處理技術歷史 ### 基於邏輯(集合論)的模型 #### 例子 ``` 所有人都會死 蘇格拉底是人 =》 蘇格拉底會死 ``` #### 基本法則 - a is b && b is c => a is c - a = not (not a) - a is b => not b is not a - P->Q => not P || Q =》not (P && not Q) #### 模糊集合論 ![nlp-fuzzy-logic](http://upload-images.jianshu.io/upload_images/24077087-a638fb90ddae245e.PNG) #### 集合論的缺陷 羅素悖論:由所有不包含自身的集合構成的集合 例子:理髮師稱只給那些不給自己理髮的人理髮。 基於集合論,理髮師無論給自己理髮還是不給自己理髮都是矛盾的。 ***因此集合論不是完備的。***即使後面馮羅伊德等科學家提出了各種假定條件。 #### 為什麼集合論不能適用於自然語言 - 自然語言不是嚴格的邏輯 - 句子的組成規則鬆散 - 日常用語常常有語法錯誤,但人依然可以正確的交流 - 即使自然語言用規則來描述,但是規則的數量非常龐大,無法完全適用邏輯程式設計把所有的場景都覆蓋 - 語言的二義性 - apple => computer/phone/fruit - host => n or v - I saw a man with a telescope - 同一個意思可以有很多種表達 ### 基於概率的模型 由於上述的原因,集合率無法很好的描述自然語言,科學家發現通過概率模型可以更好的描述自然語言。 #### 前一百個單詞適用的頻率和排名的曲線 ![nlp-zipf-law](http://upload-images.jianshu.io/upload_images/24077087-9334c0879f0e7e9e.PNG) #### 深度學習 深度學習來處理自然語言屬於概率模型 ## 涉及數學的知識 ### 函式 ![nlp-function](http://upload-images.jianshu.io/upload_images/24077087-187c77952dc19bf0.PNG) - y=x^2 ![nlp-x2](http://upload-images.jianshu.io/upload_images/24077087-7e4cc29b11210570.PNG) - y=2x^3-14x^2+24*x ![nlp-x3](http://upload-images.jianshu.io/upload_images/24077087-1b970676766cfd9f.PNG) - y=sin(x) ![nlp-sin](http://upload-images.jianshu.io/upload_images/24077087-6236d6f0265cd3cd.PNG) - 高維函式 ![nlp-gaojie](http://upload-images.jianshu.io/upload_images/24077087-e59e515d20f06a26.PNG) - y=e^x ![nlp-ex](http://upload-images.jianshu.io/upload_images/24077087-d56f345040ab41f2.PNG) - y=log(x) ![nlp-log](http://upload-images.jianshu.io/upload_images/24077087-0fb55be40eae1d80.PNG) - y=1/(1+e^(-z)) ![nlp-simog](http://upload-images.jianshu.io/upload_images/24077087-db9cfe44b18b8819.PNG) - y=max(0, x) ![nlp-relu](http://upload-images.jianshu.io/upload_images/24077087-5f493353aa63bc66.PNG) - L1: ||x|| = |x1| + |x2| ![nlp-L1](http://upload-images.jianshu.io/upload_images/24077087-4531183737d8da07.PNG) - L1正則化解析 ![nlp-L1+F](http://upload-images.jianshu.io/upload_images/24077087-90182e6abbb8f0d8.PNG) 證明最小點位於座標軸上 h = f+c|x| 由於在x = 0處不可導 h-left'(0)\*h-right'(0) = (f'+c)\*(f'-c) 那麼如果c>|f'(0)|可得,h在0處左右導數異號 0是最值。 **那麼在損失函式加入L1正則化後,可以得到某些維度容易為0,從而得到稀疏解** - L2: |x||2 = (|x1|^2 + |x2|^2)^(1/2) ![nlp-l2](http://upload-images.jianshu.io/upload_images/24077087-eddfda72f8474086.PNG) - L2正則化,類似於L1的證明,**容易得到比較平均的w,各個w都比較靠近0,從而得到更光滑的曲線** ### 矩陣 ![nlp-tensor](http://upload-images.jianshu.io/upload_images/24077087-046ef5dc3ade43be.PNG) - SVD ![nlp-svd](http://upload-images.jianshu.io/upload_images/24077087-5658835ef7a0991b.PNG) - Jacobian矩陣 矩陣的一階導數 - Hessian矩陣 矩陣的二階導數 ### 凸包和凸函式 幾乎所有的最優化手段,都將適用凸優化演算法來解決 ### 概率 #### 條件概率 P(A|B) = P(A and B) / P(B) if A and B 獨立 =》P(A and B| C) = P(A|C)*P(B|C) 也可以推出 =>A(A|B and C) = P(A|C) (B交C不為空) #### 二項分佈 拋9次硬幣,硬幣出現正面的概率是0.5,出現k次的概率分佈如下如 ![nlp-binomial](http://upload-images.jianshu.io/upload_images/24077087-da921f17e3ff517d.PNG) 服從正態分佈 #### 期望 x的平均值 E = x*p(x) + ... #### 方差 x相對於期望的偏離 var = (x-E(x))^2 #### 協方差 conv = (x - E(x))*(m - E(m)) 描述x,m是否有同分布 按理協方差為0,並不代表x和m沒有關係 例如下圖 ![nlp-conv](http://upload-images.jianshu.io/upload_images/24077087-6e39adc7cca27578.PNG) 如果點的分佈對稱的分佈,會得到協方差為0,但是其實他們是有關係的。 #### 聯合概率 把每個相關的概率累加,得到聯合概率 #### 多項式分佈 P(x1=m1,x2=m2...) = n!\*P1^m1/m1!\*P2^m2/m2! #### 伽馬函式 T(n) = (n-1)! **T(x)用一條曲線逼近n!,進而可以求得非整數的階乘** #### beta分佈 由二項式分佈推出 P = T(a+b)\*x^(a-1)\*(1-x)^(b-1)/(T(a)*T(b)) ![nlp-beta](http://upload-images.jianshu.io/upload_images/24077087-7b9a066cc1b399f5.PNG) #### 泊松分佈 ![nlp-posson](http://upload-images.jianshu.io/upload_images/24077087-78b779c6776e2656.PNG) #### 高斯分佈 則正態分佈 ![nlp-guess](http://upload-images.jianshu.io/upload_images/24077087-a3551b91a74ec21f.PNG) #### 對數正態分佈 ![nlp-log-gra](http://upload-images.jianshu.io/upload_images/24077087-48e8a70ed0fc15c4.PNG) #### 指數分佈 ![nlp-exp](http://upload-images.jianshu.io/upload_images/24077087-83dccae5c7dea0ed.PNG) ## 語言 ### 資訊嫡 ![nlp-infoEntropy](http://upload-images.jianshu.io/upload_images/24077087-4245cd8fe927afef.PNG) ![nlp-infoEntropy-gra](http://upload-images.jianshu.io/upload_images/24077087-a265d2365cfae11b.PNG) **p分佈越平均,H越大,代表越不確定** ### 交叉嫡 ![nlp-crossinfoentro](http://upload-images.jianshu.io/upload_images/24077087-d7bb90943f886668.PNG) y為0時,不考慮y‘。y為1時,y'越接近1,越小,越靠近0,越大 **把D最小化,迫使y'逼近y** ### auto-encoder ![nlp-auto-encoder](http://upload-images.jianshu.io/upload_images/24077087-f81dd570f0deda2f.PNG) ### 語言概率模型 對於一個句子,有若干單片語成。例如 C1: The dog laughs. C2: He laughs. 那麼計算P(C1) = P(The, Dog, laughs)的概率和P(C2) = P(He, laughs)的概率。 根據歷史文字的統計學習。 可以得到P(C1)<) = 頻率/總單詞數 ##### 情感分析 計算一篇文章是積極的還是消極的。 P(y|x) = sigmod(wx) x是文章內每個單詞的頻率 y表示積極和消極情感 #### n-gram模型 ``` P(x1, x2, x3 ... ) = P(x1)*P(x2|x1)*P(x3|x1, x2)....*P(xn|x1, x2,...xn-1) ``` 其中P(xk|x1, x2,..xk-1) = frequence(x1, x2 ,, xk)/frequence(x1, x2..xk-1) > n一般不能太大,因為n太大,會導致全文無法找到一摸一樣的單詞組合,導致概率為0 **2-gram模型例子** ``` P('The dog sleeps') = P(The)*P(dog|the)*P(sleeps|dog) ``` ##### Interpolation 把多個gram的模型進行線性整合 ![nlp-interpolation](http://upload-images.jianshu.io/upload_images/24077087-0a613bc3999778bf.PNG) #### 語言模型評價 ##### 交叉嫡 ![nlp-cross-langues](http://upload-images.jianshu.io/upload_images/24077087-d68f89fdf98f5d1f.PNG) **H越小,Pxn越接近1,模型越好** ##### Perplexity ![nlp-perplexity](http://upload-images.jianshu.io/upload_images/24077087-d6736dc0a730e6af.PNG) #### 貝葉斯進行郵件分類 P(y|x1, x2, .. xn) = P(y)\*P(x1, x2, ... xn|y) / P(x1, x2, ... xn) y代表是否是垃圾郵件 x代表單詞 #### 分詞 廣州市長壽路 -》 廣州市長|壽路 廣州市長壽路 -》 廣州市|長壽路 匹配詞袋:廣州市,廣州市長,長壽路 使用最大匹配發,第二個分詞更優 ##### 使用N-gram模型計算分詞 ``` P(結合成分子) option1: = P(分子|成)P(成|結合)P(結合) option2: = P(分子|合成)P(合成|結)P(結) optionn .... ``` 通過統計P(A|B),得出各個option的概率,取最大的概率,則為最後的分詞 #### 詞表示 ##### one-hot encoding word => [0, 0 , ... 1, ... 0] ##### 附近詞encoding word => [0, 1, 0, 1, 0, ...] 可以解決詞相似性問題 ##### 附近詞帶權重encoding 計算附近詞的頻率 word => [0, 3, 0, 1, 0, ...] ##### C&W ![nlp-cw](http://upload-images.jianshu.io/upload_images/24077087-1e7d97faef02cb12.PNG) w是附近詞的one-hot encoding score是詞的one-hot encoding 最後一層通過softmax,取擬合文字 **最終中間層則為詞向量** ##### skip-gram ![nlp-skip-gram](http://upload-images.jianshu.io/upload_images/24077087-134153c53fa783da.PNG) 輸入為詞one-hot encoding 輸出為附近此的one-hot encoding 最後通過softmax預測附近詞 **最後中間層則為結果詞向量** #### 詞性標註 ![nlp-word-tagging](http://upload-images.jianshu.io/upload_images/24077087-f572a930adb1b999.PNG) ##### 混合模型 混合模型是一種統計模型,問題中包含若干個子問題,每個子問題是一個概率分佈,那麼總問題就是若干個子問題的組合,也就是若干個子分部的組合,這樣就形成了混合模型。 ###### 例子 有紅黑兩種硬幣,把它們放在盒子裡,從盒子裡隨機抽取一個硬幣並投幣,抽到紅色的概率是p,紅色硬幣正面的概率是q,黑色硬幣正面的概率是m,假設我們沒辦法看到抽取出的硬幣的顏色,只能看到最終是正面或者反面的結果,例如HTTHTTTTHHH (H:正面 T: 反面)。需要估計p,q,m三個引數。 此時可以計算出 | w | 紅 | 黑 | | ---- | ---------- | -------------- | | 正 | pq = a | (1-p)m = b | | 反 | p(1-q) = c | (1-p)(1-m) = d | 通過EM演算法迭代如下: 隨機p q m 迭代以下過程: 計算上面table p = (aC(正)+cC(反))/total q = aC(正)/(aC正+cC正) m = bC(正)/(bC正 + dC正) ##### 高斯混合模型 ![nlp-guessmix](http://upload-images.jianshu.io/upload_images/24077087-c6f294e709079b4b.PNG) 假設有上述資料,需要用混合模型來逼近,通過分析,紅色和藍色資料分別為高斯正態分佈,N(u, v) 此時可以得到如下表 | | 紅 | 藍 | | ---- | ---------- | -------------- | | x | pN紅(u, v) | (1-p)N藍(u, v) | p = pN紅x/(pN紅x+(1-p)N藍x) u = pN紅x/n v = pN紅(x-u)^2/n ##### 隱馬爾可夫模型 ![nlp-hmm](http://upload-images.jianshu.io/upload_images/24077087-873e83cc15314247.PNG) 詞性轉換概率 | | V | N | | ---- | ------- | ------- | | V | P(V\|V) | P(N\|V) | | N | P(V\|N) | P(N\|N) | 詞性到單詞的轉換概率 | | go | home | | ---- | -------- | ---------- | | V | P(go\|V) | P(home\|V) | | N | P(go\|N) | P(home\|N) | 通過EM遞迴演算法,訓練以上引數,得到隱馬爾可夫模型 PLSA主題模型 #### 主題模型 ##### 作用 - 通過抽象出文檔的主題,可以通過比較主題向量的相似性,得到不同文件之間的相似性 - 得到主題向量,相當於把文件去掉了噪聲干擾 - 得到文件向量,可以進行其他模型的輸入,進而對文件進行分類,迴歸等操作,得到更豐富的結果 ##### 詞袋模型 只統計詞的頻率,不計算詞的相對位置 ##### LSA模型 計算文件和單詞頻率的矩陣 | | w1 | ... | wn | | ---- | ---- | ---- | ---- | | doc1 | 3 | ... | 0 | | doc2 | 1 | ... | 5 | | ... | ... | ... | ... | | docn | 0 | ... | 0 | 進行奇異矩陣分解 ![nlp-svd](http://upload-images.jianshu.io/upload_images/24077087-902bde1491f0e76b.PNG) 得到A矩陣的壓縮U,U中的k則為k個主題 ##### PLSA模型 通過分析,LSA得到的主題是跟現實無法關聯,它只是一個量,而沒有明顯的意義。 PLSA為了解決此問題,引入概率模型,先確定主題個數 然後通過構建Doc->topic的概率table,和topic->word的概率table。 然後通過EM模型,得到這兩個table的所有概率值。 進而得到文件的主題表示 ##### LDA模型 PLSA的缺陷是,對於預測未知的doc,無法計算此文件的相關概率。隨著doc數量的增加,PLSA模型的引數會線性增加,從而會造成過擬合。 LDA通過引入先驗概率來克服PLSA的問題。 ![nlp-lda](http://upload-images.jianshu.io/upload_images/24077087-36e11da823823e95.PNG) #### 上下文無關句法 ##### CFG | S -> NP VP | | ------------------------------------------ | | VP -> Vi
VP -> Vt NP
VP -> VP PP | | NP -> DT NN
NP -> NP PP | 類似於編譯原理的上下文無法句法分析,一顆語法樹 ##### PCFG 通過對CFG引入概率引數 | S -> NP VP | 1 | | ----------- | ---- | | VP -> Vi | P1 | | VP -> Vt NP | P2 | | VP -> VP PP | P3 | | NP -> DT NN | P4 | | NP -> NP PP | P5 | ###### 評估句子 有了概率,可以計算每顆語法樹的極大似然概率,並取最大概率的樹為最終輸出 #### RNN ![nlp-rnn](http://upload-images.jianshu.io/upload_images/24077087-f627bd40368851b0.PNG) 上一個狀態中間層的輸出作為下一隱層的輸入 類似於HMM的2-gram模型。t狀態受到t-1時刻輸出的影響,受t-k的輸出的k越大,影響越小 #### LSTM 由於RNN幾乎只受到上一時刻的影響,而忽略了久遠資訊的影響。從而造成了一定的侷限性。 LSTM通過引入長短記憶方法,來維持長記憶的資訊。 ![nlp-lstm](http://upload-images.jianshu.io/upload_images/24077087-ebb131dab441bf42.PNG) - 遺忘門:上一刻的輸出,會乘以一個sigmod的輸出,sigmod的輸出,決定了上一時刻的輸出會保留多少到下一時刻。 - 輸入門:通過對xt進行tanh處理,並進行輸出,通過一個sigmod函式,決定t時刻有保留多少流向下一時刻 - 輸出門:把遺忘門的輸出和輸入門的輸出進行累加並進行tanh處理,並對輸出進行sigmod處理,得到下一時刻的輸入 - 遺忘門和輸入們的輸出累加後,會直接透傳到下一時刻 通過訓練核內的sigmod函式,使得LSTM可以根據不同的句子,有條件的保留和過濾歷史資訊,從而達到長記憶的功能。 #### GRU ![nlp-gru](http://upload-images.jianshu.io/upload_images/24077087-6e25f8cef3bec495.PNG) GRU是LSTM的簡化版,它只需要處理兩個sigmod函式的訓練,而LSTM需要三個sigmod函式的訓練,減少了訓練的引數,加快了訓練的速度,但也損失了一部分模型的複雜,在處理較複雜問題時,沒有LSTM那麼好。 #### Encoder-Decoder ##### auto-encoder-decoder ![nlp-auto-encoder](http://upload-images.jianshu.io/upload_images/24077087-b4e1304ea6d9b35d.PNG) ##### Seq2Seq auto-encoder-decoder的特點是輸出的單元數是固定的。對於一般自然語言處理,例如機器翻譯,輸入的單元個數跟輸出單元的個數並不是一一對應的,此時就需要動態的生成輸出單元。Seq2Seq通過動態的輸出結束符,代表是否輸出完成,達到可以動態的根據輸入輸出不同的單元個數。 ![seq2seq](http://upload-images.jianshu.io/upload_images/24077087-cea1f9907bf32990.PNG) ![seq2seq-detail](http://upload-images.jianshu.io/upload_images/24077087-68caac5c464d3783.PNG) #### Attention Mechanism seq2seq的缺點是,所有的輸入序列都轉化為單一的單元c,導致很多資訊都將消失,對於不同的輸出yi,它可能依賴的輸入xj有可能不一樣,此時通過加入注意力模型,通過對xi進行softmax處理,並加入到y權重的訓練中,可以讓不同的y,有不同的x對它進行影響 ![nlp-attention](http://upload-images.jianshu.io/upload_images/24077087-b49dddf938f28141.PNG) ![nlp-attention-softmax](http://upload-images.jianshu.io/upload_images/24077087-46bfd26dc6aee3da.PNG) softmax的輸入為輸入單元x,和上一個輸出單元y,聯合產生softmax的權重,進而對不同的序列,對於同一個x,會有不同的注意力到輸出 #### Memory Network 記憶網路 #### Transformaer ##### self attention ![nlp-self-attention](http://upload-images.jianshu.io/upload_images/24077087-8d38e6e61a8412bc.PNG) ###### 引數說明 q = Wq(x) k = Wk(x) v = Wv(x) x為詞向量 ###### 原理 通過訓練,得到權重w,從而學習到這一層的softmax注意力引數 ##### multi-head-self-attention ![nlp-mult-head-self-attention](http://upload-images.jianshu.io/upload_images/24077087-de081b36fe1c5d0d.PNG) R是前一次encoder的輸出 通過增加w的數量,產生多個z,並進行堆疊,通過前饋網路,最後產生z ![nlp-self-attention-sample](http://upload-images.jianshu.io/upload_images/24077087-46c967d7f9934c85.PNG) ##### 位置編碼 在使用self attention處理句子時,是沒有考慮單詞在句子中的位置資訊的。為了讓模型可以加入考慮單詞的位置資訊,加入了位置編碼的向量 計算如下: ![nlp-positional-encoding](http://upload-images.jianshu.io/upload_images/24077087-71c2ec6b888fdf1d.PNG) pos為單詞在句子中的位置 i為詞向量的位置 d為句子的長度 位置編碼加上詞向量形成tranformer的輸入 ![nlp-word-add-position](http://upload-images.jianshu.io/upload_images/24077087-f76fb05385d6ea9a.PNG) ##### transformer總體架構 ![nlp-transformer](http://upload-images.jianshu.io/upload_images/24077087-4b471d4708e8eab1.PNG) ###### 編碼器的內部結構 ![nlp-transformer-coder](http://upload-images.jianshu.io/upload_images/24077087-87cfa9e4ab10ddc0.PNG) 加入了歸一化和殘差網路 最終通過softmax,輸出每個單詞的概率,並最終輸出單詞 ###### transformer內部結構 ![nlp-tranformer-2stack](http://upload-images.jianshu.io/upload_images/24077087-6402ee3f3ce4195f.PNG