pyhanlp 中文詞性標註與分詞簡介java
pyhanlp實現的分詞器有不少,同時pyhanlp獲取hanlp中分詞器也有兩種方式算法
第一種是直接從封裝好的hanlp類中獲取,這種獲取方式一共能夠獲取五種分詞器,而如今默認的就是第一種維特比分詞器數組
1.維特比 (viterbi):效率和效果的最佳平衡。也是最短路分詞,HanLP最短路求解採用Viterbi算法安全
2.雙數組trie樹 (dat):極速詞典分詞,千萬字符每秒(可能沒法獲取詞性,此處取決於你的詞典)函數
3.條件隨機場 (crf):分詞、詞性標註與命名實體識別精度都較高,適合要求較高的NLP任務性能
4.感知機 (perceptron):分詞、詞性標註與命名實體識別,支持在線學習學習
5.N最短路 (nshort):命名實體識別稍微好一些,犧牲了速度spa
第二種方式是使用JClass直接獲取java類,而後使用。這種方式除了獲取上面的五種分詞器之外還能夠得到一些其餘分詞器,如NLP分詞器,索引分詞,快速詞典分詞等等線程
兩種使用方式的對比blog
第一種是使用做者給的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