1. 程式人生 > >自然語言處理入門(4)——中文分詞原理及分詞工具介紹

自然語言處理入門(4)——中文分詞原理及分詞工具介紹

本文首先介紹下中文分詞基本原理,然後介紹下國內比較流行的中文分詞工具,如jiebaSnowNLPTHULACNLPIR,上述分詞工具都已經在github上開源,後續也會附上github連結,以供參考。

1.中文分詞原理介紹

1.1 中文分詞概述

中文分詞(Chinese Word Segmentation) 指的是將一個漢字序列切分成一個一個單獨的詞分詞就是將連續的字序列按照一定的規範重新組合成詞序列的過程

1.2 中文分詞方法介紹

現有的分詞方法可分為三大類:基於字串匹配的分詞方法基於理解的分詞方法基於統計的分詞方法

1.2.1 基於字串匹配的分詞方法

基於字串匹配的分詞方法

又稱機械分詞方法,它是按照一定的策略待分析的漢字串與一個“充分大的”機器詞典中的詞條進行配,若在詞典中找到某個字串,則匹配成功(識別出一個詞)。

按照掃描方向的不同,字串匹配分詞方法可以分為正向匹配逆向匹配;按照不同長度優先匹配的情況,可以分為最大(最長)匹配最小(最短)匹配;按照是否與詞性標註過程相結合,可以分為單純分詞方法分詞與詞性標註相結合的一體化方法。常用的字串匹配方法有如下幾種:

(1)正向最大匹配法(從左到右的方向);

(2)逆向最大匹配法(從右到左的方向);

(3)最小切分(每一句中切出的詞數最小);

(4)雙向最大匹配(進行從左到右、從右到左兩次掃描)

這類演算法的優點是速度快

,時間複雜度可以保持在O(n),實現簡單,效果尚可;但對歧義未登入詞處理效果不佳。

1.2.2 基於理解的分詞方法

基於理解的分詞方法通過讓計算機模擬人對句子的理解,達到識別詞的效果。其基本思想就是在分詞的同時進行句法、語義分析,利用句法資訊語義資訊處理歧義現象。它通常包括三個部分:分詞子系統句法語義子系統總控部分。在總控部分的協調下,分詞子系統可以獲得有關詞、句子等的句法和語義資訊來對分詞歧義進行判斷,即它模擬了人對句子的理解過程。這種分詞方法需要使用大量的語言知識和資訊。由於漢語語言知識的籠統、複雜性,難以將各種語言資訊組織成機器可直接讀取的形式,因此目前基於理解的分詞系統還處在試驗階段

1.2.3 基於統計的分詞方法

基於統計的分詞方法是在給定大量已經分詞的文字的前提下,利用統計機器學習模型學習詞語切分的規律(稱為訓練),從而實現對未知文字的切分。例如最大概率分詞方法最大熵分詞方法等。隨著大規模語料庫的建立,統計機器學習方法的研究和發展,基於統計的中文分詞方法漸漸成為了主流方法

主要的統計模型有:N元文法模型(N-gram),隱馬爾可夫模型(Hidden Markov Model ,HMM),最大熵模型(ME),條件隨機場模型(Conditional Random Fields,CRF)等。

在實際的應用中,基於統計的分詞系統都需要使用分詞詞典進行字串匹配分詞,同時使用統計方法識別一些新詞,即將字串頻率統計字串匹配結合起來,既發揮匹配分詞切分速度快、效率高的特點,又利用了無詞典分詞結合上下文識別生詞、自動消除歧義的優點

2.中文分詞工具介紹

2.1 jieba (github star數 9003)

jieba分詞是國內使用人數最多的中文分詞工具(github連結:https://github.com/fxsjy/jieba)。jieba分詞支援三種模式

(1)精確模式:試圖將句子最精確地切開,適合文字分析

(2)全模式:把句子中所有的可以成詞的詞語都掃描出來, 速度非常快,但是不能解決歧義

(3)搜尋引擎模式:在精確模式的基礎上,對長詞再次切分,提高召回率適合用於搜尋引擎分詞

jieba分詞過程中主要涉及如下幾種演算法:

(1)基於字首詞典實現高效的詞圖掃描,生成句子中漢字所有可能成詞情況所構成的有向無環圖 (DAG);

(2)採用了動態規劃查詢最大概率路徑, 找出基於詞頻的最大切分組合

(3)對於未登入詞,採用了基於漢字成詞能力的 HMM 模型,採用Viterbi 演算法進行計算;

(4)基於Viterbi演算法做詞性標註

(5)基於tf-idftextrank模型抽取關鍵詞

測試程式碼如下所示:

# -*- coding: utf-8 -*-
"""
jieba分詞測試
"""

import jieba


#全模式
test1 = jieba.cut("杭州西湖風景很好,是旅遊勝地!", cut_all=True)
print("全模式: " + "| ".join(test1))

#精確模式
test2 = jieba.cut("杭州西湖風景很好,是旅遊勝地!", cut_all=False)
print("精確模式: " + "| ".join(test2))

#搜尋引擎模式
test3= jieba.cut_for_search("杭州西湖風景很好,是旅遊勝地,每年吸引大量前來遊玩的遊客!")  
print("搜尋引擎模式:" + "| ".join(test3))

測試結果如下圖所示:

這裡寫圖片描述

2.2 SnowNLP(github star數 2043)

SnowNLP是一個python寫的類庫(https://github.com/isnowfy/snownlp),可以方便的處理中文文字內容,是受到了TextBlob的啟發而寫的。SnowNLP主要包括如下幾個功能:

(1)中文分詞(Character-Based Generative Model);

(2)詞性標註(3-gram HMM);

(3)情感分析(簡單分析,如評價資訊);

(4)文字分類(Naive Bayes)

(5)轉換成拼音(Trie樹實現的最大匹配)

(6)繁簡轉換(Trie樹實現的最大匹配)

(7)文字關鍵詞文字摘要提取(TextRank演算法)

(8)計算文件詞頻TF,Term Frequency)和逆向文件頻率IDF,Inverse Document Frequency)

(9)Tokenization(分割成句子)

(10)文字相似度計算(BM25)

SnowNLP的最大特點是特別容易上手,用其處理中文文字時能夠得到不少有意思的結果,但不少功能比較簡單,還有待進一步完善。

測試程式碼如下所示:

# -*- coding: utf-8 -*-
"""
SnowNLP測試
"""

from snownlp import SnowNLP

s = SnowNLP(u'杭州西湖風景很好,是旅遊勝地,每年吸引大量前來遊玩的遊客!')

#分詞
print(s.words)


#情感詞性計算
print("該文字的情感詞性為正的概率:" + str(s.sentiments))

text = u'''
西湖,位於浙江省杭州市西面,是中國大陸首批國家重點風景名勝區和中國十大風景名勝之一。
它是中國大陸主要的觀賞性淡水湖泊之一,也是現今《世界遺產名錄》中少數幾個和中國唯一一個湖泊類文化遺產。
西湖三面環山,面積約6.39平方千米,東西寬約2.8千米,南北長約3.2千米,繞湖一週近15千米。
湖中被孤山、白堤、蘇堤、楊公堤分隔,按面積大小分別為外西湖、西里湖、北里湖、小南湖及嶽湖等五片水面,
蘇堤、白堤越過湖面,小瀛洲、湖心亭、阮公墩三個小島鼎立於外西湖湖心,夕照山的雷峰塔與寶石山的保俶塔隔湖相映,
由此形成了“一山、二塔、三島、三堤、五湖”的基本格局。
'''

s2 = SnowNLP(text)

#文字關鍵詞提取
print(s2.keywords(10))

測試結果如下圖所示:

這裡寫圖片描述

2.3 THULAC (github star數 311)

THULAC(THU Lexical Analyzer for Chinese)由清華大學自然語言處理與社會人文計算實驗室研製推出的一套中文詞法分析工具包(github連結:https://github.com/thunlp/THULAC-Python),具有中文分詞詞性標註功能。THULAC具有如下幾個特點:

(1)能力強。利用我們整合的目前世界上規模最大的人工分詞和詞性標註中文語料庫(約含5800萬字)訓練而成,模型標註能力強大

(2)準確率高。該工具包在標準資料集Chinese Treebank(CTB5)上分詞的F1值可達97.3%,詞性標註的F1值可達到92.9%,與該資料集上最好方法效果相當。

(3)速度較快。同時進行分詞和詞性標註速度為300KB/s,每秒可處理約15萬字。只進行分詞速度可達到1.3MB/s。

THU詞性標記集(通用版)如下所示:

n/名詞 np/人名 ns/地名 ni/機構名 nz/其它專名
m/數詞 q/量詞 mq/數量詞 t/時間詞 f/方位詞 s/處所詞
v/動詞 a/形容詞 d/副詞 h/前接成分 k/後接成分 i/習語 
j/簡稱 r/代詞 c/連詞 p/介詞 u/助詞 y/語氣助詞
e/嘆詞 o/擬聲詞 g/語素 w/標點 x/其它

測試程式碼(python版)如下所示:

# -*- coding: utf-8 -*-
"""
THULAC 分詞測試
"""

import thulac   

#預設模式,分詞的同時進行詞性標註
test1 = thulac.thulac()
text1 = test1.cut("杭州西湖風景很好,是旅遊勝地!")
print(text1)


#只進行分詞
test2 = thulac.thulac(seg_only=True)
text2 = test2.cut("杭州西湖風景很好,是旅遊勝地!")
print(text2)

測試結果如下圖所示:

這裡寫圖片描述

2.4 NLPIR (github star數 811)

NLPIR分詞系統(前身為2000年釋出的ICTCLAS詞法分析系統,gtihub連結:https://github.com/NLPIR-team/NLPIR),是由北京理工大學張華平博士研發的中文分詞系統,經過十餘年的不斷完善,擁有豐富的功能和強大的效能。NLPIR是一整套對原始文字集進行處理和加工的軟體,提供了中介軟體處理效果的視覺化展示,也可以作為小規模資料的處理加工工具。主要功能包括:中文分詞詞性標註命名實體識別使用者詞典新詞發現關鍵詞提取等功能。本文測試所採用的是PyNLPIRNLPIRPython版本,github連結:https://github.com/tsroten/pynlpir

測試程式碼如下所示:

# -*- coding: utf-8 -*-
"""
PYNLPIR 分詞測試
"""

import pynlpir


#開啟分詞器
pynlpir.open()

text1 = "杭州西湖風景很好,是旅遊勝地,每年吸引大量前來遊玩的遊客!" 

#分詞,預設開啟分詞和詞性標註功能
test1 = pynlpir.segment(text1)
#print(test1)
print('1.預設分詞模式:\n' + str(test1))

#將詞性標註語言變更為漢語
test2 = pynlpir.segment(text1,pos_english=False)
print('2.漢語標註模式:\n' + str(test2))


#關閉詞性標註
test3 = pynlpir.segment(text1,pos_tagging=False)
print('3.無詞性標註模式:\n' + str(test3))

測試結果如下圖所示:

這裡寫圖片描述