導讀:
随着自然語言處理(Natural Language Processing, NLP
)技術日趨成熟,實作中文分詞的工具也越來越多
。中文分詞技術作為中文自然語言處理的第一項核心技術,是衆多上層任務的首要基礎工作,同時在日常的工作中起着基礎性的作用。
本文将講解如何在Python環境下調用HanLP包進行分詞,并結合Python語言簡約的特性,實作一行代碼完成中文分詞。
常用中文分詞工具
工具名稱 | 是否開源 | 工具描述 |
Jieba (結巴分詞) | 免費使用 | jieba庫是一款優秀的支援 Python 第三方中文分詞庫,jieba支援三種分詞模式:精确模式、全模式和搜尋引擎模式。 |
SnowNLP (中文的類庫) | SnowNLP是一個python寫的類庫,可以友善的進行中文文本内容,是受到了TextBlob的啟發而寫的,誕生了一個友善進行中文的類庫。 | |
FoolNLTK (中文處理工具包) | FoolNLTK是基于Bi-LSTM模型訓練成的中文分詞工具,僅适用于Linux系統。 | |
Jiagu (甲骨工具包) | Jiagu以BiLSTM等模型為基礎,使用大規模語料訓練而成。內建多種NLP基礎處理功能并支援知識圖譜開放資訊抽取。 | |
HanLP (漢語言處理包) | HanLP是一系列模型與算法組成的NLP工具包,由大快搜尋主導并完全開源,目标是普及自然語言處理在生産環境中的應用。HanLP具備功能完善、性能高效、架構清晰、語料時新、可自定義的特點。 | |
pyltp (哈工大語言雲) | 付費使用 | pyltp 是哈工大自然語言工作組推出的一款基于Python 封裝的自然語言處理工具,提供了分詞,詞性标注,命名實體識别,依存句法分析,語義角色标注的功能。 |
THULAC(清華中文詞法分析) | THULAC(THU Lexical Analyzer for Chinese)是由清華大學自然語言處理與社會人文計算實驗室研制推出的一套中文詞法分析工具包,具有中文分詞和詞性标注功能。 | |
NLPIR(漢語分詞系統) | NLPIR大資料語義智能分析平台由北京理工大學大資料搜尋與挖掘實驗室研發的“自然語言處理與資訊檢索共享平台。 |
01 什麼是中文分詞?
衆所周知,英文是以詞為機關的,詞和詞之間是靠空格隔開。而在漢語中,詞以字為基本機關,但是一篇文章的語義表達卻仍然是以詞來劃分。例如,英文句子"I am a student",用中文則為:"我是一個學生"。計算機可以很簡單通過空格知道"student"是一個單詞,但是不能很容易明白"學"、"生"兩個字合起來才表示一個詞。把中文的漢字序列切分成有意義的詞,就是中文分詞,有些人也稱為切詞。"我是一個學生",分詞的結果是:"我 是 一個 學生"。是以,需要針對中文漢字,将其按照一定的方式進行組織,分成不同的詞。
中文分詞是讓計算機自動識别出句子中的詞,然後在詞間加入邊界标記符。這個過程的主要困難在于分詞規範、歧義切分和未登陸詞的識别。
分詞規範可以了解為國人并沒有統一對漢語詞的認識,對漢語詞的認識的操作尺度很難把握,極易受到主觀因素的影響,進而無法提供一個公認的、具有權威性的詞表(例如普通說話人的語感與語言學家的标準就有較大的差異)。
歧義切分可以舉例如下:"南京市長江大橋"的分詞有兩種切分,"南京市\長江大橋" 和 "南京\市長\江大橋"。這種情況在漢國文本中非常普遍,并且處理這類問題往往也要複雜得多。
未登入詞的識别(生詞)可以有兩種解釋:一是指已有詞典中沒有收錄的詞;二是指已有的訓練語料中未曾出現過的詞。是以從某種意義上來說,生詞對分詞的影響是最容易處理的。
02 HanLP分詞
1. 安裝HanLP
HanLP的API總體來說并不多,且需要進行的配置并不複雜,适合新手上手。下載下傳完成後,可以使用如下指令進行安裝。要求Python 3.6以上,支援Windows,可以在CPU上運作,推薦GPU/TPU。
pip install pyhanlp
注:若未安裝Java則會報如下錯誤。因為HanLP 主項目采用 Java 開發,是以需要 Java 運作環境,請安裝 JDK。
jpype.jvmfinder.JVMNotFoundException: No JVM shared library file (jvm.dll) found. Try setting up the JAVAHOME environment variable properly.
項目Github位址:
https://github.com/hankcs/pyhanlp2. 分詞實戰
2.1 簡單執行個體
首先,我們通過一個官網的執行個體直覺認識下HanLP的分詞結果。
import pyhanlptext = '鐵甲網是中國最大的工程機械交易平台'words = for term in pyhanlp.HanLP.segment(text): words.append(term.word)print(words) #輸出分詞結果
分詞結果如下所示。
2.2 自定義詞典分詞
接着,我們通過自定義增加不同領域内的專有名詞的詞典,進而進一步優化HanLP的分詞結果。
'鐵甲', '網', '是', '中國', '最大', '的', '工程', '機械', '交易', '平台']
CustomDictionary.add("鐵甲網") CustomDictionary.insert("工程機械", "nz 1024") CustomDictionary.add("交易平台", "nz 1024 n 1") print(HanLP.segment(txt))
2.3 優化分詞代碼
最後,我們可以利用Python語言的簡約性将代碼優化成如下一行。
其中,text 存放的是待分詞的文本;
正規表達式 re.fullmatch(r'[\u4e00-\u9fa5]+',i)
的作用是僅保留漢字,過濾掉非漢字之外的字元。
words = [i for i in [i.word for i in pyhanlp.HanLP.segment(text)] if re.fullmatch(r'[\u4e00-\u9fa5]+',i)]
當然了,HanLP作為開源架構,并不是隻有分詞這一個功能,還提供了很多在分詞之上的算法,如關鍵詞提取、自動摘要、依存句法分析、情感分析等,這裡不再贅述。