处理传统分词算法产生的歧义及文本挖掘技术拓展
The Ambiguity Processing in Classic SegmentationAlgorithm and Development in Text MiningTechnology
摘要 随着信息技术的快速发展,人们已经从信息缺乏的时代过渡到了信息极度丰富的时代。文本信息是人们用于信息记载和信息传播的最重要的媒体之一,如何迅速、有效地从大量数据中找到所需的信息已经成为信息服务领域中的重要问题。文本挖掘是抽取有效、新颖、有用、可理解的、散布在文本文件中的有价值知识,并且利用这些知识更好地组织信息的过程。中文文本挖掘技术成败的关键在于文本中词汇切分的成功与否。 而分词算法正是中文文本挖掘技术的关键技术。由于汉语的书写习惯,汉语句子中词与词之间的标志是隐含的,英文的单词与单词之间有空格所以不存在分词问题。而中文的每一句中词与词之间是没有空格的,因而必须采用某种技术将其分开。 而这种技术就是本文研究的分词算法。
关键词 正向最大匹配分词算法 逆向最大匹配分词算法 相对词库量 统计分词算法 互信息 条件概率 t-测试 正则表达式 自然语言处理
Key Words Forward maximum matching word segmentation algorithm,Reverse Maximum Matching word segmentation algorithm, Relative lexicon volume,Statistical word segmentation algorithm, Interact Information,Conditional Probability, t-test, Regular Expressions, Natural Language Processing
引言
随着信息技术的快速发展,人们已经从信息缺乏的时代过渡到了信息极度丰富的时代。文本信息是人们用于信息记载和信息传播的最重要的媒体之一,如何迅速、有效地从大量数据中找到所需的信息已经成为信息服务领域中的重要问题。文本挖掘是抽取有效、新颖、有用、可理解的、散布在文本文件中的有价值知识,并且利用这些知识更好地组织信息的过程。中文文本挖掘技术成败的关键在于文本中词汇切分的成功与否[1]。 而分词算法正是中文文本挖掘技术的关键技术。由于汉语的书写习惯,汉语句子中词与词之间的标志是隐含的,英文的单词与单词之间有空格所以不存在分词问题。而中文的每一句中词与词之间是没有空格的,因而必须采用某种技术将其分开[2]。 而这种技术就是本文研究的分词算法。
中文文本分词算法从20 世纪80 年代以来就一直是一个研究热点,由于中文语言的复杂性使之一直处于发展阶段。中文分词是中文信息处理的基础与关键,从实际应用上来说,中文分词又是实现计算机人工智能、智能搜索、人机对话、中文翻译以及Web 信息处理等核心应用的关键技术[2]。 所以,分词算法是实现计算机智能化的一个重要手段和强大工具。目前中文分词算法仅仅发展到基于词库的机械分词算法,以及基于统计分析的无词典分词算法[1]。机械分词算法分为最大匹配分词算法以及最少切分分词算法,而最大匹配分词算法又分为正向最大匹配分词算法和逆向最大匹配分词算法,这两种分词算法又有增字法和减字法之分[3]。统计分词算法是根据文章中所有相邻单字组合的概率判断其是否构成词语,从而进行分词。这两种分词算法各有长短:机械分词算法的长处是能快速、准确的对文本进行切割,但其缺点却是非常致命的:单独使用一种机械分词算法极有可能出现分词错误(我们称之为歧义),并且算法本身不能处理其分词错误产生的歧义;而基于统计的无词典分词算法的优点是能基于文章识别词语,错误率较低,缺点就是计算量极其庞大,编写逻辑负担极重,而且仅仅只能面向文章分词,无法应对单句分词。
我们对分词算法的研究重点在于对歧义的消除。我们借助统计分词算法中应用到的统计学中的相关函数模型分析计算某几个字是否能够构成词语,从而判断正确的分词方案。利用科学的函数模型,我们能大大地提高分词算法的准确率。
我们的分词算法,在明确相关理论之后,逐渐成为现实。
一、传统分词算法——机械分词算法的初步分词
机械分词算法分为最大匹配分词算法以及最少切分
分词算法,而最大匹配分词算法又分为正向最大匹配分词算法和逆向最大匹配分词算法,这两种分词算法又有增字法和减字法之分[3]。据统计,减字法下的正向、逆向最大匹配分词算法的错误率分别为1/169及1/245,而增字法下的正向、逆向最大匹配分词算法及最少切分分词算法的错误率要远高于前两者。在权衡利弊后我们决定放弃增字法下的正向、逆向最大匹配分词算法及最少切分分词算法,采用减字法下的正向最大匹配分词算法及逆向最大匹配分词算法。
在上文的基础上,我们开始设计减字法下正向最大匹配分词算法的算法流程:
减字法下的逆向最大匹配分词算法与其相似,基本结构如下:
机械分词算法的算法结构基本相似,不同点在于分词开始的方向。
注意,汉字单字、西文字母、数字、符号等我们均将其作为独立词语处理。
我们成功的编写出机械分词算法以后,我们从网上获取了一些文章开始对其进行测试。在测试的过程中,我们发现了机械分词算法无论是从哪个方向开始分词,都难以避免因算法本身特点而造成的分词失误。对此我们称之为歧义。关于歧义,我们将在下文进行详细讨论。
二、歧义与概统函数模型
1、歧义和消除歧义
上文已有介绍,我们应用到的传统分词算法——机械分词算法中,减字法下的正向、逆向最大匹配分词算法的错误率,即产生歧义的概率分别为1/169及1/245。这对于日益增强的文本信息挖掘需求来说,错误率太高了。歧义的出现,是机械分词算法不可避免的情况。无论词库有多么完善,都无法避免。相反地,当词库完善到一定程度后越完善越容易出现歧义。对此我们在这里给出相关统计图表:(那些图表在QQ日志显示不了无法贴在这里,不明原因)
名词解释:相对词库词条量。相对词库词条量是描述词库完善程度的一个参数。我们规定其为:。文本词条量就是该文本中出现的有效词条的数量。即在文本中若有一词语出现次数不小于1,我们则记该文本有一条有效词条。以此类推。
我们提出这个概念,是因为我们在分词测试时发现,词库的完善程度具有相对性。现假设我们的词库中收录了1000条常见词条。若用该词库去对一小学生作文进行分词,则绰绰有余,因为小学生的词汇量有限;若对一篇学术性论文进行分词,则显得相当不足。因此我们就提出了词库的完善程度具有相对性这一概念,并给出这一参数以表示词库的相对完善程度。
由上图可以看出,当词库开始逐渐完善时,准确率会突然下降,从这里开始歧义的数量有所上升;当准确率接近100%后准确率随词库完善程度的增加而降低,这时歧义将大量产生。
由上文可知,歧义无可避免,于是我们只能去消除它。
我们查阅了相关的文献资料,再整合我们实际操作得出的数据,我们得出机械分词算法产生的歧义分为两大类:真歧义和伪歧义。[4]
伪歧义就是其分词结果违反了一般语法规律的歧义,也称机械歧义。例如:“我爱情报”,正向最大匹配分词算法得出:“我|爱情|报”的结论;而逆向最大匹配算法得出:“我|爱|情报”的结论,此时出现歧义。我们将产生歧义的字段称为歧义字段,此时“爱情报”就是歧义字段,由于它具有的歧义性质是伪歧义,我们称之为伪歧义字段。
真歧义就是无论哪种分词方法得出的结论都没有违反语法规律,只针对单句无法消除歧义。真歧义其实就是我们汉语中的歧义。例如:“这人质问”,正向最大匹配分词算法的结论是“这|人质|问”,逆向最大匹配分词算法得出“这|人|质问”的结论。两者都没有出现语法错误。那么,“人质问”称为真歧义字段。
无论是真歧义字段还是伪歧义字段,都是歧义字段,都必须消除。由于我们设计的算法的特点——由双向最大匹配分词算法产生两种结果——从而使歧义的处理变得更加简单。只要我们比对一下两种方案中的不同之处,再稍加处理,即可得到歧义字段。由于机械分词算法的结果必然有一个是准确的。因此,消除歧义的过程,就是肯定一种结果,否定另外一种结果。
自然语言的处理是一项非常庞大而复杂的工程。由于自然语言的不定向性,使得它们的规律令人难以捉摸。但是,无论多么复杂多么随机的结构,其背后必定有一定的数学关系。我们借助概率统计上的相关定义公式,得出一些可以处理自然语言的概统函数模型。根据这些函数模型,我们就能够发掘出自然语言微妙的数学关系。
2概统函数模型
概统函数模型应用于统计分词算法中,通过计算指定字符串在文本中自身的结合程度及倾向程度,以判断该字符串在该文段中是否构成词语。现在我们将其从统计分词算法中提取出来,用于判断歧义字段正确的分词方案。
这里,我们参考了文献[5]提出的概率统计的相关概念。根据这些概念我们推导出如下两种函数模型:
1)、互信息
互信息是计算字符串各个元素之间的结合程度的函数模型。我们定义其为:Inf(XY)。
下面我们开始推导出Inf(XY)的函数表达式:
根据定义,Inf(XY)表示汉字XY之间的结合程度。什么参数能表示XY结合的程度呢?我们有P(XY),即XY在文本中邻接同现的概率。
但是,P(XY)反映的是XY之间的关系,而Inf(XY)表示的,是X、Y之间的关系。因此,我们必须将P(XY)除上P(X)、P(Y)的乘积,即:
但是,这个数值范围在[0,+∞)上,且我们根据互信息的定义,互信息的值将在如下两个区间:[0,1]、(1,+∞],这两个区间大小相差太大了。于是我们利用对数将进行标准化、统一化,使其数值控制在我们能操控的范围,方便我们进行比对。因此,我们有:
关于对数的底n,我们采用e值,使该对数为自然对数。关于以e值为底的优越性,下文介绍。
2)、t-测试函数
t-测试函数是表示某字符串中, 中间字符的倾向程度。我们定义其为 T(XYZ)
下面我们来推导出T(XYZ)的函数表达式:
根据定义,T(XYZ)是关于汉字Y关于X、Z的倾向程度。因此,我们可以根据概率差进行计算。即:P(YZ)- P(XY)。
但根据如上式子,是否其中一组字符串出现的次数越多,则肯定Y倾向于该字符呢?不是的。由于YZ与XY具有对立性,即:XY则非YZ, YZ则非XY。因此,我们得出判断中间字符Y的倾向程度的标准参考值,是上式除以这两组字符的互不相干度的值。
那么,两组字符串之间的互不相干度的值应该是什么呢?我们联想到了物理上力学的一个规律:二力垂直则互不相干,因此,我们利用这一特点对其与我们的互不相干度进行类比讨论:
如右图,作用于物体的F 与该物体所受重力mg垂直。则无论F的大小如何改变,mg方向上的加速度不受影响。这就是这两个力之间的互不相干性。因此我们将这个概念引入到自然语言的处理当中:XY与YZ 各自的独立性就相当于F 与 mg的大小,而这两组字符串的互不相干度的值就相当于这两个力的合力。即:
那么,XY的独立性,YZ的独立性又应该是什么呢?在上文中,我们提到了互信息这一概念。互信息是表示一个字符串中各个元素之间的结合程度。因此,互信息是仅仅与该字符串有关,与其它字符无关。这就是关于字符串的独立性。因此,我们规定XY 、YZ各自的独立性为各自的互信息值。
因此,我们有:
现在我们已经完善了关于自然语言的相关概统函数模型。借助这些函数模型,我们可以进行歧义的消除处理。
3、概统函数模型处理歧义字段:
上文已经简单介绍了我们应用于消除歧义的相关函数模型。这里我们将论述其相关定义及应用,再介绍我们的歧义消除算法流程。
1)、互信息的首处理:
关于互信息函数,上文已作介绍。现在我们介绍其定义:
对于汉字X、Y,判断其在文本中的结合程度,我们有Inf(XY)。
得出这两个汉字之间的互信息后,我们就可以根据互信息进行判断。互信息按作用分为单一互信息和对立互信息。单一互信息是针对单一一对汉字结合成词的概率的分析数据;而对立互信息则是针对两对叠交汉字各自的互信息的比较数据。
对于单一互信息,我们有如下定义:
Inf(XY)> 0,XY呈正结合。互信息绝对值越大,结合能力越大。
Inf(XY)< 0,XY呈负结合。互信息绝对值越大,离散程度越大。
Inf(XY)= 0,XY没有任何关系。
一般地,只要XY结合次数不为0,互信息值就不可能为0。
对于对立互信息,如歧义字段XYZ,当Inf(XY)> Inf(YZ)时,XY结合成词的可能将大于YZ;反之, YZ结合成词的可能将大于XY。
对于歧义的消除,我们需要利用对立互信息的比较数据,得出歧义字段XYZ准确的分词方案。但是,我们在对大量的新闻和文献的分词测试中发现,互信息函数也有“失灵”的情况,如即使Inf(XY)> Inf(YZ),但实际上正确的分词方案应是X|YZ 。这种情况我们称之为互信息盲区。
为了确定互信息盲区的范围,我们从网上获取了12篇共25617字的新闻进行了分词测试。我们从分词中挖掘出了117组歧义字段,并计算出其各自的对立互信息差的绝对值,统计出下表:
通过分析上图,我们发现互信息差的绝对值大量地集中在[0,1]这个区间。我们通过对所有歧义字段的分析,发现陷入互信息盲区的歧义字段其对立互信息差的绝对值都集中在该区间。我们根据该样本得出如下图表:
如上两图表明,若对立互信息相差越小,则其发生互信息盲区的可能越高。这是互信息中对数以e为底的情况。这里就体现出了我们当初选用e为底的优越性:使字符串的互信息之差尽量的小,很好地控制了互信息盲区的范围,减少了我们的计算量。因此,我们规定,当|Inf(XY)- Inf(YZ)|<1时,XYZ陷入互信息盲区,不能用互信息处理。因此我们得出利用互信息进行歧义处理的算法流程:
值得注意的是,这里举例说明的是歧义字段长度为3的情况,这只需要应用到适用词语长度为2的互信息函数。经我们大量实验的数据表明,歧义字段常见长度为3-5。这将会出现需要应用适用于不同长度词语的互信息函数的情况。这里给出适用词语长度为3、4的互信息函数:
对于如上两种函数,其定义与Inf(XY)相同。其对立互信息的定义也相同。
2)、t-测试后处理
t-测试是关于汉字XYZ之间,Y的倾向程度。与上下文密切相关。这样就能很好的利用文字与上下文的关系,进行独立决断。因此,t-测试是一种独立决断整个歧义字段的正确分词方案的算法,我们可以利用它处理陷入互信息盲区的歧义字段。
关于t-测试,我们有如下规定:
若T(XYZ)> 0 ,则Y 关于Z 的连接倾向大于 Y 关于 X 。绝对值越大,倾向越大。
若T(XYZ)< 0 ,则Y 关于 X 的连接倾向大于Y 关于 Z 。绝对值越大,倾向越大。
若T(XYZ)= 0 ,则XYZ无任何连接倾向。
一般地,若XYZ同时出现次数不为0 ,则T(XYZ)不可能为0 。
上文给出的,是歧义字段长度为3的适用公式及定义。但是,上文亦有谈到,歧义字段的长度有3 – 5的情况。同样地,t-测试也需要有应对歧义字段不同的长度的处理策略。关于这点,单独讨论函数表达式无法完整表达出其算法特点,所以我们将在下面进行讨论。
现在针对歧义字段的不同长度进行分类讨论:
① 歧义字段长度为3的处理策略:
这种情况是最常见的歧义字段,同时也是最容易处理的歧义字段。一般地,对于歧义字段XYZ,我们只需要判断Y的倾向程度,即可得出正确的分词方案。
因此:我们有流程图:
② 歧义字段长度为4的处理策略:
若歧义字段长度为4,则通过我们上文给出的T(XYZ)是无法进行分析的。因此,这里我们给出处理歧义字段长度为4的T函数:t-测试差函数:
T(W XYZ)=T(WXY)- T(XYZ)
这里,T(WXYZ)表示字符串WXYZ中中间两个字符X、Y的倾向程度。关于T(WXYZ),我们有如下定义:
T(WXYZ)> 0,X、Y相互吸引,倾向于连。T(WXYZ)的绝对值越大,连的倾向越强。
T(WXYZ)< 0,X、Y相互排斥,倾向于断。T(WXYZ)的绝对值越大,断的倾向越强。
T(WXYZ)= 0,X、Y无任何倾向。
一般地,只要WXYZ出现次数不为0,则T(WXYZ)不可能为0。
现在我们来讨论关于歧义字段WXYZ如何利用T(WXYZ)进行歧义处理:
若T(WXYZ)>0,则WXYZ有W|XY|Z、WXY|Z、W|XYZ这三种情况的倾向。此时,我们首先对WXYZ中的WXY进行t-测试检验。若T(WXY)>0 ,则肯定WXY|Z;否则,将对XYZ进行t-测试。此时,若T(XYZ)>0,则肯定W|XY|Z,否则肯定W|XYZ。
若T(WXYZ)<0,则WXYZ有WX|YZ倾向。此时无需继续判决。
根据上文,我们整理出当歧义字段的长度为4时的处理策略的流程图:
③ 歧义字段长度为5 的处理策略:
对于长度为5的歧义字段,我们遵循一般的处理策略:判断中间字符的倾向程度。现有歧义字段VWXYZ,则我们通过T(WXY)来判断中间字符X的倾向程度。
若T(WXY)<0,则X倾向于VW,于是对于VWX,我们首先用互信息判断其是否独立成词。若Inf(VWX)>0,则认定其为一个词语。否则,我们用t-测试判断W的倾向。若T(VWX)<0,则肯定VW|X;若T(VWX)>0,则肯定V|WX。接下来是对YZ的分析。我们之间判断其互信息即可。若Inf(YZ)>0,则YZ,否则就是Y|Z。最后两段相加即可得出最终结果。
若T(WXY)>0,则X倾向于YZ。接下来的算法思路与上文相似,在此不作赘述。
根据上文描述的算法,我们绘出歧义字段长度为5的处理策略的流程图:
看到这里,或许你已经发现,所谓借助t-测试进行歧义消除并不是肯定某种分词方案,而是独立地进行了分词。事实正是如此。在某些统计分词算法中就是利用了t-测试的返回值进行分词。所以我们这种“消除歧义”的算法是从统计分词算法理论中直接提取出来的。当然,我们首先给定了这个算法一个目标分析段——歧义字段,这就避免了函数“盲目”地寻找分析段的麻烦。因此,我们设计的分词算法,是一种糅合了机械分词算法和统计分词算法的新型分词算法。但一般地,用t-测试进行重分词的结果与机械分词算法的其中一种结果吻合。
上文已经详细介绍了歧义处理的各种策略。但是世界上没有任何一种算法是完美的。即使我们预先考虑了多种可能出现的情况并一一写出了应对策略算法,但是我们不能排除算法在实际运行中可能会出现一些我们意料之外的情况。现在,我们针对t-测试可能出现失误而造成的影响制定了应对措施:互信息直接比对。即忽略互信息盲区的可能,直接用对立互信息比对出结果,直接给出方案。这种措施,将在t-测试无返回值的时候启动。
应对自然语言中最复杂的语言——汉语的自动化处理:分词算法的歧义处理,到这里全部讨论完毕。现在我们将歧义处理的总算法描述出来。
首先先获取歧义字段,接下来获取它在正向、逆向最大匹配分词算法各自的分词方案,然后获取这两种方案中的长字段。接下来对两组长字段进行对立互信息分析,若非互信息盲区,则根据互信息的大小判断正确的长字段,输出该歧义字段正确的分词方案;若对立互信息差的绝对值小于1,则该歧义字段陷入互信息盲区,将该歧义字段提交到t-测试总函数中。t-测试总函数根据歧义字段的词长将该字段分配到合适其词长的处理策略中。处理策略返回其分词方案到t-测试总函数中,再由t-测试总函数将分词方案提交回歧义处理算法,又由歧义处理算法输出分词结果;若返回空值,则启动互信息直接比对方案,直接比对对立互信息大小,输出分词结果。
下面是歧义处理总算法的流程图:
这里无法显示图片
三、实验验证与探讨
1、正确率测试
现在,我们已经完成了处理传统分词算法产生的歧义的相关算法,并按照这些算法在Visual Basic 6.0平台上编写出了算法演示程序。我们从互联网上获取了一些新闻,并对这些新闻进行了分词处理。我们总共挖掘出117个歧义字段,并对处理结果人工进行判断,结果这117个歧义字段中歧义处理正确的有105个 ,正确率为89.7435897%,这是对于歧义处理的正确率。由于我们的分词算法是基于传统的机械分词,因此,我们根据机械分词算法的准确率99.5918367%,计算得出最终正确率:99.9581371%
根据上文可知,没有添加歧义处理的机械分词算法的准确率会随词库完善程度的增加而波动。那么对于我们现在添加歧义处理后的分词算法,这一关系又将如何呢?下面是我们统计得出的添加歧义处理算法的机械分词算法准确率与词库完善程度的关系表:
通过分析上图,我们发现添加歧义处理后,机械分词算法在词库不断完善的情况下准确率不断逼近于100%
我们对本算法可能产生歧义处理失误的原因进行了分析,其结果有如下三种:1、词库不够完善,2、歧义处理算法有缺陷,3、概率统计函数仍然不够完善。
对于可能1,我们应尽量地从各方获取词库,不断地完善我们的词库收录工作。
对于可能2,我们目前仍然无法找出算法逻辑上的错误。若造成歧义处理失误的原因正是在此,我们希望有人能给予指正。
对于可能3,我们分析了我们应用到的概统函数模型的原理,以及我们自己推导出的公式,认为若因函数公式而造成歧义处理失误,应无法避免。因为概率统计仍然无法真实完整地反映自然语言的数学关系,而且,自然语言本身并无明显的数学关系。我们所谓挖掘数学关系,仅仅只是分析其趋势而已。当然,我们完全不排除是因我们应用的函数公式不够科学而造成处理失误的可能。如果真的是由于函数不够科学,我们希望能够得到指正。
我们分析得出产生失误的原因并已在上文进行了探讨。如果是由于其他我们没有分析到的原因造成了处理失误,我们期待有人给以提出并协助修正。总体上看,我们设计的分词算法歧义处理已经大大地提高了传统分词算法的准确率。
2、效率测试
解决了歧义的问题以后,我们就要考虑分词算法的效率问题。由于我们的分词算法要经历两次机械分词,故效率问题已大打折扣。我们尝试对一篇2563字的文章进行测试,计时得出机械分词耗时18.63秒,歧义处理耗时0.02秒。前后共需18.65秒。如此缓慢的速度对用户无疑是一种折磨。但是我们综合分析了算法结构和计算机处理速度,认为优化算法结构无法有效地提高效率。若要提高效率,则应在程序上下点功夫。对于编程技巧这类问题,与本文讨论的算法思路无关。在此不作介绍。
四、文本挖掘技术拓展
上文已经介绍了关于机械分词算法及其歧义处理。但是,随着时代的进步和发展,文本挖掘这一自然语言处理技术已不满足于仅仅只是简单的分词了,我们还需要挖掘一些“其他的东西”,例如西文单词、网络地址、数学数据、设备型号、人名等等。挖掘上述内容,无论是机械分词算法还是歧义处理,都无法完成。因此,我们要探究一些挖掘非词库内容的方法。
1、正则表达式对西文及数据的识别
首先,我们要对最容易识别的内容——西文单词和数学数据——进行挖掘。由于西文单词的词量远远大于中文单词,故在此不利用借助词库进行匹配的方法。
由于西文单词自身的特殊性——只由若干个西文字母组成词语,所以我们就从西文字母开始入手,借助正则表达式对其进行处理。
数字与西文相似,也是只由若干固定字符组成(0 - 9)。因此我们可以写出判断数字与西文的正则表达式。
算法流程如下图:
根据如上的算法流程,我们可以方便地识别和提取出西文单词和数据。按照上面的流程成功匹配后,将获取的特殊字符串存储在临时变量中。全文匹配完成后将代替原字符成为独立的词语输出。
利用正则表达式,我们成功的实现了在中文分词算法中提取西文单词和数学数据。这是传统的分词算法所不具备的功能。
2、汉人人名识别算法
人名识别是一项相当复杂的工程。对此,我们实在是找不到任何可以提供参考的资料文献。于是我们尝试去模仿我们一般的人名识别思维,在计算机上尝试去识别我们较为熟悉的汉人人名。
首先我们准备了“百家姓”词库,接下来我们对分词结果进行分析。首先是将分词完毕的分词结果与百家姓词库相匹配,若匹配,则分析其下一个词语的长度。若大于2,则跳出;若等于1,则与“姓”相加,再匹配下一个词,若等于1,则与前面匹配好的人名段相加,若大于1,则跳出;若等于2,则与“姓”相加,跳出。
人名识别算法,用自然语言描述,恐怕就如上文一样令人费解。所以我们还是将其描绘成流程图表示出来:
如同识别西文单词和数学数据一样,匹配成功的“人名”将代替原字符独立输出。
我们在实际运行中发现,我们这个算法非常不完善。例如:“唐宋八大家”,由于我们的机械分词词库仅仅收录了长度不大于4的词语,所以“唐宋八大家”并没有收录到词库中。于是它就被“无辜”地进行人名匹配,返回了“唐宋八”这样的人名。当然,我们不排除真的有人叫“唐宋八”,但在这个短语中,“唐宋八”显然不代表人名;又例如:“黄金荣”这样的人名,由于我们的词库中收录了“黄金”这个词,机械分词结束后,姓氏已经被包含在分词结果中了,故人名识别算法无法识别。以上两种失误是我们在测试过程中找到的最经典的错误,造成这样的失误的原因分别是词库不够完善和姓氏挖掘方法不够完善。
本算法仍有待改善,所以我们在实际操作中,不将其放入总流程中,而将其作为可选过程处理。
我们现在提出了两种挖掘非词库内容的算法。在我们的分词测试中,这两种算法帮助我们挖掘出传统分词算法无法挖掘的信息。
五、总结与展望
1、总结与补充说明
现在,我们已经完整表述了我们设计的歧义处理算法及拓展算法。现在我们将总流程图绘出:
综合分析本算法,其创新之处在于:1、将概率统计引入到自然语言处理当中,2、机械分词算法结合统计分词算法,3、运用力学规律类比讨论自然语言处理,4、非汉语信息挖掘等等。其实用性在于引导计算机对自然语言进行处理,开启人与计算机信息交互的新的大门。其先进性在于将分词算法的准确率继续逼近于100%……
在上文中可能有某些地方表述不太完整,在此进行补充说明:
歧义字段挖掘算法:
上文没有提到如何挖掘歧义字段。这里补充说明:
首先获取两组分词结果。对分词结果进行分别比对,若相同,则到下一个;若不同,则比较出两组字符串中较长的和较短的。若较短的字符串与较长的字符串前段相吻合,则再用如上方法分析他们的下一组,两组比对得出若是由同一字符串分词得出的结果,则将其挖掘出来,作为歧义字段;反之则跳出。
下面是算法流程图:
这里无法显示图片
2、设想和展望
针对歧义处理,我们曾经设想过用语法规律处理伪歧义字段的方案。我们当时设想,只需要掌握对歧义字段及歧义字段的前后词语进行分析并得出歧义字段分词结果的词性的方法,再将分析结果与我们整理到的合法的语法结构相比对,即可肯定正确的分词方案,否定错误的分词方案。但是我们在整理语法规律的时候遇到了无法逾越的难题:语法规律过于复杂,难以整理。因此目前我们只能放弃这一设想。但是我们并不完全抛弃这一设想。因为只要有时间,有资料,有精力,我们一定可以将其继续完成。
我们的算法上升空间还很大,还有许多不足之处需要弥补,因此我们不能放弃对未来的设想和无尽的展望。分词算法的理论仍未完善,文本挖掘的需求却在日益增强。因此,提高分词算法的准确率和拓展其文本挖掘能力,是适应时代需求的浩大工程。
六、结束语
本算法是我这个高二学生在课余时间完成的,因此在其科学性和逻辑严密性等方面可能有所缺陷。但正所谓愚人千虑必有一得,希望我这样学识尚浅的“愚人”对分词算法的歧义处理千虑的一得能获得各位专家教授的肯定,同时亦希望我的九百九十九失能够得到各位的批评指正。在这里我先对各位提出感谢。
参考文献:
[1]:胥桂仙, 苏筱蔚,陈淑艳 , 《中文文本挖掘中的无词典分词的算法及其应用》 ,吉林工学院计算机科学与工程学院 吉林长春 130012
[2]:周程远,朱敏,杨云 ,《基于词典的中文分词算法研究》 ,华东师范大学计算机中心 上海 200062
[3]:百度词条——《中文分词》 , http://baike.baidu.com/view/19109.html?tp=3_11
[4]:郑家恒,张剑锋,谭红叶,《中文分词中歧义切分处理策略》 ,山西大学 计算机与信息技术学院 计算机智能与中文信息处理省部共建教育部重点实验室,山西 太原 030006
[5]:张辉丽,孟昭鹏,王慧芝,《汉语自动分词中的歧义处理》 ,天津大学计算机科学与技术系,天津 300072
附录:
1、117个歧义字段的对立互信息差绝对值:
(注意:加粗标记的数其歧义字段陷入互信息盲区;为了方便统计所以我们将数据降序排列,原始数据是无序的)
7.187153132
2.515678308
1.386294361
0.693147181
0.089612159
7.10824414
2.397895273
1.32175584
0.693147181
0
4.885491904
2.233592222
1.252762968
0.693147181
0
4.62333749
2.2300144
1.252762968
0.693147181
0
4.46473246
2.120263536
1.252762968
0.693147181
0
4.46473246
2.079441542
1.252762968
0.693147181
0
4.360441169
2.068970242
1.131402111
0.693147181
0
3.828641396
2.068970242
1.098612289
0.693147181
0
3.81688781
1.969440646
1.098612289
0.693147181
0
3.81688781
1.945910149
1.098612289
0.661398482
0
3.81688781
1.945910149
1.098612289
0.559615788
0
3.496507561
1.945910149
1.029619417
0.523248144
0
3.401197382
1.871802177
1.029619417
0.492476485
0
2.970414466
1.84582669
1.029619417
0.485507816
2.833213344
1.832581464
1.003302109
0.470003629
2.833213344
1.832581464
0.980829253
0.470003629
2.772588722
1.824549292
0.980829253
0.405465108
2.772588722
1.791759469
0.95097629
0.356674944
2.772588722
1.791759469
0.875468737
0.30538165
2.736221078
1.791759469
0.875468737
0.300104592
2.721295428
1.609437912
0.826678573
0.269663567
2.63905733
1.609437912
0.810930216
0.223143551
2.63905733
1.504077397
0.810930216
0.15415068
2.564949357
1.504077397
0.798507696
0.133531393
2.556365614
1.386294361
0.693147181
0.09531018
2.556365614
1.386294361
0.693147181
0.09531018
2、有无歧义处理机械分词准确率与相对词库量关系对照统计数据:
相对词库量
0
1
2
3
4
5
无歧义处理
0
18.45
32.69
46.33
40.57
58.12
有歧义处理
0
18.45
32.69
46.33
53.56
65.36
相对词库量
6
7
8
9
10
11
无歧义处理
71.39
79.54
85.12
91.63
98.47
99.6
有歧义处理
73.61
79.59
85.25
91.69
98.5
99.65
本来上面是表格来的,但这里不允许上传图片,无法正常显示。抱歉!
相对词库量
12
13
14
15
16
17
无歧义处理
99.78
99.85
99.83
99.15
97.81
96.57
有歧义处理
99.81
99.86
99.91
99.95
99.95
99.961
相对词库量
18
19
20
无歧义处理
94.16
91.67
89.74
有歧义处理
99.95
99.963
99.97
本来上面是表格来的,但这里不允许上传图片,无法正常显示。抱歉!