中文分词算法研究

来源:互联网 发布:那些直播软件有黄播 编辑:程序博客网 时间:2024/05/16 17:10


分词算法有基于字典、基于规则和基于统计的,这里主要讲基于统计的方法。


中文分词基本算法主要分类                     

中文分词算法总结

介绍分词语料——    中文分词入门之资源   

互联网时代的社会语言学:基于SNS的文本数据挖掘


字标注问题
先看一个句子:我是一名程序员。将所有字分为4类,S表示单字,B表示词首,M表示词中,E表示词尾。
如果我们知道上述句子中每个字的类别,即:

我/S 是/S 一/B 名/E 程/B 序/M 员/E 。/S

那么我们就可以知道这个句子的分词结果:我 是 一名 程序员 。

从这里可以看出,分词问题转化成了一个分类问题,即对每个字分类。

目前主要以字标注的分词方法为主。所谓汉字标注分词,就是将分词过程看作为每个汉字进行分类的过程,通过对句子中每个汉字进行标记来切分。常见的汉字标注分词方法是根据汉字在词语中出现的不同位置标注不同的标签。例如可以用“O”表示汉字单独成词,“B”表示汉字出现在词头,“I”表示汉字出现在词的中间或是末尾。因此分词问题就被转化成一个纯粹的序列数据标记问题,可以使用很多序列标记算法进行分词计算。因此汉字标注的分词方法成为研究分词经常使用的方法。

HMM分词方法


介绍一下使用的资源,分词使用的语料来自于SIGHAN Bakeoff 2005的 icwb2-data.rar

四类标签的集合是 {B,E,M,S},其含义如下:

B:一个词的开始

E:一个词的结束

M:一个词的中间

S:单字成词

举例:你S现B在E应B该E去S幼B儿M园E了S


用四类标签为msr_training.utf8做好标记后,就可以开始用统计的方法构建一个HMM。我们打算构建一个2-gram(bigram)语言模型,也即一个1阶HMM,每个字符的标签分类只受前一个字符分类的影响。现在,我们需要求得HMM的状态转移矩阵 A 以及混合矩阵 B。其中:

                                     Aij = P(Cj|Ci)  =  P(Ci,Cj) / P(Ci) = Count(Ci,Cj) / Count(Ci)

                                     Bij = P(Oj|Ci)  =  P(Oj,Ci) / P(Ci) = Count(Oj,Ci) / Count(Ci)

公式中C = {B,E,M,S},O = {字符集合},Count代表频率。在计算Bij时,由于数据的稀疏性,很多字符未出现在训练集中,这导致概率为0的结果出现在B中,为了修补这个问题,我们采用加1的数据平滑技术,即:

                                     Bij = P(Oj|Ci)  =  (Count(Oj,Ci) + 1)/ Count(Ci)

设定初始向量Pi = {0.5, 0.0, 0.0, 0.5}(M和E不可能出现在句子的首位)。至此,HMM模型构建完毕。


如何利用隐马尔科夫模型解决分词问题,请看下面:

字标注问题

在找到解决方案之前,我们最好先用数学的语言来描述一下这个问题。当我们得到一个句子时,我们可以把它看做一个向量。令句子s有共计n个单词,第i个单词用xi来表示,显然s = x1, x2, ... xn。因此问题可以描述成,对于每个单词xi,我们需要分别给定一个标注yi,因而获得句子的标注y = y1, y2, ... yn。


综上所述,训练模型时我们期望对于任何一个句子s,我们需要得到所有可能出现的标注的概率p(y | s),其中概率最大的y即是我们需要的结果。最终的表达式为tagging(s)= arg max(p(y|s))。


接下来,我们需要考虑如何建立训练集并从中学习出上述的模型。首先,我需要获得一个已经标注好的语料库,语料库中有若干句子,每个句子中的每个词都已有标识。然后,对于语料库中出现的所有的句子s与对应的标识y,我们可以学习出条件概率p(y, s),即某个句子与其对应标识的出现概率。其次,由于语料库无法包含所有可能出现的句子,所以我们希望能够得到一个更加宽泛的表达式,通过贝叶斯公式,我们可以非常看出p(y, s) = p(y) * p(s | y),同时p(y | s) = p(y) * p(s | y) / p(s);我们需要比较的是p(y | s)中的最大值而无需获得p(y | s),因此显然p(s)的具体取值并不重要,因此我们只需要考虑tagging(s)= arg max(p(y) * p(s | y))。


由于语料库无法保存所有客观存在的句子,我们必须找到一种方法来估计p(y)与p(s | y)的取值,而其中一种非常有名的方法就是隐马尔科夫模型。


隐马尔科夫模型
我们依然回到上述问题,给定一个句子s = x1, x2, ... xn,我们给出一个标识组合y = y1, y2, ... yn,使得y = arg max(p(y) * p(s | y)) = arg max(p(x1, x2, ... , xn, y1, y2, ..., yn))。


我们对每个句子做一点优化:
1)增加一个开始符号”*“,我们定义所有句子都是以”*“开始,即X-1 = X0 = *;
2)增加一个结束符号”STOP“,我们定义所有句子都是以”STOP“结束。


同时,隐马尔科夫模型需要我们做一些额外的假设来简化模型:
1)yk只与前几个元素相关,即标识的语义相关性只影响前后几个元素;
2)单词xk与对应的yk不受其他单词的影响,即p(xi | yi)相互独立
.


经过简化以后,我们以三阶隐马尔科夫模型为例,表达式为 tagging(s)= arg max(p(y|s))=arg max(p(y1, y2, … yn | x1, x2, … xn) )= arg max(p(y) * p(s | y))=arg max(p(y1, y2, … yn) * p(x1, x2, … xn | y1, y2, … yn) )= arg max(∏q(yj | yj-2, yj-1) * ∏ e(xi | yi))。显然,简化后的模型,单个单词在语料库中出现的频率会远远高于句子整体出现的频率。


求解这个max问题可以用动态规划方法,即隐马尔科夫模型里的viterbi算法。现在我们可以写入一个观察序列,用Viterbi算法获得一个隐藏序列(分词结果),实现每个字都有一个状态,且这个状态链对应的概率是最大的


NLP | 自然语言处理 - 标注问题与隐马尔科夫模型(Tagging Problems, and Hidden Markov Models)


Itenyh版-用HMM做中文分词四:A Pure-HMM 分词器


基于HMM2-Trigram字符序列标注的中文分词器Java实现

中文分词与马尔科夫模型之二(隐马尔科夫模型与维特比)



最大熵模型


中文分词模型之最大熵模型


中文分词入门之字标注法3


使用Python,字标注及最大熵法进行中文分词

参考论文《Maximum Entropy Word Segmentation of Chinese Text



条件随机场


使用crf进行汉字标注方法很重要的一个问题就是特征选择。



深度学习


Deep Learning 在中文分词和词性标注任务中的应用 - peghoty - 博客频道 - CSDN.NET


利用 word2vec 训练的字向量进行中文分词


深度学习(三十八)初识DL在自然语言序列标注中的应用-未完待续




网上也有很多中文分词的开源项目:

ik-analyser:Java语言

http://code.google.com/p/ik-analyzer/

paoding

http://code.google.com/p/paoding/

cjk-tokenizer:C++实现

http://code.google.com/p/cjk-tokenizer/

mmseg4j:实现了 Chih-Hao Tsai 的 MMSeg 算法

http://code.google.com/p/mmseg4j/

imdict-chinese-analyzer:算法基于隐马尔科夫模型(Hidden Markov Model, HMM),是中国科学院计算技术研究所的ictclas中文分词程序的重新实现(基于Java),可以直接为lucene搜索引擎提供简体中文分词支持。

http://code.google.com/p/imdict-chinese-analyzer/

 

另外,还有

海量的中文分词,目前性能和效果最好的分词

http://www.hylanda.com

哈工大信息检索实验室的LTP平台,支持分词,标引,句法分析等多种任务。

http://ir.hit.edu.cn/demo/ltp/



0 0
原创粉丝点击