一個NLP Freshman的筆記,大佬們請跳過...

中文英文一個重要的區別就是,英文是天然分詞的(使用空格或者標點符號),而中文是天然「分字」的,所以中文NLP任務中,分詞是一個很基礎的任務,大部分任務都是其下游任務。

本篇文章簡單介紹中文分詞,本人也只是看了不到一天吧(時間緊任務重),如有紕漏/補充可以發郵件討論,郵箱:[email protected]

順便給香儂打個廣告,持續招演算法(NLP,CV)/大數據/後台/前端,全職 or 實習, 簡歷發郵箱。具體大家google一下 「香儂科技」,這裡就不做PR了。


1. jieba 分詞方法

jieba分詞是一個很好用的分詞工具包,github地址:github.com/fxsjy/jieba

jieba.cut()的參數HMM控制是否使用HMM分詞。

DAG分詞的思想呢,就是首先你得有一個詞典,這個詞典記錄每個詞的詞頻,當然這個詞典是從某個語料庫中統計的到的(請不要問我沒有分詞系統怎麼統計的詞典...)。然後對於每個你要進行分詞的句子,例如「我去北京大學玩」,你去查看字典,你會得到所有可能的分詞結果,例如「我/去/北京/大學/玩」,「我/去/北京大學/玩」等等。然後呢,你只要在這些所有的分詞可能中找一個概率最大的就可以了,怎麼找,DP,嗯。

但是有一個問題,比如你要進行分詞的句子是「窗前明月光」,你的詞典中沒有「窗前」,那「窗前」這兩個字肯定分開,即「窗前」,但是某些情況下你想要的結果是「窗前/明月/光」,這個時候DAG就沒辦法了(所以DAG缺點是完全沒辦法應付未登錄詞),jieba使用HMM處理這種問題。

DAG分詞部分請看:cnblogs.com/zhbzz2007/p

HMM分詞部分請看:cnblogs.com/zhbzz2007/p

寫的太好了,我都不想再寫了,嗯...

2. BiLstm + CRF

這是深度學習的方法,據說效果很好。

首先這個模型不是專門處理分詞的,是處理標註問題的,分詞可以作為一個標註任務,所以可以使用它解決。分詞標註有幾種,簡單介紹一種BMES吧, B是開始begin位置, E是end, 是結束位置, M是middle, 是中間位置, S是single, 單獨成詞的位置。那麼「我/周末/去/北京大學/玩」,標註序列就是「SBESBMMES」。

這個模型也很簡單,先看BiLstm,雙向LSTM嘛,大家都懂,用來提特徵的,它輸出維度是tag的size,分詞中就是4,表示標註的非歸一化的概率。這雖然已經可以訓練了,但是很明顯的缺陷,標註序列是由明顯的轉移概率的,比如B後面不可能是S,只能是M或者E,並且E的概率大一點,這是因為中文2字詞更多。

怎麼解決?就是使用CRF對Bilstm輸出進行限制一下。

設Bi-LSTM的輸出矩陣為P,其中 P_{i,j} 代表詞wi映射到 tag_j

的非歸一化概率。對於CRF來說,我們假定存在一個轉移矩陣A,則 A_{i,j} 代表 tag_i 轉移到 tag_j 的轉移概率。

對於輸入序列X對應的輸出tag序列y,定義分數為:

利用Softmax函數,我們為每一個正確的tag序列y定義一個概率值( Y_X 代表所有的tag序列)

因而在訓練中,我們只需要最大化似然概率 p(y|X) 即可,這裡我們利用對數似然

所以我們將損失函數定義為 -log p(y|X) ,就可以利用梯度下降法來進行網路的學習了。

在對損失函數進行計算的時候, s(X,y) 的計算很簡單,而 log(sum_{	ilde{y}in Y_X}e^{S(X,	ilde{y})}) (下面記作logsumexp)的計算稍微複雜一些,因為需要計算每一條可能路徑的分數。

嗯。我們需要優化一下,再提一句,基本上遇到softmax第一反應要想想是否需要優化,因為分母的計算要麼很費時,要麼根本無法計算(當然不排除所有路徑並不多的情況),NCE(雜訊對比估計)是主流方法。這裡不需要NCE,因為這裡的歸一化因子是可以利用上一步計算的結果的,其實是一個DP。

具體的,對於到詞 w_{i+1} 的路徑,可以先把到的 w_i 的logsumexp計算出來,然後對於 w_{i+1}

只需要在前面的基礎上,再計算其發射所有的tag(BMES)的概率加起來,就是到 w_{i+1}

所有標註可能了。

3. 目前存在的問題

目前中文分詞難點主要有三個:

1、分詞標準:比如人名,在哈工大的標準中姓和名是分開的,但在Hanlp中是合在一起的。這需要根據不同的需求制定不同的分詞標準。

2、歧義:對同一個待切分字元串存在多個分詞結果。

歧義又分為組合型歧義、交集型歧義和真歧義三種類型。

1) 組合型歧義:分詞是有不同的粒度的,指某個詞條中的一部分也可以切分為一個獨立的詞條。比如「中華人民共和國」,粗粒度的分詞就是「中華人民共和國」,細粒度的分詞可能是「中華/人民/共和國」

2) 交集型歧義:在「鄭州天和服裝廠」中,「天和」是廠名,是一個專有詞,「和服」也是一個詞,它們共用了「和」字。

3) 真歧義:本身的語法和語義都沒有問題, 即便採用人工切分也會產生同樣的歧義,只有通過上下文的語義環境才能給出正確的切分結果。例如:對於句子「美國會通過對台售武法案」,既可以切分成「美國/會/通過對台售武法案」,又可以切分成「美/國會/通過對台售武法案」。

一般在搜索引擎中,構建索引時和查詢時會使用不同的分詞演算法。常用的方案是,在索引的時候使用細粒度的分詞以保證召回,在查詢的時候使用粗粒度的分詞以保證精度。

3、新詞:也稱未被詞典收錄的詞,該問題的解決依賴於人們對分詞技術和漢語語言結構的進一步認識。


參考:

zhuanlan.zhihu.com/p/27

zhihu.com/question/1957

cnblogs.com/zhbzz2007/p

cnblogs.com/zhbzz2007/p


推薦閱讀:
相关文章