当前位置:   article > 正文

AI学习笔记(十六)中文分词_真歧义

真歧义

目录

中文分词简介

分词标准

切分歧义

未登录词

规则分词

正向最大匹配(Maximum Match Method, MM法)

逆向最大匹配(Reserve Maximum Match Method, RMM法)

双向最大匹配(Biderection  Match Method, RMM法)

统计分词-HMM模型

隐马尔可夫模型(Hidden Markov Model, HMM)

中文分词的应用

jieba分词工具


中文分词简介

词是一个完整语义的最小单位。分词技术是词性标注、命名实体识别、关键词提取等技术的基础。中文分词与欧语系的分词的不同在于,汉语结构与欧语系语种差异较大,对词的构成边界方面很难界定。比如,在英文中,单词本身就是“词”的表达,一篇英文文章就是“单词”加分隔符来表示的,而在汉语中,词以字为基本单位,但是一篇文章的语义表达却仍然以词来划分。

因此,在处理中文文本时,需要进行分词处理,将句子转化为词的表示,这个切词处理过程就是中文分词,是通过计算机自动识别出句子的词,在词间加入边界标记符,分隔出各个词汇。整个过程看似简单,然而实践起来却很复杂,主要的困难在于分词标准切分歧义未登录词三部分。

分词标准

比如人名,有的算法认为姓和名应该分开,有的认为不应该分开,这需要制定一个相对统一的标准。又比如“花草”,有的人认为是一个词,有的人认为应该划分为两个词“花/草”。莫种意义上,中文分词可以说是一个没有明确定义的问题。

切分歧义

不同的切分结果会有不同的含义,这又包含如下几种情况:

组合型歧义:分词粒度不同导致的不同切分结果。这个问题需要根据使用场景来选择。在文本分类,情感分析等文本分析场景下,粗粒度划分较好。

交集型歧义:不同切分结果共用相同的字,前后组合的不同导致不同的切分结果,这也需要通过整句话来区分。交集型歧义前后组合,变化很多,难以预测,故也有人称之为“偶发型歧义”。

真歧义:本身语法或语义没有问题,即使人工切分也会产生歧义。此时通过整句话还没有法切分,只能通过上下文语境来进行切分。

有专家统计,中文文本中的切分歧义出现频次为1.2词/100汉字,其中交集型歧义和组合型歧义占比为12:1。而对于真歧义,一般出现的概率不大。

未登录词

也叫新词发现,或者生词,未被词典收录的词。未登陆词一般分为如下几种:

1、新出现的词汇,比如一些网络热词;

2、专业名词,主要是人名、地名、组织机构

3、专业名词和研究领域词语

4、其他专有名词,比如新出现的电影名、产品名、书籍等。

未登录词对于分词精度的影响远远超过歧义切分。未登录词识别难度也很大,主要原因有:

1、未登陆词则鞥张速度往往比词典更新速度快很多,因此很难利用更新词典的方式解决未登录问题,不过词典越大越全,粉刺精度也会越高。因此一个大而全的词典还是相当重要的;

2、未登录词都是由普通词汇构成,因此一个大而全的词典还是相当重要的;

3、未登陆词还有可能与上下文中的其他词汇构成交集型协议

4、未登录词还有坑夹杂着英文字母和其他符号,这也嗲来了很大难度,比如“e租宝”。

对于词典中不包含的未登陆词,我们无法基于字符匹配匹配来进行识别。此时易于统计的分词就可以大显身手了,jieba分词采用了HMM隐马尔科夫模型来解决这个问题。


规则分词

基于规则的分词是一种机械分词方法,主要是通过维护词典,在切分语句时,将语句的每个字符串与词表中的词进行逐一匹配,找到则切分,否则不予切分。

按照匹配切分的方法,主要有正向最大匹配法、逆向最大匹配法以及双向最大匹配法三种方法。

正向最大匹配(Maximum Match Method, MM法)

1、假定/分词/词典/中的最长词有i个汉字字符,则用被处理文档的当前字串中的前i个字作为匹配字段,查找字典;

2、若字典中存在这样一个i字词,则匹配成功,匹配字段被作为一个词切分出来;

3、如果字典中找不到这样的一个i字词,则匹配失败,将匹配字段中的最后一个字去掉,对剩下的字中重新进行匹配处理;

4、如此进行下去,直到匹配成功,即切分处一个词或剩余字串的长度为零为止;

5、这样就完成了一轮匹配,然后去下一个i字字串进行匹配处理,直到文档被扫描完成为止。

逆向最大匹配(Reserve Maximum Match Method, RMM法)

逆向最大匹配的基本原理与MM法相同,不同的是分词切分的方向与MM法相反。

逆向最大匹配法从被处理文档的末端/开始/匹配/扫描,每次取最末端的第i个字符(i为词典中最长词数)作为匹配字段,若匹配失败,则去掉匹配字段最前面的一个字,继续匹配。

相应地,它使用的分词词典是逆向词典,其中的每个词条都将按逆序方式存放。在实际处理时,先将文档进行倒序排列处理,生成逆序文档。然后,根据逆序词典,对逆序文档用正向最大匹配法处理即可。

由于汉语中偏正结构较多,若从后向前匹配,可以适度体高精度。所以,逆向最大匹配法比正向最大匹配法的误差要小。相关统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的粗无虑为1/245。

双向最大匹配(Biderection  Match Method, RMM法)

双向最大匹配法是将正向最大匹配法得到的分词记过和逆向最大匹配法得到的结果进行比较,然后按照最大匹配原则,选取词数切分最少的作为结果。

据相关研究,中文中90.0%左右的句子,正向最大匹配和逆向最大匹配法完全重合且正确,只有大概9.0%的句子两种方法得到结果不一样,但其中必有一个是正确的,只有不到1.0%的句子,使用正向最大匹配法和逆向最大匹配法的切分虽重合却是错的,或者正向最大匹配法和逆向最大匹配法切分不同但两个都不对。这正是双向最大匹配法在实用中文信息处理系统中得以广泛应用的原因。


统计分词-HMM模型

随着大规模语料库的建立,统计机器学习方法的发展与研究,基于统计的中文分词算法渐渐成为主流。

其主要思想是把每个词看做是由词的最小单位的各个字组成的,如果相连的字在不同的文本中出现的次数越多,就证明这相连的字很可能就是一个词。

因此我们就可以利用字与字相邻出现的频率来反映成词的可靠度,统计语料中相邻出现的各个字的组合的频度,当组合频度高于某一个临界值时,我们便可以认为此自组可能会构成一个词语。

基于统计的分词算法,本质上是一个序列标注问题。将语句中的字,按照他们在词中的位置进行标注。标注主要有:B(词开始的一个字),E(词最后的一个字),M(词中间的字,可能多个),S(一个字表示的词);例如“你是一个小机灵鬼”,标注结果为“S/S/BE/BMME”,对应的分词结果为“你/是/一个/小机灵鬼”。

隐马尔可夫模型(Hidden Markov Model, HMM)

隐马尔可夫模型是统计模型,他用来描述一个含有隐含未知参数的马尔科夫过程。

X表示状态,y表示观察值,假设观察到的结果为YY=y(0),y(1),...,y(L-1);隐藏的条件为X=x(0),x(1),...,x(L-1)。长度为L,则马尔科夫模型的概率可以表达为:

{\color{Red} }P(Y)=\sum_{X}P(Y|X)P(X)

假设有三个不同的骰子。第一个骰子是平常见的骰子(这个骰子为D6),6个面,每个面(1,2,3,4,5,6)出现的概率是1/6。第二个骰子是个四面体(称这个骰子为D4),每个面(1,2,3,4)出现的概率是1/4。第三个骰子是个八面体(称这个骰子为D8),每个面(1,2,3,4,5,6,7,8)出现的概率是1/8。

开始掷骰子:

1、先从三个骰子里挑一个,挑到每一个骰子的概率都是1/3。

2、然后掷骰子,得到数字1,2,3,4,5,6,7,8中的一个;

3、不停地重复上述过程,得到一串数字,每个数字都是1,2,3,4,5,6,7,8中的一个。假如说掷到这么一串数字:1 6 3 5 2 7 3 5 2 4

这串数字叫做可见状态链(对应上面公式的观察到的结果为Y)。但是在隐马尔可夫模型中,不仅有这么一条可见状态链,还有一条隐藏状态链(对应上面公式隐藏的为X)。在这个例子中,这串隐含状态链就是所用模型的骰子的序列。比如,隐含状态链有可能是:D6 D8 D8 D6 D4 D8 D6 D4 D8。

一般来说,HMM中说到的马尔可夫链其实就是隐含的状态链,因为隐含状态(骰子)之间存在转换概率(tansition probability)。在这个例子中,D6的下一个状态是D4,D6,D8的概率是1/3。D4,D8的下一个状态是D4,D6,D8的转换概率也是一样的1/3。这样设定是为了最开始容易说清楚,但是我们其实可以是随意设定转换概率的,比如,我们可以这样定义,D6后面不能接D4,D6后面是D6的概率是0.9,是D8的概率是0.1。这样就是一个新的HMM。一般情况权重设定也确实是不一样的

同样的,尽管可见状态之间没有转换概率,但是隐含状态和可见状态之间的一个概率叫做输出概率(emission probability)。

这个例子中,六面骰(D6)产生1的概率是1/6。产生2,3,4,5的概率也都是1/6。我们同样可以输出概率进行其他定义。比如,一个被赌场动过手脚的六面骰子,掷出来是1的概率更大,是1/2,掷出来时2,3,4,5,6的概率是1/10。而三个骰子之间也是可以相互转换的。

其实对于HMM来说,如果提前知道所有隐藏状态之间的转换概率和所有隐含状态到所有可见状态之间的输出概率,做模拟是相当容易的。但是应用HMM模型时候,往往缺失了一部分信息的。有时候知道骰子有几种,每种骰子是什么,但是不知道掷出来的骰子的序列;有时候只是多看到了几次掷骰子的结果,剩下的什么都不知道。如何应用算法去估计这些缺失的信息,就成了一个很重要的问题

与HMM模型相关的算法分为三类,分别对应着解决三种问题:

1、评估问题

知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),想知道掷出这个结果的概率

2、解码问题

知道骰子有几种(隐含状态数量),每种骰子是什么(转换概率),根据掷骰子掷出的结果(可见状态链),想知道每次掷出来的都是哪种骰子(隐含状态链),即隐含状态的概率

3、学习问题

知道骰子有几种(隐含状态数量),不知道每种骰子是什么(转换概率),观测到很多次掷骰子的结果(可见状态链),想反推出每种骰子是什么(转换概率)


1、计算结果概率

知道骰子有几种,每种骰子是什么,每次掷的都是什么骰子,根据掷骰子掷出的结果,求产生这个结果的概率。该概率计算比较简单,每种情况相乘即可,如下图所示。

2、计算隐含状态概率

计算不可见的隐含状态概率,破解骰子顺序,主要有两种方法。

2.1 解最大似然路径问题

比如,知道有三个骰子,六面、四面和八面;也知道掷了10次的结果为(1 6 3 6 2 7 3 5 2 4),但不知道每次用了哪种骰子,想知道最有可能的骰子的概率,此时马尔可夫链不长,可穷举有可能的骰子序列,然后算出序列对应的概率,从里面选择最大的即可。但是,如果长的话,穷举的数量太大,很难实现。

2.2 维特比算法(Viterbi algorithm)

维特比算法实际是用动态规划解隐马尔可夫模型预测问题,即用动态规划(dynamic programming)求解最大路径(最优路径)。这时一条路径对应着一个状态序列。首先,如果只掷一次骰子,看到结果为1。对应的最大概率骰子序列就是D4,因此D4产生1的概率是1/4,高于1/6He1/8。

基于此进行拓展,假若掷两次骰子,结果为1,6。这时问题变得复杂起来,需要计算三个值,分别是第二个骰子是D6,D4,D8的最大概率。显然,要取到最大概率,第一个骰子必须为D4。这时,第二个骰子取到D6的最大概率是:

\small P2(D6)=P(D4) P(D4==1)\cdot P(D4\rightarrow D6)P(D6==6)=1/3\cdot 1/4\cdot 1/4\cdot 1/6

同样的,可以计算第二骰子是D4或D8的最大概率,可以发现,第二个骰子取到D6的概率最大,而使这个概率最大是,第一个骰子为D4,所以最大概率骰子序列就是D4 D6。

继续拓展,假若掷三次骰子,同样的,计算三个骰子分别是D6,D4,D8的最大概率。同样的,要去到最大概率,第二骰子必须为D6。这时,第三个骰子取到D4的最大概率是:

\small P3(D4)=P2P(D6)\cdot P(D6\rightarrow D3)\cdot P(D4==3)

同上,可以计算第三个骰子是D6或者D8的最大概率,可以发现,第三个骰子取到D4的频率最大。而使这个概率最大时,第二个骰子为D6,第一个骰子为D4。所以最大概率序列就是D4 D6 D4。

综上所述,求最大概率序列时需要做这么几件事:

1、不管序列多长,要从序列长度为1算起,算序列长度为1时取到骰子的最大概率;

2、逐渐增加长度,每增加一次,重新算一遍在这个长度下最后一个位置取到每个骰子的最大概率。当算到最后一位时,就知道最后一位是哪个骰子的概率最大了。

3、把对应这个最大概率的序列从后往前推出来。


中文分词的应用

HMM的典型介绍就是这个模型是一个五元组:

1、StatusSet:状态值集合(隐状态);

2、ObesevedSet:观测值集合(输出文字集合);

3、TransProbMatrix:转移概率矩阵(隐状态);

4、EmitProbMatrix:发射概率矩阵(隐状态表现维显状态的概率)

5、InitStatus:初始状态概率(隐状态)

HMM解决的三种问题:

1、参数(StatusSet、TransProbMatrix、EmitProbMatrix、InitStatus)已知的情况下,求解观察值序列;

2、参数(ObesevedSet、TransProbMatrix、EmitProbMatrix、InitStatus)已知的情况下,求解状态值序列;

3、参数(ObesevedSet)已知的情况下,求解(TransProbMatrix、EmitProbMatrix、InitStatus);

StatusSet(状态值集合)

为(B,M,E,S),(B:Begin,M:Middle,E:end,S:single),每个状态分别代表的是该字在词中的位置:

  • B代表该字是词语中的起始字;
  • M代表该字是词语中的中间字;
  • E代表该词是词语中的结束字;
  • S则代表该字是单字成词。

ObesevedSet:观测值集合

观察值集合就是所有汉字字符串(“小明硕士毕业于中国科学院计算所”),甚至包括标点符号所组成的集合;

需要注意的是,B后面只可能接M或E,不能接B或S。而M后面也只可能接M或E,不可能接B,S。

例如“小明硕士毕业于中国科学院计算所”的输出状态序列为:BEBEBMEBEBMEBES,据此进行分词:BE/BE/BME/BE/BME/BE/S,进而得出:“小明/硕士/毕业于/中国/科学院/计算/所”。

五元的关系通过Viterbi算法串接起来,ObeservedSet序列值就是Viterbi的输入,而StatusSet序列值是Viterbi的输出,输入和输出之间Viterbi算法还需要借助三个模型参数分别是TransProbMatrix、EmitProbMatrix、InitStatus。

InitStatus初始状态概率分布

句子的第一个字属于{B,M,E,S}这四种状态的概率。(注:-3.14+100作为负无穷,也就是对应的概率为0,下同)

TransProbMatrix转移概率矩阵

马尔可夫链最大的特点就是当前T=i时刻的状态Status(i),只和T=i时刻之前的n个状态有关。也就是:{StatusSet(i-1),StatusSet(i-2),StatusSet(i-3),...StatusSet(i-n)},TransProbMatrix其实就是一个4X4(4就是状态值集合的大小)的二维矩阵。矩阵的横坐标和纵坐标顺序是BEMS X BEMS。

EmitProbMatrix发射概率矩阵

其实是一个条件概率,根据HMM模型的基本假设“观察值独立性假设”,观察值取决于当前状态值,也就是(其中P(Obeserved[i] Starus[i])这个值就是从该矩阵中获取):

 

jieba分词工具

jieba分词是一个开源项目,在准确度和速度方面均不错,是平时常用的分词工具。其网址为:https://github.com/fxsjy/jieba

其支持三种分词模式

1、精确分词:试图将句子最精确的切开,适合文本分析

2、全模式:把句子中所有的可以成词的词语都扫描出来,速度非常快,但是不能解决歧义

3、搜索引擎模式:在精确模式上,对长词进行再次切分,提高recall,适合用于搜索引擎。

jieba分词综合了基于字符串匹配的算法和基于统计的算法,其分词步骤为:

1、初始化。加载词典文件,获取每个词和它出现的次数;

2、切分短语。利用正则,将文本切分为一个个语句,之后对语句进行分词;

3、构建DAG。通过字符串匹配,构建所有可能的分词情况的有向无环图,也就是DAG;

4、构建节点最大路径概率,以及结束位置。计算每个汉字节点到语句结尾的所有路径中的最大概率,并记下最大概率时在DAG中对应的该汉字成词的结束位置;

5、构建切分组合。根据节点路径,得到词语切分的结果,也就是分词结果;

6、HMM新词处理:对于新词,也就是dict.txt中没有的词语,我们通过统计方法来处理,jieba中次用了HMM隐马尔可夫模型来处理;

7、返回分词结果:通过yeild将上面步骤中切分好的词语逐个返回。yeild相对于list可以节省存储空间。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/826445
推荐阅读
相关标签
  

闽ICP备14008679号