中文分詞工具
分詞背景介紹
不管在平時的實驗還是比賽中,NLP的絕大多數任務(情感分析、閱讀理解、對話系統、文本分類、信息抽取、機器翻譯等等)都需要在詞的基礎上進行。因此,中文分詞作爲這些任務的底層任務之一,一定程度上決定了這些任務的上限。通常我們在英文中使用空格分隔,但是在中文中就有很大的不同,其難點在中文的歧義現象以及一些新詞彙的出現(如一些網絡詞彙)。本文將介紹當前主流的分詞工具及其用法,並在icwb2數據集上做一個小實驗,驗證分詞工具的性能,最後得出各分詞工具的優缺點。
安裝及介紹(jieba、pyhanlp、pkuseg、thulac、snownlp、nlpir)
當下主流的分詞工具一般分爲jieba、pyhanlp、pkuseg、thulac、snownlp、nlpir幾種,其運行環境通常劃分爲windows與linux,下面分別介紹。
windowst系統分詞工具安裝
pip3 install jieba
在安裝速度極其慢的情況下,如果你未安裝代理,最好使用pip的清華源,如果你想要更換安裝源,請移步更換安裝源如果你不想切換,可以添加參數(下同)
-i https://pypi.tuna.tsinghua.edu.cn/simple
pip3 install hanlp
如安裝出錯,請移步windows hanlp安裝問題
3. pkuseg
pip3 install pkuseg
pip3 install thulac
pip3 install snownlp
pip3 install pynlpir
安裝錯誤,請移步[錯誤分析及其解決方案](https://blog.csdn.net/ykf173/article/details/105601612)。
Linux系統分詞工具安裝
sudo pip3 install jieba
在安裝速度極其慢的情況下,如果你未安裝代理,最好使用pip的清華源,如果你想要更換安裝源,請移步更換安裝源如果你不想切換,可以添加參數(下同)
-i https://pypi.tuna.tsinghua.edu.cn/simple
sudo pip3 install hanlp
sudo pip3 install pkuseg
sudo pip3 install thulac
sudo pip3 install snownlp
sudo pip3 install pynlpir
安裝錯誤,請移步[錯誤分析及其解決方案](https://blog.csdn.net/ykf173/article/details/105601612)。
使用方法介紹
# encoding=utf-8
import jieba
jieba.enable_paddle()# 啓動paddle模式。 0.40版之後開始支持,早期版本不支持
strs=["我來到北京清華大學","乒乓球拍賣完了","中國科學技術大學"]
for str in strs:
seg_list = jieba.cut(str,use_paddle=True) # 使用paddle模式
print("Paddle Mode: " + '/'.join(list(seg_list)))
seg_list = jieba.cut("我來到北京清華大學", cut_all=True)
print("Full Mode: " + "/ ".join(seg_list)) # 全模式
seg_list = jieba.cut("我來到北京清華大學", cut_all=False)
print("Default Mode: " + "/ ".join(seg_list)) # 精確模式
seg_list = jieba.cut("他來到了網易杭研大廈") # 默認是精確模式
print(", ".join(seg_list))
seg_list = jieba.cut_for_search("小明碩士畢業於中國科學院計算所,後在日本京都大學深造") # 搜索引擎模式
print(", ".join(seg_list))
import hanlp
han_tokenizer = hanlp.load('PKU_NAME_MERGED_SIX_MONTHS_CONVSEG')
sentences = ['薩哈夫說,伊拉克將同聯合國銷燬伊拉克大規模殺傷性武器特別委員會繼續保持合作。',
'上海華安工業(集團)公司董事長譚旭光和祕書張晚霞來到美國紐約現代藝術博物館參觀。',
'HanLP支援臺灣正體、香港繁體,具有新詞辨識能力的中文斷詞系統']
print(tokenizer(sentences))
# pkuseg分詞
# pkuseg.pkuseg(model_name="default", user_dict="default", postag=False)
# model_name
# 模型路徑。
# "default",默認參數,表示使用我們預訓練好的混合領域模型(僅對pip下載的用戶)。
# "news", 使用新聞領域模型。
# "web", 使用網絡領域模型。
# "medicine", 使用醫藥領域模型。
# "tourism", 使用旅遊領域模型。
# model_path, 從用戶指定路徑加載模型。
# user_dict
# 設置用戶詞典。
# "default", 默認參數,使用我們提供的詞典。
# None, 不使用詞典。
# dict_path, 在使用默認詞典的同時會額外使用用戶自定義詞典,可以填自己的用戶詞典的路徑,詞典格式爲一行一個詞。
# postag
# 是否進行詞性分析。
# False, 默認參數,只進行分詞,不進行詞性標註。
# True, 會在分詞的同時進行詞性標註。
import pkuseg
sentence = '薩哈夫說,伊拉克將同聯合國銷燬伊拉克大規模殺傷性武器特別委員會繼續保持合作。'
seg = pkuseg.pkuseg(postag=False) # 以默認配置加載模型,不進行詞性分析
sentence = seg.cut(sentence) # 進行分詞
print(' '.join(sentence))
import thulac
sentence = '薩哈夫說,伊拉克將同聯合國銷燬伊拉克大規模殺傷性武器特別委員會繼續保持合作。'
#seg_only設置詞性標註與否,deli設置分詞以後以什麼分隔
thu = thulac.thulac(seg_only=True, deli=' ')
text = thu.cut(sentence, text=True)
print('thulac分詞:', sentence)
import snownlp
sentence = '薩哈夫說,伊拉克將同聯合國銷燬伊拉克大規模殺傷性武器特別委員會繼續保持合作。'
sentence = SnowNLP(sentence).words
print(' '.join(sentence))
# -*- coding: utf-8 -*-
import pynlpir
sentence = '薩哈夫說,伊拉克將同聯合國銷燬伊拉克大規模殺傷性武器特別委員會繼續保持合作。'
pynlpir.open()
#pos_tagging:是否進行詞性標註
tag_seg = pynlpir.segment(sentence, pos_tagging=False)
print('pynlpir分詞:',tag_seg)
tag_word = pynlpir.segment(sentence, pos_tagging=True)
print('pynlpir詞性標註:',tag_word)
pynlpir.close()
數據集介紹
使用The Second International Chinese Word Segmentation Bakeoff in SIGHAN 2005 Workshop (Emerson, 2005)提供的數據集icwb2-data. 提取碼:yyke
icwb2 包含4個數據集,繁體中文數據集2個:AS, CityU; 簡體中文數據集2個:PK, MSR.
評價指標
F1-Score
真實: 共同 創造 美好 的 新 世紀 —— 二○○一年 新年 賀詞
預測: 共同 創造 美 好 的 新 世紀 —— 二○○一年 新年 賀詞
Precision = 9 / 11 = 0.818
Recall = 9 / 10 = 0.9
F1 = 0.857
實驗結果及比較
筆者從F1-score及時間效率兩個方面進行了比較
時間表格中各單位秒(s),分(m),時(h)
結論
從分詞性能上來說,hanlp與pkuseg兩大工具取得了極其優異的效果,但是耗費時間太多,因此作爲NLP底層的分詞工具,並不是可靠的工具。但是值得一提的是,這兩個工具可以作爲針對專業領域中文分詞的分詞工具。
從時間與分詞性能的綜合角度來看,thulac與jieba分詞工具性能雖然不是最好,但是其耗費的時間卻是最少的。對於大多數以中文分詞作爲底層工作的NLP任務,這兩個工具應該作爲首選。
github項目地址
參考文獻
[1]https://www.cnblogs.com/maxxu11/p/12615112.html
[2]https://chinesenlp.xyz/#/zh/docs/word_segmentation