pyhanlp 中文詞性標註與分詞簡介

adnb34g發表於2019-01-07

pyhanlp 中文詞性 標註 與分詞簡介

 

pyhanlp實現的分詞器有很多,同時pyhanlp獲取hanlp中分詞器也有兩種方式

第一種是直接從封裝好的 hanlp類中獲取,這種獲取方式一共可以獲取五種分詞器,而現在預設的就是第一種維特比分詞器

1. 維特比 (viterbi):效率和效果的最佳平衡。也是最短路分詞,HanLP最短路求解採用Viterbi演算法

2. 雙陣列 trie樹 (dat):極速詞典分詞,千萬字元每秒(可能無法獲取詞性,此處取決於你的詞典)

3. 條件隨機場 (crf):分詞、詞性標註與命名實體識別精度都較高,適合要求較高的NLP任務

4. 感知機 (perceptron):分詞、詞性標註與命名實體識別,支援線上學習

5. N最短路 (nshort):命名實體識別稍微好一些,犧牲了速度

第二種方式是使用 JClass直接獲取java類,然後使用。這種方式除了獲取上面的五種分詞器以外還可以獲得一些其他分詞器,如NLP分詞器,索引分詞,快速詞典分詞等等

兩種使用方式的對比

第一種是使用作者給的 HanLP直接獲取分詞器,直接segment() 會獲取 預設的標準分詞器也就是維特比分詞器,也**可以使用newSegment函式,傳入上面的分詞器英文名稱來獲取新的分詞器,如使用HanLP.newSegment("crf")來獲取CRF分詞器。**第二種方式是使用JClass從java中獲取我們想要的類,好在這兩種方式都比較方便。除此之外要注意的是,在pyhanlp中還給出了SafeJClass類,其為JClass的執行緒安全版,你也可以使用SafeClass來代替JClass。不過好在HanLP中的很多類本身已經實現了執行緒安全,因此許多時候兩者是可以相互替代的。

 

 

 

[你好/vl, ,/w, 歡迎/v, 使用/v, HanLP/nx, 漢語/gi, 處理/vn, 包/v, !/w, 接下來/vl, 請/v, 從/p, 其他/rzv, Demo/nx, 中/f, 體驗/v, HanLP/nx, 豐富/a, 的/ude1, 功能/n, ~/nx]

 

# 標準分詞

text = (

    "舉辦紀念活動銘記二戰歷史,不忘戰爭帶給人類的深重災難,是為了防止悲劇重演,確保和平永駐;記二戰歷史,更是為了提醒國際社會,需要共同捍衛二戰勝利成果和國際公平正義,必須警惕和抵制在歷史認知和維護戰後國際秩序問題上的倒行逆施。"

)

 

BasicTokenizer = JClass("com.hankcs.hanlp.tokenizer.BasicTokenizer")

print(BasicTokenizer.segment(text))

 

import time

start = time.time()

for i in range(100000):

    HanLP.segment(text)

cost_time = time.time() - start

print("HanLP.segment :%.2f字每秒" % (len(text) * 100000 / cost_time))

 

start = time.time()

for i in range(100000):

    BasicTokenizer.segment(text)

cost_time = time.time() - start

print("BasicTokenizer.segment :%.2f字每秒" % (len(text) * 100000 / cost_time))

 

[舉辦/v, 紀念活動/nz, 銘記/v, 二戰/n, 歷史/n, ,/w, 不忘/v, 戰爭/n, 帶給/v, 人類/n, 的/ude1, 深重/a, 災難/n, ,/w, 是/vshi, 為了/p, 防止/v, 悲劇/n, 重演/v, ,/w, 確保/v, 和平/n, 永駐/nz, ;/w, 記/v, 二戰/n, 歷史/n, ,/w, 更是/d, 為了/p, 提醒/v, 國際/n, 社會/n, ,/w, 需要/v, 共同/d, 捍衛/v, 二戰/n, 勝利/vn, 成果/n, 和/cc, 國際/n, 公平/a, 正義/n, ,/w, 必須/d, 警惕/v, 和/cc, 抵制/v, 在/p, 歷史/n, 認知/vn, 和/cc, 維護/v, 戰後/t, 國際/n, 秩序/n, 問題/n, 上/f, 的/ude1, 倒行逆施/vl, 。/w]

HanLP.segment :1518389.32字每秒

BasicTokenizer.segment :2415039.64字每秒

 

僅僅從剛剛的結果看,可能會不太理解為同一個分詞器效能差距這麼大?難道是因為中間程式碼的排程問題,其實也不是。將兩段程式碼前後互換之後,發現無論兩者怎麼排列,總是在前的速度較慢,在後的較快,因此應該是記憶體的問題,第二次呼叫時減少了部分記憶體的調動。所以同一個分詞器才會出現,第二次總比第一次快的現象。

標準分詞

說明

1. HanLP中有一系列“開箱即用”的靜態分詞器,以Tokenizer結尾,在接下來的例子中會繼續介紹。

2. HanLP.segment其實是對StandardTokenizer.segment的包裝。

3. 分詞結果包含詞性,每個詞性的意思請查閱《 HanLP詞性標註集》。

演算法詳解

1. 《詞圖的生成》

單獨獲取詞性或者詞語

如你所見的是,前面 print的結果是[詞語/詞性,詞語/詞性,/詞語/詞性…]的形式,那麼如果我們只想獲取詞語,或者詞性應該怎麼辦呢?

 

方法也很簡單。使用 HanLP.Config.ShowTermNature = False修改配置,使其不顯示詞性即可。

 

如果想要只獲取詞性也是可以的,因為原分詞器返回的是 Java中的ArrayList屬性,list中的每個單元都是一個term類,因此我們也可以透過獲取term中的word欄位來直接獲取詞語,或者nature屬性,直接獲取詞性。這一特徵,我們在之後也會用到。

 

因為 HanLP中是預設開啟詞性標註的,所以在這裡我取名為分詞與詞性標註,但是因為篇幅原因這裡沒有對詞性標註作過多解釋,詳細內容請看“詞性標註(正篇)”

 

 

 

作者: Font Tian

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31524777/viewspace-2374646/,如需轉載,請註明出處,否則將追究法律責任。

相關文章