自然语言处理之中文分词算法

关于分词

目前有三大主流分词方法:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。

1、基于字符串匹配的分词方法

基于字符串匹配的分词方法又称为机械分词方法,它需要有一个初始的充分大的词典,然后将待分词的字符串与词典中的元素进行匹配,若能成功匹配,则将该词切分出来。
按扫描方向的不同,字符串匹配分词方法可以分为正相匹配和逆向匹配;按照不同长度的匹配优先度可以划分为最大匹配和最小匹配。

1.1正向最大匹配

1.从左到右将待切分句子的m个字符作为匹配字符,m为初始词典中最长词条的长度。
2.将字符与字典中元素进行匹配:
2.1.若匹配成功,则将这个字符作为一个词切分出来
2.2.若匹配不成功,则将这个字符的最后一个字去掉,再进行匹配,重复上述过程,知道切分完整个文本为止。
举个例子吧:
假设我们要切分的句子为“南京市长江大桥”,字典中最长的元素长度为5,则先取待切分句子的前5个字符“南京市长江”。字典中没有元素与之匹配,长度减一,则变成“南京市长”,匹配成功。
对剩余三个字“江大桥”再次进行正向最大匹配,会切成“江”、“大桥”;
整个句子切分完成为:南京市长、江、大桥;

1.2逆向最大匹配

逆向最大匹配思想与正向最大匹配基本相同,不同的是将扫描方向变成了从右往左,匹配不成功时,去掉最左边的字符。
实验表明,逆向最大匹配算法效果要优于正向最大匹配算法。
“南京市长江大桥”的逆向最大匹配:
1.取出“南京市长江大桥”的后5个字“市长江大桥”,字典中无匹配元素,将字符“市”去掉,发现词典中有匹配,切割下来;
2.对剩余的“南京市”进行分词,整体结果为:南京市、长江大桥

1.3双向最大匹配

双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的结果进行比较,从而决定正确的分词方法。
还是上面的例子,双向最大匹配的划分结果为:南京市长、南京市、长江大桥、江、大桥。
这类算法的优点是速度快,时间复杂度为O(n),实现简单;但是对于歧义和未登录词表现不佳。

2、基于理解的分词方法

其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。

3、基于统计的分词方法

主要思想:每个字都是词的最小单元,如果相连的字在不同的文本中出现的频率越多,这就越有可能是一个词。因此我们可以用相邻字出现的频率来衡量组词的可能性,当频率高于某个阈值时,我们可以认为这些字可能会构成一个词。
主要统计模型: N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model,HMM),最大熵模型(ME),条件随机场(Conditional Random Fields,CRF)等
优势:在实际运用中常常将字符串匹配分词和统计分词结合使用,这样既体现了匹配分词速度快、效率高的优点,同时又能运用统计分词识别生词、自动消除歧义等方面的特点。

3.1 N-gram模型思想

该模型基于这样一种假设,第n个词出现只与前面n-1个词相关,而与其他词都不相关。整句话的概率就是各个词出现概率的乘积。
对于一个句子T,假设它由n个词 w1,w2,w3,,wn w 1 , w 2 , w 3 , ⋯ , w n 组成的,则 p(T)=p(w1w2w3wn)=p(w1)p(w2|w1)p(w3|w1w2)p(wn|w1w2wn1) p ( T ) = p ( w 1 w 2 w 3 ⋯ w n ) = p ( w 1 ) p ( w 2 | w 1 ) p ( w 3 | w 1 w 2 ) ⋯ p ( w n | w 1 w 2 ⋯ w n − 1 ) ,计算这个式子很麻烦,我们引入马尔科夫假设:一个词的出现仅依赖于它前面有限的几个词。如果一个词的出现仅依赖于它前面出现的一个词,我们就称之为bigram。则上式变为: p(T)=p(w1)p(w2|w1)p(w3w2)p(wnwn1) p ( T ) = p ( w 1 ) p ( w 2 | w 1 ) p ( w 3 w 2 ) ⋯ p ( w n w n − 1 )
如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram。
以此类推,N元模型就是假设当前词的出现概率只同它前面的N-1个词有关。(实际中通常只用到二元模型)

3.2 隐马尔可夫模型(HMM)

3.2.1 隐马尔可夫模型简介

隐马尔可夫模型中的变量有两组。一组为状态变量{y1, y2, …, yn},其中yi表示第i时刻所处的状态,这些状态是隐藏的、不可观测的,因此又称为隐变量,隐变量的取值通常是离散的。第二组是观测变量{x1, x2, …, xn},其中xi表示第i时刻的观测值。
在任一时刻,观测变量的取值只与该时刻的状态变量有关,即xi由yi决定。而当前状态只与前一时刻的状态有关,与其他状态无关。

3.2.2 隐马尔可夫模型的三大问题

一般的,一个HMM可以表示为u=(S, K, A, B, π), 其中S是状态集合,K是输出符号也就是观察集合,A是状态转移概率,B是符号发射概率,π是初始状态的概率分布。HMM主要解决三个基本问题:
估计问题,给定一个观察序列O=O1,O2,O3,… ,Ot和模型u=(A,B,π),计算观察序列的概率;
序列问题,给定一个观察序列O=O1,O2,O3… Ot和模型μ=(A, B, π),计算最优的状态序列Q=q1,q2,q3…qt;
参数估计问题,给定一个观察序列O=O1,O2,O3… Ot,如何调节模型μ=(A,B, π)的参数,使得P(O|μ)最大。
三类问题的求解在这里略去。

3.2.3 隐马尔可夫模型分词方法

隐马尔可夫的三大问题分别对应了分词中的几个步骤。参数估计问题就是分词的学习阶段,通过海量的预料数据来学习归纳出分词模型的各个参数。状态序列问题是分词的执行阶段,通过观测变量(待分词句子的序列)来预测出最优的状态序列(分词结构)。
设状态集合S=(B.M,E,S),每个状态代表的是这个字在词语中的位置,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词;观察值集合K =(所有的汉字);则中文分词的问题就是通过观察序列来预测出最优的状态序列。
比如观察序列为:
O = 南京市长江大桥
预测的状态序列为:
Q = BMEBMME
根据这个状态序列我们可以进行切词:
BME/BMME/
所以切词结果如下:
南京市/长江大桥/
因为HMM分词算法是基于字的状态(BEMS)来进行分词的,因此很适合用于新词发现,某一个新词只要标记为如“BMME”,就算它没有在历史词典中出现过,HMM分词算法也能将它识别出来。

中文分词工具介绍

python常用的分词包有jieba分词、SnowNLP、THULAC、NLPIR 等。

1、jieba分词

jieba分词是国内使用人数最多的中文分词工具。

1.1、jieba分词的三种模式

(1)精确模式:试图将句子最精确地切分,适合文本分析;
(2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

1.2、jieba分词涉及的算法

jieba分词过程中主要涉及如下几种算法:
(1)基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);
(2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
(3)对于未登录词,采用了基于汉字成词能力的 HMM 模型,采用Viterbi 算法进行计算;
(4)基于Viterbi算法做词性标注;
(5)基于tf-idf和textrank模型抽取关键词;
jieba分词测试如下

import jieba
u="我来到北京清华大学"
#全模式
test1 = jieba.cut(u, cut_all=True)
print("全模式: " + "| ".join(test1))
#精确模式
test2 = jieba.cut(u, cut_all=False)
print("精确模式: " + "| ".join(test2))
#搜索引擎模式
test3= jieba.cut_for_search(u)  
print("搜索引擎模式:" + "| ".join(test3))

全模式: 我| 来到| 北京| 清华| 清华大学| 华大| 大学
精确模式: 我| 来到| 北京| 清华大学
搜索引擎模式:我| 来到| 北京| 清华| 华大| 大学| 清华大学

2、SnowNLP

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的最大特点是特别容易上手,用其处理中文文本时能够得到不少有意思的结果,但不少功能比较简单,还有待进一步完善。

3、THULAC

THULAC由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
(1)能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
(2)准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好方法效果相当。
(3)速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。

4、NLPIR

NLPIR分词系统是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词,词性标注,命名实体识别,用户词典、新词发现与关键词提取等功能。

你可能感兴趣的:(自然语言处理)