天天看點

自然語言處理從小白到大白系列(6)說說中文分詞那些事一. 分詞常用方法二. 分詞常用工具

文章目錄

  • 一. 分詞常用方法
    • 1.1 基于詞表的方法
      • 最大比對法
      • 全切分路徑選擇法
    • 1.2 基于統計模型的方法
      • 1. n元文法模型
      • 2. 隐馬爾可夫模型(Hidden Markov Model ,HMM)
      • 3. 條件随機場模型(Conditional Random Fields,CRF)
    • 1.3 基于深度學習的方法
  • 二. 分詞常用工具
    • 2.1 [jieba](https://github.com/fxsjy/jieba)
    • 2.2 [hanLP](https://github.com/hankcs/pyhanlp)
    • 2.3 [PKUseg](https://github.com/lancopku/pkuseg-python)
    • 2.4 [thulac](https://github.com/thunlp/THULAC-Python)
    • 2.5 [nlpir](https://github.com/NLPIR-team/NLPIR)
    • 2.6 [snowNLP](https://github.com/isnowfy/snownlp)
自然語言處理的中文分詞有三個難點:
  1. 分詞标準

    例如“花草”,有的人認為是一個詞,有的人認為應該劃分開為兩個詞“花/草”。某種意義上,中文分詞可以說是一個沒有明确定義的問題。

  2. 切分歧義

    不同的切分結果會有不同的含義,這個不用舉例了,很常見。

  3. 未登入詞

    也叫新詞發現,或者生詞,未被詞典收錄的詞。

一. 分詞常用方法

根據宗成慶老師的《統計自然語言處理》中,将分詞的方法分為了基于詞表的方法和基于統計的方法,而我們知道目前還有一種方法,無論是在NER(命名實體識别)還是POS(詞性标注)中,都用得十分廣泛,那就是Bi-LSTM +CRF的方法。本文我們就主要這三種主流的分詞方法。

1.1 基于詞表的方法

基于詞表的方法典型的有:最大比對法和全切分路徑法。

最大比對法

  • 正向最大比對法

    顧名思義,就是一個句子從前往後一直比對,隻要能構成詞語,就貪婪比對,這種方法當然是簡單粗暴,會導緻切分歧義。

  • 逆向最大比對法

    顧名思義+1,就是和正向相對應的,簡單粗暴比對,也會導緻切分歧義。

  • 雙向掃描法

    這就是結合了正向和逆向最大比對法,然後兩個當中選一個詞數少的切分作為結果,當然也不盡如人意,也一定程度上會造成歧義。

全切分路徑選擇法

  • n-最短路徑方法

    将所有的切分結果組成有向無環圖,切詞結果作為節點,詞和詞之間的邊賦予權重,找到權重和最大的路徑即為最終結果。比如可以通過詞頻作為權重,找到一條總詞頻最大的路徑即可認為是最佳路徑。

1.2 基于統計模型的方法

基于統計的分詞算法,本質上是一個序列标注問題。我們将語句中的字,按照他們在詞中的位置進行标注。标注主要有:B(詞開始的一個字),E(詞最後一個字),M(詞中間的字,可能多個),S(一個字表示的詞)。例如“網商銀行是螞蟻金服微貸事業部的最重要産品”,标注後結果為“BMMESBMMEBMMMESBMEBE”,對應的分詞結果為“網商銀行/是/螞蟻金服/微貸事業部/的/最重要/産品”。

主要的統計模型有:

  • N元文法模型(N-gram)
  • 隐馬爾可夫模型(Hidden Markov Model ,HMM)
  • 最大熵模型(ME)
  • 條件随機場模型(Conditional Random Fields,CRF)等。

1. n元文法模型

首先根據詞典,對句子進行簡單比對,找出所有可能的詞典詞(和n-最短路徑方法類似),然後,将他們和所有的單個字作為節點,構造一個n元切分詞圖。邊上的n元機率表示代價,最後利用相關的搜尋算法(如維特比算法)找到機率最大的路徑,作為分詞結果。

2. 隐馬爾可夫模型(Hidden Markov Model ,HMM)

HMM,隐馬爾科夫模型。隐馬爾科夫模型在機器學習中應用十分廣泛,它包含觀測序列和隐藏序列兩部分。對應到NLP中,我們的語句是觀測序列,而序列标注結果是隐藏序列。任何一個HMM都可以由一個五元組來描述:觀測序列,隐藏序列,隐藏态起始機率,隐藏态之間轉換機率(轉移機率),隐藏态表現為觀測值的機率(發射機率)。其中起始機率,轉移機率和發射機率可以通過大規模語料統計來得到。從隐藏态初始狀态出發,計算下一個隐藏态的機率,并依次計算後面所有的隐藏态轉移機率。我們的序列标注問題就轉化為了求解機率最大的隐藏狀态序列問題。jieba分詞中使用HMM模型來處理未登入詞問題,并利用viterbi算法來計算觀測序列(語句)最可能的隐藏序列(BEMS标注序列)。

更詳細的可以看另一篇詳細的介紹:隐馬爾可夫模型

3. 條件随機場模型(Conditional Random Fields,CRF)

既然是标注任務,肯定少不了條件随機場,條件随機場比較重要的是特征模闆,基本思路是對漢字進行标注訓練,不僅考慮了詞語出現的頻率,還考慮上下文,具備較好的學習能力,是以其對歧義詞和未登入詞的識别都具有良好的效果。

更詳細的可以移步我的另一篇部落格:條件随機場

1.3 基于深度學習的方法

這裡主要介紹雙向LSTM+CRF的标注方法:

  1. 可以直接用crf嗎?
其實直接用crf當然是可以的,但是我們知道,crf的關鍵還是在于它的特征模闆,特征模闆的好壞,影響了最後标标注的結果。現在我們想要自動提取詞的特征,怎麼做呢?方案就是Bi-LSTM。
  1. 可以直接用Bi-LSTM嗎?
直接用Bi-LSTM當然也是可以的,每一個詞向量輸入了Bi-LSTM之後,都對應一個輸出狀态,直接用這個輸出狀态接softmax,輸出每個标記的得分,當然也是可以的。但是這又有個問題,crf可以展現出的轉移特征,這裡的softmax沒有展現,每個詞的最大機率當然是輸出來了,但是轉移的機率沒有被展現出來,這就可能會出現标記為’BB’(開頭開頭)這樣的序列出現,而這樣的序列卻是不合理的。(圖檔是做NER的,照搬過來啦,意思是一樣的)
自然語言處理從小白到大白系列(6)說說中文分詞那些事一. 分詞常用方法二. 分詞常用工具
  1. 用Bi-LSTM+crf怎麼做?
如圖所示,這裡的BiLSTM輸出的是每個标注的得分,然後将這個輸入到CRF中,輸出最高機率的序列。
自然語言處理從小白到大白系列(6)說說中文分詞那些事一. 分詞常用方法二. 分詞常用工具

具體一點,對于每個輸入 X = ( x 1 , x 2 , . . . , x n ) X=(x_1, x_2, ..., x_n) X=(x1​,x2​,...,xn​),得到一個預測序列 y = ( y 1 , y 2 , . . . , y n ) y=(y_1, y_2,..., y_n) y=(y1​,y2​,...,yn​),定義這個預測的得分 s ( X , y ) = Σ i = 0 n A y i , y i + 1 + Σ i = 1 n P i , y i s(X,y)=\Sigma_{i=0}^nA_{y_i,y_i+1}+\Sigma_{i=1}^nP_{i,y_i} s(X,y)=Σi=0n​Ayi​,yi​+1​+Σi=1n​Pi,yi​​

其中 P i , y i P_{i,y_i} Pi,yi​​為第i個位置softmax輸出為 y i y_i yi​的機率, A y i , y i + 1 A_{y_i,y_i+1} Ayi​,yi​+1​為從 y i y_i yi​到 y i + 1 y_{i+1} yi+1​的轉移機率,當tag(B-person,B-location。。。。)個數為n的時候,轉移機率矩陣為(n+2)*(n+2),因為額外增加了一個開始位置和結束位置。

這個得分函數S就很好地彌補了傳統BiLSTM的不足,因為我們當一個預測序列得分很高時,并不是各個位置都是softmax輸出最大機率值對應的label,還要考慮前面轉移機率相加最大,即還要符合輸出規則(B後面不能再跟B),比如假設BiLSTM輸出的最有可能序列為BBIBIOOO,那麼因為我們的轉移機率矩陣中B->B的機率很小甚至為負,那麼根據s得分,這種序列不會得到最高的分數,即就不是我們想要的序列。

————————————————

引用自:https://blog.csdn.net/bobobe/article/details/80489303

二. 分詞常用工具

2.1 jieba

jieba分詞是國内使用人數最多的中文分詞工具

jieba分詞支援三種模式:

  • 精确模式:試圖将句子最精确地切開,适合文本分析;
  • 全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義;
  • 搜尋引擎模式:在精确模式的基礎上,對長詞再次切分,提高召回率,适合用于搜尋引擎分詞。

jieba分詞過程中主要涉及如下幾種算法:

(1)基于字首詞典實作高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG);

(2)采用了動态規劃查找最大機率路徑, 找出基于詞頻的最大切分組合;

(3)對于未登入詞,采用了基于漢字成詞能力的 HMM 模型,采用Viterbi 算法進行計算;

(4)基于Viterbi算法做詞性标注;

(5)基于tf-idf和textrank模型抽取關鍵詞;

對jieba的解析,更輸入地可以看這篇,這位同僚講得很好:對Python中文分詞子產品結巴分詞算法過程的了解和分析。

2.2 hanLP

pyhanlp: Python interfaces for HanLP

自然語言處理工具包HanLP的Python接口, 支援自動下載下傳與更新HanLP,相容py2、py3。

安裝

pip install pyhanlp

注意pyhanlp安裝之後使用的時候還會自動下載下傳相關的資料檔案,zip壓縮檔案600多M,速度有點慢,時間有點長

2.3 PKUseg

pkuseg具有如下幾個特點:
  • 多領域分詞。不同于以往的通用中文分詞工具,此工具包同時緻力于為不同領域的資料提供個性化的預訓練模型。根據待分詞文本的領域特點,使用者可以自由地選擇不同的模型。 我們目前支援了新聞領域,網絡領域,醫藥領域,旅遊領域,以及混合領域的分詞預訓練模型。在使用中,如果使用者明确待分詞的領域,可加載對應的模型進行分詞。如果使用者無法确定具體領域,推薦使用在混合領域上訓練的通用模型。各領域分詞樣例可參考 example.txt。
  • 更高的分詞準确率。相比于其他的分詞工具包,當使用相同的訓練資料和測試資料,pkuseg可以取得更高的分詞準确率。
  • 支援使用者自訓練模型。支援使用者使用全新的标注資料進行訓練。

    支援詞性标注。

編譯和安裝

目前僅支援python3

為了獲得好的效果和速度,強烈建議大家通過pip install更新到目前的最新版本

通過PyPI安裝(自帶模型檔案):

pip3 install pkuseg

之後通過import pkuseg來引用

建議更新到最新版本以獲得更好的開箱體驗:

pip3 install -U pkuseg

2.4 thulac

清華推出的自然語言工具包,具有中文分詞和詞性标注功能

(1)能力強。利用我們內建的目前世界上規模最大的人工分詞和詞性标注中文語料庫(約含5800萬字)訓練而成,模型标注能力強大。

(2)準确率高。該工具包在标準資料集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性标注的F1值可達到92.9%,與該資料集上最好方法效果相當。

(3)速度較快。同時進行分詞和詞性标注速度為300KB/s,每秒可處理約15萬字。隻進行分詞速度可達到1.3MB/s。

2.5 nlpir

是由北京理工大學張華平博士研發的中文分詞系統,經過十餘年的不斷完善,擁有豐富的功能和強大的性能。NLPIR是一整套對原始文本集進行處理和加工的軟體,提供了中間件處理效果的可視化展示,也可以作為小規模資料的處理加工工具。主要功能包括:中文分詞,詞性标注,命名實體識别,使用者詞典、新詞發現與關鍵詞提取等功能。

2.6 snowNLP

(1)中文分詞(Character-Based Generative Model);

(2)詞性标注(3-gram HMM);

(3)情感分析(簡單分析,如評價資訊);

(4)文本分類(Naive Bayes)

(5)轉換成拼音(Trie樹實作的最大比對)

(6)繁簡轉換(Trie樹實作的最大比對)

(7)文本關鍵詞和文本摘要提取(TextRank算法)

(8)計算文檔詞頻(TF,Term Frequency)和逆向文檔頻率(IDF,Inverse Document Frequency)

(9)Tokenization(分割成句子)

(10)文本相似度計算(BM25)

SnowNLP的最大特點是特别容易上手,用其進行中文文本時能夠得到不少有意思的結果,但不少功能比較簡單,還有待進一步完善。

參考資料:

自然語言處理1 – 分詞;

BiLSTM+crf的一些了解;

自然語言處理入門(4)——中文分詞原理及分詞工具介紹

對Python中文分詞子產品結巴分詞算法過程的了解和分析

碼農場

繼續閱讀