BosonNLP分詞技術解密

在九月初BosonNLP全面開放了分詞和詞性標註引擎之後,不少尤爲是從事數據處理和天然語言研究的朋友在試用後很好奇,玻森如何可以作到目前的高準確率?但願這篇文章可以幫助你們理解玻森分詞背後的實現原理。 算法

衆所周知,中文並不像英文那樣詞與詞之間用空格隔開,所以,在通常狀況下,中文分詞與詞性標註每每是中文天然語言處理的第一步。一個好的分詞系統是有效進行中文相關數據分析和產品開發的重要保證。npm

玻森採用的結構化預測模型是傳統線性條件隨機場(Linear-chain CRF)的一個變種。在過去及幾年的分詞研究中,雖然以字符爲單位進行編碼,從而預測分詞與詞性標註的文獻佔到了主流。這類模型雖然實現較容易,但比較難捕捉到高階預測變量之間的關係。好比傳統進行詞性標註問題上使用Tri-gram特徵可以獲得較高準確率的結果,但一階甚至高階的字符CRF都難以創建這樣的關聯。因此玻森在字符編碼之外加入了詞語的信息使這種高階做用一樣能被捕捉數組

分詞與詞性標註中,新詞識別組合切分歧義是兩個核心挑戰。玻森在這方面作了很多的優化,包括對特殊字符的處理,對比較有規律的構詞方式的特徵捕捉等。例如,近些年比較流行採用半監督的方式,經過使用在大規模無標註數據上的統計數據來改善有監督學習中的標註結果,也在咱們的分詞實現上有所應用。好比經過使用accressory variety做爲特徵,可以比較有效發現不一樣領域的新詞,提高泛化能力。微信

咱們都知道上下文信息是解決組合切分歧義的重要手段。而做爲一個面向實際商用環境的算法,除了在準確率上的要求以外,還須要注意模型算法的時間複雜度須要足夠高效。例如,相比於普通的Linear-chain CRF,Skip-chain CRF由於加入了更多的上下文信息,可以在準確率上達到更好的效果,但由於其它在訓練和解碼過程,不管是精確算法仍是近似算法,都難以達到咱們對速度的要求,因此並無在咱們最終實現中採用。一個比較有趣的分詞改進是咱們捕捉了中文中常見的固定搭配詞對信息。譬如,如 「得出某個結論」、 「回答某個提問」等。若是前面出現 「得出」 ,後面出現 「結論」 ,那麼「得出」和「結論」做爲一個詞語出現的可能性就會很大,與這種相沖突的分詞方案的可能性就會很小。這類固定搭配也能夠被建模,用於解決部分分詞錯誤的問題。學習

怎樣肯定兩個詞是不是固定的搭配呢?咱們經過計算兩個詞間的歸一化逐點互信息(NPMI)來肯定兩個詞的搭配關係。逐點互信息(PMI),常常用在天然語言處理中,用於衡量兩個事件的緊密程度。歸一化逐點互信息(NPMI)是逐點互信息的歸一化形式,將逐點互信息的值歸一化到-1到1之間。若是兩個詞在必定距離範圍內共同出現,則認爲這兩個詞共現。篩選出NPMI高的兩個詞做爲固定搭配,而後將這組固定搭配做爲一個組合特徵添加到分詞程序中。如「回答」和「問題」是一組固定的搭配,若是在標註「回答」的時候,就會找後面一段距離範圍內是否有「問題」,若是存在那麼該特徵被激活。優化

圖片描述
歸一化逐點互信息(npmi)的計算公式編碼

圖片描述
逐點互信息(pmi)的計算公式spa

能夠看出,若是咱們提取固定搭配不限制距離,會使後面偶然出現某個詞的機率增大,下降該統計的穩定性。在具體實現中,咱們限定了成爲固定搭配的詞對在原文中的距離必須小於一個常數。具體來看,能夠採用倒排索引,經過詞找到其所在的位置,進而判斷其位置是否在可接受的區間。這個簡單的實現有個比較大的問題,即在特定構造的文本中,判斷兩個詞是否爲固定搭配有可能須要遍歷位置數組,每次查詢就有O(n)的時間複雜度了,而且可使用二分查找進一步下降複雜度爲O(logn)。索引

其實這個詞對檢索問題有一個更高效的算法實現。咱們採用滑動窗口的方法進行統計:在枚舉詞的同時維護一張詞表,保存在當前位置先後一段距離中出現的可能成詞的字符序列;當枚舉詞的位置向後移動時,窗口也隨之移動。這樣在遍歷到 「回答」 的時候,就能夠經過查表肯定後面是否有 「問題」 了,一樣在遇到後面的 「問題」 也能夠經過查表肯定前面是否有 「回答」。當枚舉下一個詞的時候,詞表也相應地進行調整。採用哈希表的方式查詢詞表,這樣計算一個固定搭配型時間複雜度就能夠是O(1)了。
圖片描述
經過引入上述的上下文的信息,分詞與詞性標註的準確率有近1%的提高,而對算法的時間複雜度沒有改變。咱們也在不斷迭代升級以保證引擎可以愈來愈準確,改善其通用性和易用性。從此咱們也會在BosonNLP微信帳戶更多享咱們在天然語言處理方面的經驗,歡迎關注!事件

相關文章
相關標籤/搜索