中文分词算法
Posted 区块链and语义研究实验室
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中文分词算法相关的知识,希望对你有一定的参考价值。
中文分词
中文分词指将一个汉字序列切分成一个个单独的词。现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。
基于字符串匹配的分词方法
基于字符串匹配的分词方法又称为机械分词方法,它需要有一个初始的充分大的词典,然后将待分词的字符串与词典中的元素进行匹配,若能成功匹配,则将该词切分出来。
按扫描方向的不同,字符串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度的匹配优先度可以划分为最大匹配和最小匹配。
正向最大匹配
1.从左到右将待切分句子的m个字符作为匹配字符,m为初始词典中最长词条的长度。
2.将字符与字典中元素进行匹配
(1)若匹配成功,则将这个字符作为一个词切分出来 ;
(2)若匹配不成功,则将这个字符的最后一个字去掉,再进行匹配,重复上述过程,直到切分完整个文本为止。
假设我们要切分的句子为“南京市长江大桥”,字典中最长的元素长度为5,则先取待切分句子的前5个字符“南京市长江”,字典中没有元素与之匹配,长度减一,则变成“南京市长”,匹配成功。
对剩余三个字“江大桥”再次进行正向最大匹配,会切成“江”、“大桥”;
整个句子切分完成为:南京市长、江、大桥。
逆向最大匹配
逆向最大匹配的思想与正向最大匹配基本相同,不同的是将扫描方向变成了从右往左,匹配不成功时,去掉最左边的字符。实验表明,逆向最大匹配算法效果要优于正向最大匹配算法。
“南京市长江大桥”的逆向最大匹配:
1.取出“南京市长江大桥”的后5个字“市长江大桥”,字典中无匹配元素,将字符“市”去掉,发现词典中有匹配,切割下来;
2.对剩余的“南京市”进行分词;
整体结果为:南京市、长江大桥。
双向最大匹配
双向最大匹配法是将正向最大匹配法得到的分词结果和逆向最大匹配法得到的分词结果进行比较,从而决定正确的分词方法。
还是上面的例子,双向最大匹配的划分结果为:南京市长、南京市、长江大桥、江、大桥。
该算法的优点是速度快,时间复杂度为O(n),实现简单;但是对于歧义和未登录词表现不佳。
基于理解的分词方法
基于理解的分词其基本思想就是在分词的同时进行句法、语义分析,利用句法信息和语义信息来处理歧义现象。它通常包括三个部分:分词子系统、句法语义子系统、总控部分。由于汉语语言知识的笼统、复杂性,难以将各种语言信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
基于统计的分词方法
主要思想:
每个字都是词的最小单元,如果相连的字在不同的文本中出现的频率越多,这就越有可能是一个词。因此我们可以用相邻字出现的频率来衡量组词的可能性,当频率高于某个阈值时,我们可以认为这些字可能会构成一个词。
主要统计模型:
N元文法模型(N-gram),隐马尔可夫模型(Hidden Markov Model,HMM),最大熵模型(ME),条件随机场(Conditional Random Fields,CRF)等 。
优势:
在实际运用中常常将字符串匹配分词和统计分词结合使用,这样既体现了匹配分词速度快、效率高的优点,同时又能运用统计分词识别生词、自动消除歧义等方面的特点。
N-gram模型
该模型基于这样一种假设,第n个词出现只与前面n-1个词相关,而与其他词都不相关。整句话的概率就是各个词出现概率的乘积。对于一个句子T,假设它由n个词w1,w2,w3,⋯,wn组成,则
计算这个式子很麻烦,因此引入马尔科夫假设:一个词的出现仅依赖于它前面有限的几个词。如果一个词的出现仅依赖于它前面出现的一个词,我们就称之为bigram。则上式变为:
如果一个词的出现仅依赖于它前面出现的两个词,那么我们就称之为trigram。以此类推,N元模型就是假设当前词的出现概率只同它前面的N-1个词有关。
隐马尔可夫模型(HMM)
一般的,一个HMM可以表示为u=(S, K, A, B, π), 其中S是状态集合,K是输出符号也就是观察集合,A是状态转移概率,B是符号发射概率,π是初始状态的概率分布。HMM主要解决三个基本问题:
(1)估计问题,给定一个观察序列O=O1,O2,O3,… ,Ot和模型u=(A,B,π),计算观察序列的概率;
(2)序列问题,给定一个观察序列O=O1,O2,O3… Ot和模型μ=(A,B,π),计算最优的状态序列Q=q1,q2,q3…qt;
(3)参数估计问题,给定一个观察序列O=O1,O2,O3… Ot,如何调节模型μ=(A,B, π)的参数,使得P(O|μ)最大。
隐马尔可夫模型中的变量有两组。一组为状态变量{y1,y2,…,yn},其中yi表示第i时刻所处的状态,这些状态是隐藏的、不可观测的,因此又称为隐变量,隐变量的取值通常是离散的。第二组是观测变量{x1, x2, …, xn},其中xi表示第i时刻的观测值。
在任一时刻,观测变量的取值只与该时刻的状态变量有关,即xi由yi决定。而当前状态只与前一时刻的状态有关,与其他状态无关。
设状态集合S=(B,M,E,S),每个状态代表的是这个字在词语中的位置,B代表该字是词语中的起始字,M代表是词语中的中间字,E代表是词语中的结束字,S则代表是单字成词;观察值集合K =(所有的汉字);则中文分词的问题就是通过观察序列来预测出最优的状态序列。比如观察序列为:
O = 南京市长江大桥
预测的状态序列为:
Q = BMEBMME
根据这个状态序列我们可以进行切词:
BME/BMME/
所以切词结果如下:
南京市/长江大桥/
因为HMM分词算法是基于字的状态(BEMS)来进行分词的,因此适合用于新词发现,某一个新词只要标记为如“BMME”,就算它没有在历史词典中出现过,HMM分词算法也能将它识别出来。
分词中的难点
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让计算机理解中文语言更是困难。因此,在中文分词过程中,有两大难题需要我们进行突破。
歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法。例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交叉歧义。像这种交叉歧义十分常见。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
交叉歧义相对组合歧义来说是还算比较容易处理,组合歧义就必须根据整个句子来判断了。例如,在句子“这个门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。
新词识别
新词,专业术语称为未登录词。也就是那些在字典中都没有收录过,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”已经不能算作词了。
新词中除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要,目前新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
中文分词工具介绍
python常用的分词包有jieba分词、SnowNLP、THULAC、NLPIR 等。
jieba分词
jieba分词是国内使用人数最多的中文分词工具。具有三种模式:
(1)精确模式:试图将句子最精确地切分,适合文本分析;
(2)全模式:把句子中所有可以成词的词语都扫描出来,速度非常快,但是不能解决歧义;
(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
jieba分词过程中主要涉及如下几种算法:
(1)基于前缀词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图 (DAG);
(2)采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合;
(3)对于未登录词,采用了基于汉字成词能力的 HMM 模型,采用Viterbi 算法进行计算;
(4)基于Viterbi算法做词性标注;
(5)基于tf-idf和textrank模型抽取关键词;
jieba分词测试如下:
全模式:我| 来到| 北京| 清华| 清华大学| 华大| 大学
精确模式:我| 来到| 北京| 清华大学
搜索引擎模式:我| 来到| 北京| 清华| 华大| 大学| 清华大学
SnowNLP
SnowNLP可以方便地处理中文文本内容,主要包括如下几个功能:
(1)中文分词;
(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的最大特点是特别容易上手,用其处理中文文本时能够得到不少有意思的结果,但不少功能比较简单,还有待进一步完善。
THULAC
THULAC由清华大学自然语言处理与社会人文计算实验室研制推出的一套中文词法分析工具包,具有中文分词和词性标注功能。THULAC具有如下几个特点:
(1)能力强。利用我们集成的目前世界上规模最大的人工分词和词性标注中文语料库(约含5800万字)训练而成,模型标注能力强大。
(2)准确率高。该工具包在标准数据集Chinese Treebank(CTB5)上分词的F1值可达97.3%,词性标注的F1值可达到92.9%,与该数据集上最好的方法效果相当。
(3)速度较快。同时进行分词和词性标注速度为300KB/s,每秒可处理约15万字。只进行分词速度可达到1.3MB/s。
NLPIR
NLPIR分词系统是由北京理工大学张华平博士研发的中文分词系统,经过十余年的不断完善,拥有丰富的功能和强大的性能。NLPIR是一整套对原始文本集进行处理和加工的软件,提供了中间件处理效果的可视化展示,也可以作为小规模数据的处理加工工具。主要功能包括:中文分词,词性标注,命名实体识别,用户词典、新词发现与关键词提取等功能。
区块链&语义实验室
以上是关于中文分词算法的主要内容,如果未能解决你的问题,请参考以下文章