天天看點

中文分詞

本文首先介紹下中文分詞的基本原理,然後介紹下國内比較流行的中文分詞工具,如jieba、SnowNLP、THULAC、NLPIR,上述分詞工具都已經在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-idf和textrank模型抽取關鍵詞;

測試代碼如下所示:

-- 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))

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

測試結果如下圖所示:

這裡寫圖檔描述

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的最大特點是特别容易上手,用其進行中文文本時能夠得到不少有意思的結果,但不少功能比較簡單,還有待進一步完善。

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))

21

22

23

24

25

26

27

28

29

30

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版)如下所示:

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是一整套對原始文本集進行處理和加工的軟體,提供了中間件處理效果的可視化展示,也可以作為小規模資料的處理加工工具。主要功能包括:中文分詞,詞性标注,命名實體識别,使用者詞典、新詞發現與關鍵詞提取等功能。本文測試所采用的是PyNLPIR(NLPIR的Python版本,github連結:https://github.com/tsroten/pynlpir)

PYNLPIR 分詞測試

import pynlpir

打開分詞器

pynlpir.open()

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

分詞,預設打開分詞和詞性标注功能

test1 = pynlpir.segment(text1)

print(test1)

将詞性标注語言變更為漢語

關閉詞性标注

上一篇: Unit Testing