筆記轉載於GitHub項目:https://github.com/NLP-LOVE/Introduction-NLPpython
第4章咱們利用隱馬爾可夫模型實現了第一個基於序列標註的中文分詞器,然而效果並不理想。事實上,隱馬爾可夫模型假設人們說的話僅僅取決於一個隱藏的{B.M,E,S序列,這個假設太單純了,不符合語言規律。語言不是由這麼簡單的標籤序列生成,語言含有更多特徵,而隱馬彌可夫模型沒有捕捉到。隱馬彌可夫模型能捕捉的特徵僅限於兩種: 其一,前一個標籤是什麼;其二,當前字符是什麼。git
爲了利用更多的特徵,線性模型( linear model )應運而生。線性模型由兩部分構成: 一系列用來提取特徵的特徵函數 φ,以及相應的權重向量 w。github
本章將深人講解感知機算法的原理,以及在分類和序列標註上的應用。在序列標註應用部分,咱們將實現基於感知機的中文分詞器。因爲感知機序列標註基於分類,而且分類問題更簡單,因此咱們先學習分類問題。算法
定義機器學習
分類指的是預測樣本所屬類別的一類問題。二分類也能夠解決任意類別數的多分類問題(one vs rest)。函數
將類型class1看做正樣本,其餘類型所有看做負樣本,而後咱們就能夠獲得樣本標記類型爲該類型的機率 p1。性能
而後再將另外類型class2看做正樣本,其餘類型所有看做負樣本,同理獲得 p2。學習
總之仍是以二分類來依次劃分,並求出最大機率結果。測試
應用優化
在NLP領域,絕大多數任務能夠用分類來解決。文本分類自然就是一個分類問題。關鍵詞提取時,對文章中的每一個單詞判斷是否屬於關鍵詞,因而轉化爲二分類問題。在指代消解問題中,對每一個代詞和每一個實體判斷是否存在指代關係,又是一個二分類問題。在語言模型中,將詞表中每一個單詞做爲一種類別,給定上文預測接下來要出現的單詞。
線性模型是傳統機器學習方法中最簡單最經常使用的分類模型,用一條線性的直線或高維平面將數據一分爲二。
直線將平面分割爲兩部分,分別對應男女。對於任何姓名,計算它落入哪一個區域,就能預測它的性別。這樣的區域稱爲決策區域,它們的邊界稱爲決策邊界。二維空間中,若是決策邊界是直線,則稱爲線性分類模型: Y = Wx + b。
若是是任意維度空間中的線性決策邊界統稱爲分離超平面
推廣到 D 維空間,分離超平面的方程爲:
\[\sum_{i=1}^{D} w_{i} x_{i}+b=0\]
其中,w 是權重,b 偏置(截距),能夠寫成向量的形式:
\[\hat{y}={sign}(w \cdot x)=\{\begin{array}{cc}{-1,} {w \cdot x \leqslant 0} \\ {1,} {w \cdot x>0}\end{array}\]
\[ \begin{aligned} &\boldsymbol{w}=\left[w_{1}, \cdots, w_{D}, b\right]\\ &x=\left[x_{1}, \cdots, x_{D}, 1\right] \end{aligned}\\ \hat{y}=\operatorname{sign}(\boldsymbol{w} \cdot \boldsymbol{x})=\left\{\begin{array}{cc} {-1,} & {\boldsymbol{w} \cdot \boldsymbol{x} \leqslant 0} \\ {1,} & {\boldsymbol{w} \cdot \mathbf{x}>0} \end{array}\right. \]
找出這個分離超平面其實就是感知機算法。感知機算法則是一種迭代式的算法:在訓練集上運行多個迭代,每次讀入一個樣本,執行預測,將預測結果與正確答案進行對比,計算偏差,根據偏差更新模型參數,再次進行訓練,直到偏差最小爲止。
這時候問題來了,假如數據自己線性不可分,感知機損失函數不會收斂,每次迭代分離超平面都會劇烈振盪。這時能夠對感知機算法打補丁,使用投票感知機或平均感知機。
投票感知機和平均感知機
投票感知機:每次迭代的模型都保留,準確率也保留,預測時,每一個模型都給出本身的結果,乘以它的準確率加權平均值做爲最終結果。
投票感知機要求存儲多個模型及加權,計算開銷較大,更實際的作法是取多個模型的權重的平均,這就是平均感知機。
解決人名性別分類的監督學習流程:
人名性別語料庫
筆者整理了一份人名性別語料庫 cnname
運行下面代碼後會自動下載。
預料格式爲逗號分隔的 .csv,第一列爲姓名,第二列爲性別:
趙伏琴,女 錢沐楊,男 孫竹珍,女 李潮陽,男
訓練
代碼詳見:classify_name.py
https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch05/classify_name.py
運行結果以下:
下載 http://file.hankcs.com/corpus/cnname.zip 到 /usr/local/lib/python3.7/site-packages/pyhanlp/static/data/test/cnname.zip 100.00%, 1 MB, 256 KB/s, 還有 0 分 0 秒 =====樸素感知機算法===== 訓練集準確率: P=85.44 R=85.06 F1=85.25 特徵數量: 9089 趙建軍=男 沈雁冰=男 陸雪琪=女 李冰冰=女 測試集準確率: P=82.85 R=82.90 F1=82.88 =====平均感知機算法===== 訓練集準確率: P=93.62 R=83.06 F1=88.02 特徵數量: 9089 趙建軍=男 沈雁冰=男 陸雪琪=女 李冰冰=女 測試集準確率: P=90.92 R=80.39 F1=85.33
天然語言處理問題大體可分爲兩類,一種是分類問題,另外一種就是結構化預測問題,序列標註只是結構化預測的一個特例,對感知機稍做拓展,分類器就能支持結構化預測。
定義
信息的層次結構特色稱做結構化。那麼結構化預測(structhre,prediction)則是預測對象結構的一類監督學習問題。相應的模型訓練過程稱做結構化學習(stutured laming )。分類問題的預測結果是一個決策邊界, 迴歸問題的預測結果是一個實數標量,而結構化預測的結果則是一個完整的結構。
天然語言處理中有許多任務是結構化預測,好比序列標註預測結構是一整個序列,句法分析預測結構是一棵句法樹,機器翻譯預測結構是一段完整的譯文。這些結構由許多部分構成,最小的部分雖然也是分類問題(好比中文分詞時每一個字符分類爲{B,M,E,S} ),但必須考慮結構總體的合理程度。
結構化預測與學習流程
結構化預測的過程就是給定一個模型 λ 及打分函數 score,利用打分函數給一些備選結構打分,選擇分數最高的結構做爲預測輸出,公式以下:
\[ \hat{y}=\arg \max _{y \in Y} \operatorname{score}_{\lambda}(x, y) \]
其中,Y 是備選結構的集合。既然結構化預測就是搜索得分最高的結構 y,那麼結構化學習的目標就是千方百計讓正確答案 y 的得分最高。不一樣的模型有不一樣的算法,對於線性模型,訓練算法爲結構化感知機。
結構化感知機算法
要讓線性模型支持結構化預測,必須先設計打分函數。打分函數的輸入有兩個缺一不可的參數: 特徵 x 和結構 y。但以前介紹的線性模型的「打分函數」只接受一個自變量 x。
作法是定義新的特徵函數 ϕ(x,y),把結構 y 也做爲一種特徵,輸出新的「結構化特徵向量」。新特徵向量與權重向量作點積後,就獲得一個標量,將其做爲分數:
\[ \operatorname{score}(x, y)=w \cdot \phi(x, y) \]
打分函數有了,取分值最大的結構做爲預測結果,獲得結構化預測函數:
\[ \hat{y}=\arg \max _{y \in Y}(w \cdot \phi(x, y)) \]
預測函數與線性分類器的決策函數很像,都是權重向量點積特徵向量。那麼感知機算法也能夠拓展複用,獲得線性模型的結構化學習算法。
讀入樣本 (x,y),進行結構化預測 \(\hat{y}=\arg \max_{y \in Y}(w \cdot \phi(x, y))\)
與正確答案相比,若不相等,則更新參數: 獎勵正確答案觸發的特徵函數的權重,不然進行懲罰:
\[w \leftarrow w+\phi\left(x^{(i)}, y\right)-\phi\left(x^{(i)}, \hat{y}\right)\]
還能夠調整學習率:
\[\boldsymbol{w} \leftarrow \boldsymbol{w}+\alpha\left(\phi\left(\boldsymbol{x}^{(i)}, \boldsymbol{y}\right)-\phi\left(\boldsymbol{x}^{(i)}, \hat{\boldsymbol{y}}\right)\right)\]
與感知機算法比較
結構化感知機與序列標註
上面已經講告終構化感知機的模型公式,看如何運用到序列標註上,咱們知道序列標註最大的結構特色就是標籤相互之間的依賴性,這種依賴性利用初始狀態機率想倆狗和狀態轉移機率矩陣體系那,那麼對於結構化感知機,就可使用轉移特徵來表示:
\[ \phi_{k}\left(y_{t-1}, y_{t}\right)=\left\{\begin{array}{ll} {1,} & {y_{t-1}=s_{i}, \mathrm{H} y_{t}=s_{j}} \\ {0,} & {其餘 } \end{array} \quad i=0, \cdots, N ; j=1, \cdots, N\right. \]
其中,Yt 爲序列第 t 個標籤,Si 爲標註集第 i 種標籤,N 爲標註集大小。
狀態特徵以下,相似於隱馬爾可夫模型的發射機率矩陣,狀態特徵只與當前的狀態有關,與以前的狀態無關:
\[ \phi_{i}\left(x_{i}, y_{i}\right)=\left\{\begin{array}{l} {1} \\ {0} \end{array}\right. \]
因而,結構化感知機的特徵函數就是轉移特徵和狀態特徵的合集:
\[ \phi=\left[\phi_{k} ; \phi_{l}\right] \quad k=1, \cdots, N^{2}+N ; l=N^{2}+N+1, \cdots \]
基於以上公式,咱們統一用打分函數來表示:
\[ \operatorname{score}(\boldsymbol{x}, \boldsymbol{y})=\sum_{t=1}^{T} \boldsymbol{w} \cdot \phi\left(y_{t-1}, y_{t}, \boldsymbol{x}_{t}\right) \]
有了打分公式,就能夠利用維特比算法求解得分最高的序列。
代碼詳見(註釋寫得很清楚): perceptron_cws.py
https://github.com/NLP-LOVE/Introduction-NLP/tree/master/code/ch05/perceptron_cws.py
運行以上代碼結果以下:
P:96.68 R:96.51 F1:96.59 OOV-R:71.54 IV-R:97.18 [王思斌, ,, 男, ,, 1949年10月, 生, 。] [山東, 桓臺縣, 起鳳鎮, 穆寨村, 婦女, 穆玲英] [現, 爲, 中國藝術研究院中國文化研究所, 研究員, 。] [咱們, 的, 父母, 重, 男, 輕, 女] [北京輸氣管道, 工程]
準確性與性能的比較
算法 | P | R | F1 | R(oov) | R(IV) |
---|---|---|---|---|---|
最長匹配 | 89.41 | 94.64 | 91.95 | 2.58 | 97.14 |
二元語法 | 92.38 | 96.70 | 94.49 | 2.58 | 99.26 |
一階HHM | 78.49 | 80.38 | 79.42 | 41.11 | 81.44 |
二階HHM | 78.34 | 80.01 | 79.16 | 42.06 | 81.04 |
平均感知機 | 96.69 | 96.45 | 96.57 | 70.34 | 97.16 |
結構化感知機 | 96.67 | 96.64 | 96.65 | 70.52 | 97.35 |
對比各項指標,咱們終於將 OOV 提升到了 70% 以上,而且綜合 F1 也提升了 96.7%,感知機是截止到這章最好用的算法,徹底達到了實用水平,在實際項目中,無非還須要掛載一些領域詞庫。
HanLP何晗--《天然語言處理入門》筆記:
https://github.com/NLP-LOVE/Introduction-NLP
項目持續更新中......
目錄
章節 |
---|
第 1 章:新手上路 |
第 2 章:詞典分詞 |
第 3 章:二元語法與中文分詞 |
第 4 章:隱馬爾可夫模型與序列標註 |
第 5 章:感知機分類與序列標註 |
第 6 章:條件隨機場與序列標註 |
第 7 章:詞性標註 |
第 8 章:命名實體識別 |
第 9 章:信息抽取 |
第 10 章:文本聚類 |
第 11 章:文本分類 |
第 12 章:依存句法分析 |
第 13 章:深度學習與天然語言處理 |