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

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中的很多類本身已經實現了線程安全,因此許多時候兩者是可以相互替代的。

 

 圖1.JPG 

[你好/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中是默認開啓詞性標註的,所以在這裏我取名爲分詞與詞性標註,但是因爲篇幅原因這裏沒有對詞性標註作過多解釋,詳細內容請看“詞性標註(正篇)”

圖2.JPG 

 

 

作者:Font Tian

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章