一种能够检测所有交叉歧义的汉语分词算法
原创:中文分词的逆向最大匹配算法

原创:中⽂分词的逆向最⼤匹配算法逆向最⼤匹配算法,中⽂分词机械化分词中最基本的算法,也是⼊门级别的算法。
但是,在机械化分词⽅⾯的效果,表现却很好。
尤其是在⼤⽂本的时候,⼀次取较多词语进⾏匹配,因为⼤⽂本匹配成词的概率远远⾼于⼩⽂本,所以会有很好的表现。
IK分词,在中⽂分词领域⾥,只能算是⽪⽑,或者说是⼀个壳⼉⽽已,根本不算真正的分词。
中⽂分词⾥⾯,运⽤CRF进⾏消除歧义分词,是主流,在NLP领域,RNN是主要技术⼿段,截⽌到2016年,RNN已经成功应⽤到NLP领域中,甚⾄在计算机视觉中也发挥着重要作⽤。
⽬前,在open nlp 社区⾥,有⼀个HanLP分词源码包,⾥⾯有极速分词和消歧分词,性能⾮常优异。
下⾯的代码,来⾃IK分词的⼀部分源码包,本⼈进⾏了逆向最⼤匹配算法的改造,闲着没事⼲,算是⼊门级别的分词。
package org.wltea.analyzer.core;import java.io.IOException;import java.io.Reader;import java.util.HashMap;import java.util.HashSet;import java.util.LinkedList;import java.util.Map;import java.util.Set;import org.wltea.analyzer.cfg.Configuration;import org.wltea.analyzer.dic.Dictionary;/*** 中分分词上下⽂环境* @author TongXueQiang* @date 2016/01/22* @since 1.7*/class AnalyzeContext {private char[] segmentBuff;private int[] charTypes;private int buffOffset;private int cursor;private int available;private Set<String> buffLocker;private QuickSortSet orgLexemes;private Map<Integer, LexemePath> pathMap;private LinkedList<Lexeme> results;private Configuration cfg;private Integer moveIndex;public AnalyzeContext(Configuration cfg) {this.cfg = cfg;this.segmentBuff = new char[4096];this.charTypes = new int[4096];this.buffLocker = new HashSet<String>();Lexemes = new QuickSortSet();this.pathMap = new HashMap<Integer, LexemePath>();this.results = new LinkedList<Lexeme>();}int getCursor() {return this.cursor;}char[] getSegmentBuff() {return this.segmentBuff;}char getCurrentChar() {return this.segmentBuff[this.cursor];}int getCurrentCharType() {return this.charTypes[this.cursor];}int getBufferOffset() {return this.buffOffset;}* 向缓冲区填充字符* @param reader* @return* @throws IOException*/int fillBuffer(Reader reader) throws IOException {int readCount = 0;if (this.buffOffset == 0) {readCount = reader.read(this.segmentBuff);} else {int offset = this.available - this.cursor;if (offset > 0) {System.arraycopy(this.segmentBuff, this.cursor,this.segmentBuff, 0, offset);readCount = offset;}readCount += reader.read(this.segmentBuff, offset, -offset);}this.available = readCount;this.cursor = 0;return readCount;}void initCursor() {this.cursor = this.available-1;//规范会字符this.segmentBuff[this.cursor] = CharacterUtil.regularize(this.segmentBuff[this.cursor]);//为字符指定类型,⽐如阿拉伯数字类型,英⽂字母类型等等this.charTypes[this.cursor] = CharacterUtil.identifyCharType(this.segmentBuff[this.cursor]);}boolean moveCursor() {if ((this.cursor-moveIndex) > 0) {this.cursor -= (moveIndex+1);//System.out.println("移动指针后的cursor位置:"+cursor);//移动指针后还要进⾏规范化当前字符this.segmentBuff[this.cursor] = CharacterUtil.regularize(this.segmentBuff[this.cursor]);//指定当前字符的类型this.charTypes[this.cursor] = CharacterUtil.identifyCharType(this.segmentBuff[this.cursor]);return true;}return false;}void lockBuffer(String segmenterName) {this.buffLocker.add(segmenterName);}void unlockBuffer(String segmenterName) {this.buffLocker.remove(segmenterName);}boolean isBufferLocked() {return (this.buffLocker.size() > 0);}boolean isBufferConsumed() {return (this.cursor == this.available - 1);}boolean needRefillBuffer() {return ((this.available == 4096) && (this.cursor < this.available - 1) && (this.cursor > this.available - 100) && (!(isBufferLocked())));void markBufferOffset() {this.buffOffset += this.cursor;}void addLexeme(Lexeme lexeme) {Lexemes.addLexeme(lexeme);}void addLexemePath(LexemePath path) {if (path != null)this.pathMap.put(Integer.valueOf(path.getPathBegin()), path);}QuickSortSet getOrgLexemes() {return Lexemes;}/*** 输出结果集*/void outputToResult() {int index = 0;while (index <= this.cursor) {LexemePath path = (LexemePath) this.pathMap.get(Integer.valueOf(index));if (path != null) {Lexeme l = path.pollFirst();if (l != null) {this.results.add(l);index = l.getBegin() + l.getLength();this.cursor = index;}} else {outputSingleCJK(index);++index;}}this.pathMap.clear();}private void outputSingleCJK(int index) {Lexeme singleCharLexeme;if (4 == this.charTypes[index]) {singleCharLexeme = new Lexeme(this.buffOffset, index, 1, 64);this.results.add(singleCharLexeme);} else if (8 == this.charTypes[index]) {singleCharLexeme = new Lexeme(this.buffOffset, index, 1, 8);this.results.add(singleCharLexeme);}}/*** 取出词元,为词元赋值* @return*/Lexeme getNextLexeme() {Lexeme result = (Lexeme) this.results.pollFirst();while (result != null) {compound(result);//数量词合并//过滤掉停⽤词if (Dictionary.getSingleton().isStopWord(this.segmentBuff,result.getBegin(), result.getLength())) {//System.out.println(Dictionary.getSingleton().isStopWord(this.segmentBuff, //result.getBegin(), result.getLength()));result = (Lexeme) this.results.pollFirst();} else {//为Lexeme赋值result.setLexemeText(String.valueOf(this.segmentBuff, result.getBegin(), result.getLength()));break;}}return result;}void reset() {this.buffLocker.clear();Lexemes = new QuickSortSet();this.available = 0;this.buffOffset = 0;this.charTypes = new int[4096];this.cursor = 0;this.results.clear();this.segmentBuff = new char[4096];this.pathMap.clear();}/*** 数量词合并* @param result*/private void compound(Lexeme result) {if (!(eSmart())) {return;}if (this.results.isEmpty())return;Lexeme nextLexeme;boolean appendOk;if (2 == result.getLexemeType()) {nextLexeme = (Lexeme) this.results.peekFirst();appendOk = false;if (16 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 16);} else if (32 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 48);}if (appendOk) {this.results.pollFirst();}}if ((16 == result.getLexemeType()) && (!(this.results.isEmpty()))) { nextLexeme = (Lexeme) this.results.peekFirst();appendOk = false;if (32 == nextLexeme.getLexemeType()) {appendOk = result.append(nextLexeme, 48);}if (!(appendOk))return;this.results.pollFirst();}}public void setMoveIndex(Integer moveIndex) {this.moveIndex = moveIndex;}}以下是CJK逆向最⼤匹配算法:package org.wltea.analyzer.core;import org.wltea.analyzer.dic.Dictionary;import org.wltea.analyzer.dic.Hit;/*** 中⽇韩分词器,逆向最⼤匹配算法** @author TongXueQiang* @date 2016/01/20* @since 1.7*/class CJKSegmenter implements ISegmenter {static final String SEGMENTER_NAME = "CJK_SEGMENTER";static Integer MATCH_LEN = 7;static Integer moveIndex = MATCH_LEN - 1;CJKSegmenter() {}/**逆向最⼤匹配算法** @see org.wltea.analyzer.core.ISegmenter#analyze(org.wltea.analyzer.core.* AnalyzeContext)*/public void analyze(AnalyzeContext context) {if (context.getCursor() < moveIndex) {moveIndex = context.getCursor();MATCH_LEN = context.getCursor() + 1;}Hit singleCharHit = Dictionary.getSingleton().matchInMainDict(context.getSegmentBuff(), context.getCursor() - moveIndex,MATCH_LEN);if (singleCharHit.isMatch() || MATCH_LEN == 1) {Lexeme newLexeme = new Lexeme(context.getBufferOffset(),context.getCursor() - moveIndex, MATCH_LEN, 4);context.addLexeme(newLexeme);context.setMoveIndex(moveIndex);init();} else {if (!singleCharHit.isUnmatch() || singleCharHit.isUnmatch()) {--moveIndex;--MATCH_LEN;analyze(context);}}}private void init() {moveIndex = 6;MATCH_LEN = 7;}@Overridepublic void reset() {}}⾰命尚未成功,同志仍需努⼒!专注机器学习理论的研究,寻求理论的突破,然后转化成代码,苦练最底层的基本功,持之以恒,兼顾理论和编程,成为不可或缺的⼈才,定能成为⼀流的⾼⼿!。
一种消除中文分词中交集型歧义的方法

一种消除中文分词中交集型歧义的方法魏博诚;王爱平;沙先军;王永【期刊名称】《计算机技术与发展》【年(卷),期】2011(021)005【摘要】切分速度和精度是中文分词系统的两个主要性能指标.针对传统的中文分词中出现的分词速度慢和分词精度不高的问题,采用了双层hash结构的词典机制来提升分词的速度,对于匹配结果中出现的交集型歧义字段,通过互信息的方法来消除,以提高分词精度.并对该分词系统进行了实现.通过与传统的中文分词系统的分词速度以及分词效果的对比,发现该系统在分词速度和精度上都有所进步,从而取得较好的分词效果.%Segmentation accuracy and speed are the two main performance indexes of the Chinese word segmentation system.According to the question of slow speed and precision of the word in the traditional Chinese word segmentation, it uses the structure dictionary of double-decked hash mechanism to promote the speed of word segmentation.To improve the segmentation accuracy, use the method of the mutual information to eliminate the overlapping ambiguity string which appeared in the matching results, the Chinese word segmentation system is achieved.The system is improved in the speed and accuracy compared with the traditional Chinese word segmentational system.The experiment results make the good participle progress.【总页数】4页(P60-63)【作者】魏博诚;王爱平;沙先军;王永【作者单位】安徽大学,计算智能与信号处理教育部重点实验室,安徽,合肥,230039;安徽大学,计算智能与信号处理教育部重点实验室,安徽,合肥,230039;安徽大学,计算智能与信号处理教育部重点实验室,安徽,合肥,230039;安徽大学,计算智能与信号处理教育部重点实验室,安徽,合肥,230039【正文语种】中文【中图分类】TP31【相关文献】1.一种改进的中文分词歧义消除算法研究 [J], 许高建;胡学钢;路遥;王庆人2.一种消除中文匹配中交集型歧义的方法 [J], 杨芳;杨振山3.基于词语搭配关系的一种中文分词歧义性消除方法 [J], 郭丙华;俞亚;李中华4.一种基于无监督学习的交集型歧义处理改进方法 [J], 黄鹏;张姝;陈玉华;文斌5.一种改进的藏文分词交集型歧义消解方法 [J], 羊毛卓玛;欧珠因版权原因,仅展示原文概要,查看原文内容请购买。
中文分词交集型歧义处理研究的开题报告

中文分词交集型歧义处理研究的开题报告一、背景与意义随着互联网的普及和数据挖掘技术的发展,中文分词技术的重要性愈加凸显。
传统的中文分词技术主要采用基于词典的方法,即根据预设的词典来对文本进行分词。
但这种方法存在很大的局限性,因为无法涵盖所有的文本类型和专业词汇,而且容易出现交集型歧义现象。
在处理交集型歧义时,分词器需要确定哪个子串是分词结果的一部分,而哪个子串不是,这是一个非常有挑战性的问题。
因此,研究中文分词交集型歧义处理方法,对提高中文分词的准确性和效率具有重要意义。
本文将着重研究交集型歧义的处理方法,并探讨如何结合深度学习等先进技术,提高分词器的处理能力。
二、研究内容本文将围绕中文分词交集型歧义处理这一问题展开研究,主要内容包括以下几个方面:1. 研究中文分词交集型歧义的本质和分类方法根据交集型歧义的本质和特点,对常见的交集型歧义进行分类和分析,找出各类歧义的处理策略和解决方法。
2. 探究基于机器学习的分词交集型歧义处理方法通过探究现有的基于机器学习技术的分词交集型歧义处理方法,分析各种方法的优缺点,筛选出适用于中文分词交集型歧义处理的优秀算法。
3. 讨论基于深度学习的分词交集型歧义处理方法分析目前深度学习技术在中文分词领域的应用现状和研究进展,探讨如何将深度学习技术应用于交集型歧义处理,提高分词器的准确性和效率。
4. 构建实验系统,测试效果并进行性能分析通过构建实验系统,将研究成果应用到实际的中文分词任务中,测试算法的效果和运行性能,并进行深入分析。
包括使用F1值等标准对算法进行评估,探究算法的性能瓶颈,提出优化策略等。
三、研究计划及可行性分析本研究将分为以下几个阶段:1. 调研分词交集型歧义处理的研究现状:初步了解分词交集型歧义处理的研究现状和发展趋势,汇总和整理现有的相关文献,了解研究的理论和实践进展。
2. 深入分析交集型歧义的本质和处理方法:针对中文分词交集型歧义的各种形式和特点,对相关方法进行分类和分析,寻找最优解决方案。
中文分词错误纠正算法与优化

中文分词错误纠正算法与优化中文分词是自然语言处理中的重要任务之一,它将连续的中文文本切分成有意义的词语,为后续的文本处理和语义分析提供基础。
然而,由于中文的特殊性,分词中经常出现错误,如歧义词的切分、未登录词的处理等。
因此,研究中文分词错误纠正算法与优化成为了一个热门的研究方向。
一、中文分词错误的原因分析中文分词错误主要源于以下几个方面:1. 歧义词切分:中文中存在大量的歧义词,即同一组汉字可以有多种不同的切分方式,例如“北京大学生喝进口红酒”。
正确的切分应该是“北京/大学生/喝/进口/红酒”,而错误的切分可能是“北京/大学/生/喝/进口/红酒”。
2. 未登录词处理:未登录词是指分词词典中没有收录的新词或专有名词。
由于中文的词汇量庞大且不断更新,分词词典无法及时收录所有的新词,因此会出现未登录词的情况。
例如,“微信红包”在分词词典中可能无法找到对应的切分规则。
3. 语料库不完备:中文分词算法通常依赖于大规模的语料库进行训练和模型构建。
然而,由于语料库的不完备性,某些特殊领域或方言的词语可能无法被准确地切分。
二、中文分词错误纠正算法为了解决中文分词中的错误问题,研究者们提出了一系列的算法和方法:1. 基于规则的方法:基于规则的方法通过事先定义一系列的切分规则来进行分词,例如最大匹配法和最短路径法。
这些方法简单易懂,但对于歧义词和未登录词的处理效果较差。
2. 基于统计的方法:基于统计的方法通过统计语料库中的词频和词组频率来进行分词。
这些方法可以较好地处理歧义词和未登录词,但对于语料库不完备的情况下会有一定的限制。
3. 基于机器学习的方法:基于机器学习的方法通过建立分类器或序列标注模型来进行分词。
这些方法可以通过训练大规模的语料库来提高分词的准确性和泛化能力,但需要较多的训练数据和计算资源。
三、中文分词错误纠正的优化除了算法层面的优化,还可以从以下几个方面对中文分词错误进行优化:1. 词典的更新:及时更新分词词典,收录新词和专有名词,以提高分词的准确性。
文字检测 常见算法

文字检测常见算法在当代社会,文字检测算法被广泛应用于各种领域,如自然语言处理、信息安全、搜索引擎优化等。
文字检测算法的作用是检测给定文本中是否存在恶意、不当或违法的内容,并对其进行识别和处理。
本文将介绍常见的文字检测算法,探讨其原理和应用,并对其在相关领域中的意义进行分析。
首先,我们来介绍一种常见的文字检测算法——关键词匹配。
该算法通过事先设定一组关键词,然后在给定文本中搜索这些关键词的出现情况,从而判断文本是否包含不良内容。
例如,当我们需要检测一段文本是否含有辱骂词汇时,可以提前设定一个包含各种可能辱骂词汇的关键词列表,然后在文本中进行匹配。
这种算法的优点是实现简单,但缺点是容易被规避和误判。
其次,还有一种常见的文字检测算法是基于机器学习的方法。
这种方法将大量已标注的文本数据作为训练集,通过机器学习算法提取文本特征,并构建模型进行分类。
例如,可以使用支持向量机(SVM)、朴素贝叶斯(Naive Bayes)等算法进行分类。
这种算法的优点是可以自动学习和适应不同类型的文本,但也需要大量的标注数据和计算资源进行训练。
除了以上两种常见的文字检测算法,还有一些其他的算法被广泛应用于文字检测中。
如基于统计特征的方法,通过统计文本中的词频、长度、语法结构等特征,从而判断文本的性质。
还有基于深度学习的方法,通过构建深度神经网络模型,利用大规模的标注数据进行训练和预测。
这些算法各有优缺点,可以根据具体的应用场景选择合适的算法。
文字检测算法在各个领域中具有重要意义。
在自然语言处理领域,文字检测算法可以用于情感分析、文本分类等任务,帮助理解和处理大规模的文本数据。
在信息安全领域,文字检测算法可以用于检测和过滤含有病毒、恶意链接等威胁信息的文本。
在搜索引擎优化中,文字检测算法可以在搜索引擎的排名算法中起到重要作用,帮助筛选和过滤优质的内容。
总之,文字检测算法在当今社会的各个领域中发挥着重要的作用。
通过不断地研究和发展,我们可以不断改进算法的准确性和效率,提高文字检测的能力。
hmm分词算法

hmm分词算法
HMM分词算法是一种基于隐马尔可夫模型的中文分词方法,其基本思路是将待分词的文本看作一个观测序列,将中文词语看作是一个隐藏的状态序列,通过对观测序列进行统计学习,推断出最可能的状态序列(即词语序列),从而实现中文分词。
HMM分词算法的核心是对隐马尔可夫模型的学习和推断,其中学习过程主要是通过训练样本对模型参数进行估计,包括状态转移矩阵、发射概率矩阵和初始状态分布;推断过程则是通过给定观测序列,利用Viterbi算法求解最可能的状态序列,从而实现分词。
HMM分词算法在中文分词领域有着广泛的应用,其优点是可以自动识别未登录词和歧义词,并且具有一定的鲁棒性;缺点是需要大量的训练数据和计算资源,并且对于长词和新词的识别效果不尽如人意。
同时,随着深度学习技术的发展,基于神经网络的分词方法也逐渐得到了广泛应用。
- 1 -。
低出错率的汉语文本分词算法的研究

低出错率的汉语文本分词算法的研究汉语文本分词是自然语言处理领域中的重要问题之一。
在汉语文本处理中,文本中的每个字都需要被正确分割出来,以便后续的分析和处理。
然而,由于汉语的复杂性,诸如多义词、歧义词、新词创造等问题,汉语文本分词一直是个困难重重的研究难题。
本文将探讨低出错率的汉语文本分词算法的研究。
一、汉语文本分词的基础原理1.1 传统分词算法传统的汉语文本分词算法基于规则,采用正则表达式、词典匹配、最大匹配等方法。
其中,最大匹配是最常用的方法,在文本中从左到右扫描,同时在词典中查找最长匹配的词语,直至扫描完整个文本。
这种方法在处理一些词语固定,固定语序的场景中具有良好的效果,但是在有词语歧义、多义等场景下会出现错误。
1.2 基于机器学习的分词算法近年来,基于机器学习的汉语文本分词算法受到了广泛的关注。
这种方法将分词问题转化为分类问题,通过将分词位置标注为单词的开始、中间或结束,将一个文本序列转化为一个标注序列,然后利用机器学习算法学习标记序列和输入序列之间的关系。
这种方法不再需要手工规则和词典,并且在多义词、歧义词等场景中具有更好的效果。
二、低出错率的汉语文本分词算法的研究2.1 基于规则和统计的汉语文本分词算法这种算法结合了传统的规则算法和基于机器学习的算法的优点,这种算法基于CRF(条件随机场)模型,同时结合领域构建相关的规则,先用规则来过滤非常见的歧义分词情况,然后再使用CRF模型进行标注。
实验表明,该算法在分割准确性、召回率等方面有显著的优良表现。
2.2 基于深度学习的汉语文本分词算法近年来,随着深度学习的发展和应用,基于深度学习的汉语文本分词算法也得到了迅速的发展。
比如,基于循环神经网络(RNN)的分词算法,基于深度学习技术的Semi-CRF模型等,在分词准确性和处理速度方面都得到了显著提升。
三、结论针对汉语文本分词算法的难点和瓶颈,目前的研究趋势是结合规则和机器学习算法,开发出更加先进、更加高效、更加准确的算法系统。
中文分词交叉型歧义消解算法

中文分词交叉型歧义消解算法甘蓉【摘要】中文分词是自然语言处理的基础.交叉型歧义是提高中文分词精度的瓶颈之一.文章提出一种基于正向、负向最大匹配算法和passive aggressive(PA)算法结合的交叉型歧义消解算法.基于PA算法训练分词模型;利用正向、负向最大匹配算法检测交叉型歧义的位置;把可能出现交叉型歧义的句子或者句子的部分传递给分词模型,解码得到分词结果;最后,把正向、负向最大匹配结果和分词模型解码结果拼接成最终的分词结果.利用PA算法基于2014年2—12月份人民日报数据训练分词模型、2014年1月份人民日报数据作为测试语料进行实验,得到交叉型歧义的准确率、召回率和F-score分别为98.32%、98.14%和98.23%,说明该方法有效可行.【期刊名称】《西华大学学报(自然科学版)》【年(卷),期】2018(037)006【总页数】5页(P32-36)【关键词】中文分词;交叉型歧义;最大匹配算法;PA算法【作者】甘蓉【作者单位】陕西工业职业技术学院汽车工程学院,陕西咸阳712000【正文语种】中文【中图分类】TP391.1中文分词是自然语言处理的基础和关键[1]。
中文分词已经有很多成熟的算法,但是歧义识别和未登录词识别仍是中文分词的2大难点。
其中,歧义识别又分为交叉型歧义和组合型歧义[2]。
对于歧义,许多研究者做了大量的工作。
目前常用的歧义消解算法主要分为2种:规则型歧义消解算法和概率型歧义消解算法。
规则型歧义消解算法主要采用语义、语法、词性等规则对歧义字段进行消歧。
概率型歧义消解算法通常需要统计上下文信息[3](例如使用互信息、N元统计模型、t-测试原理、HMM模型、字标注统计等方法或模型[4]统计上下文信息)从而进行歧义消解。
文献[4]提出了一种基于词频的中文分词歧义消解方法,该方法主要适用于没有上下文的歧义消解。
文献[5]提出了一种针对交叉型歧义无监督的学习方法,并比较了卡方统计量、t-测试差在歧义处理中的效果。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种能够检测所有交叉歧义的汉语分词算法王显芳,杜利民(中国科学院声学研究所语音交互信息技术研究中心,北京100080)摘要:本文给出了一种能够检测句子中所有交叉歧义的汉语分词算法.该算法基于“长词优先”的切分原则.它解决了切分路径数随句子长度的增长而呈几何级数增长的问题,并且提供了一种方法可将句子的覆盖歧义和交叉歧义分开处理.算法的运算复杂度为O (N ),N 为句子长度.它的输出使得进行下一步处理的运算量大大减少.关键词:自动分词;长词优先中图分类号:TP301.6文献标识码:A文章编号:0372-2112(2004)01-0050-05A Method of Sentence Segmentation That Check AII OverIapping AmbiguityWANG Xian-fang ,DU Li-min(Center for Speech Interactive Information Technology Institute of Acoustics ,Chinese Academy of Science ,Beijing 100080,China )Abstract :We proposed a new method of Chinese automatic segmentation that can check all overlapping ambiguity in sentence.This algorithm is based on the principle of “Choose Longer Word ”.It solves the problem that the count of segmentation way is expo-nentially increasing with the sentence length ,and provides a method to handle overlaying ambiguity and overlapping ambiguity sepa-rately.The time complexity of this algorithm is O (N ),where N is the length of sentence.Its output can greatly decrease the comput-ing cost of post processing.Key words :automatic segmentation ;choose longer word1问题的提出在书面汉语中,字与字、词与词是连写的,词在句中没有显式的标记.因此,理解汉语的首要任务就是把连续的汉字串分割成词的序列,即自动分词.近二十年来,汉语自动分词研究取得了很大成就,推出了一批有代表性的分词系统,如清华大学的SEGTAG 系统;北京航空航天大学的CDWS 系统;北大计算语言学研究所分词系统等[1~3].同时提出了许多分词算法,其中有一定代表性的主要有:最大匹配法(又可分为正向、逆向、双向三种)、最优路径(+词频选择)法(最少分词法)、特征词库法、邻接约束法、人工神经网络方法、无词典分词法等等.这些算法各具特色.如果只考虑利用词条信息,不使用词性、语义等复杂特征的话,则有最大匹配法和全切分算法[1,2].最大匹配法虽然有算法简单、速度快的优点,但它仅从一种或两种切分路径中选择,显然不能保证切分结果是全局最优的.全切分算法可以遍历所有的切分路径,但是切分路径的总数是随着句子长度的增长而成指数级增长的,对于长度比较长的句子,全切分算法可能需要非常长的时间才能遍历所有切分路径以选择出全局最优的切分结果.举几个例子:S 1.中国人民S 2.中国人民万岁S 3.公路局正在治理解放大道路面积水问题S 4.上海专利事务所业务办公室主任丁惠敏为上海一位50多岁的专利技术人员代理申请了一项交通自动控制方面的发明专利S 5.江泽民在北京人民大会堂会见参加全国法院工作会议和全国法院系统打击经济犯罪先进集体表彰大会代表时要求大家要充分认识打击经济犯罪工作的艰巨性和长期性这五个句子的切分路径个数分别为S 1S 2S 3S 4S 5612142435389443764387840说明一下,作者所使用的词典为北航的词典,词条数为67480个,最大词长为7,其中包含了所有的汉字单字.文献[3]指出,句子的切分路径个数是与其句子长度成几何级数的.对于比较长的句子,全切分算法必须需要很长时间才可能遍历所有切分路径.无论是进行统计语言模型训练还是在句子分析、翻译等实用系统中句子的预处理用这么长时间都是难以忍受的.其实这种切分路径个数随句子长度而呈几何级数增长的收稿日期:2002-01-09;修回日期:2002-05-18基金项目:国家973重点基础研究发展项目“图像、语音、自然语气理解和知识挖掘———汉语自然口语对话的理论和实验平台研究”基金(No.G1998030505)第1期2004年1月电子学报ACTA ELECTRONICA SINICA Vol.32No.1Jan.2004现象主要是由于覆盖歧义现象引起的.假设一个词又可以分成两个词,如果不考虑这个词引起的覆盖歧义现象,则句子的切分路径个数比原来少一半.为方便描述,我们称词典包含的句子的子串为候选词条.句子S 2共有11个候选词条:中中国中国人国国人人人民民万万岁岁其中,会引起交叉歧义的词条为“中国”、“中国人”、“国人”、“人民”,这些词条都和别的词条存在交叉现象,例如,“中国”和“国人”,“中国人”和“人民”,“国人”、“人民”.其他的词条“万岁”、“中”、“国”、“人”、“民”、“万”、“岁”不和其他的词存在交叉现象.句子S 1比句子S 2缺少子串“万岁”,而这个子串不会在句子S2当中引起交叉歧义,只引起覆盖歧义.如果不考虑这个子串引起的覆盖歧义现象,句子S 1和句子S 2的切分路径个数将是相同的.但如果考虑了,则句子S 1的切分路径个数为句子S 2的切分路径个数的一半.汉语的覆盖歧义目前还没有理想的解决方法.“长词优先”的准则是一种切实可行的解决覆盖歧义问题的切分准则[4,5].所谓“长词优先”,就是尽可能地用最长的词匹配句子中的汉字串.比方说“中国人”和“中国”都是词,但当我们在句子中遇到“中国人”这个汉字串时,就用“中国人”去匹配它,使得切出来的词尽可能长,切出来的词条数尽可能少.最大匹配法从句子的起始位置开始,依次在已经得到的最后一个词的结束位置使用“长词优先”的准则.但某一位置开始的最长的词条有可能和从该词条内某一位置开始的一个词条交叉.比如说第一句“中国人民”,其前向最大匹配切分路径为“中国人—民”,但此时“中国人”和“人民”相交叉.因此它忽略了另一种切分路径“中国人民”,所以最大匹配法无法检测到所有的交叉歧义的.最优路径(+词频选择)法(最少分词法)使用了动态规划方法[1].但动态规划方法有一个假设,就是句子在某一位置前的切分路径的选择和此位置后的句子的内容无关.这个假设在使用词条数最少准则和“费用”最小准则是适用的,但从句法、语法以及语用层面上考虑则是不正确的.动态规划方法虽然可以输出所有词条数为最少词条数的切分路径,但是它仍然无法检测并得到所有的交叉歧义.这样在后续的处理中先行失去了一些信息.交叉歧义占切分歧义现象的86%[1],处理歧义的重点就是要处理交叉歧义问题.而最大匹配法和动态规划方法在进行相应的判断和选择之前就忽略了一些交叉歧义.2最大无覆盖歧义切分路径集“长词优先”的准则可描述为:如果一个候选词条w n 覆盖了其他一些候选词条w n 1,w n 2,…,w nm ,即w n 和w n 1的起始位置相同,和w nm 的结束位置相同,且w n 1,w n 2,…,w nm 依次首尾相连,则在考虑切分路径的时候,只考虑w n 出现在切分结果时的情况,而不将w n 拆开.“长词优先”的准则和检测交叉歧义并不矛盾.在使用“长词优先”的准则的时候仍然能够检测所有的交叉歧义.为了给出算法,我们首先引入一个定义.给定词典L ,一个句子的所有切分路径构成了一个集合P ,它必然存在一个不包含覆盖歧义的切分路径的子集合Q ⊆P ,而对任给句子的一种切分路径x ∈P ,都能够找到一种切分路径y ∈Q ,使得y 与x 之间只存在覆盖歧义而不存在交叉歧义.称满足这种条件的子集合Q 为最大无覆盖歧义切分路径集.最大无覆盖歧义切分路径集的意思就是如果向该集合当中加入一种不属于该集合的切分路径,则此切分路径必然和集合中一种切分路径存在覆盖歧义;而如果从此集合中删除一种切分路径,必然会导致句子的一些切分路径无法在该集合中找到与之只存在覆盖歧义而不存在交叉歧义的切分路径.最大无覆盖歧义切分路径集其实将一个句子的切分信息分成了两部分:可由词典直接得到的信息和仅能从正在处理的句子中得到的信息.这种分离对于任何语言处理工作都将是有帮助的.下表列出上述五个例句的全切分集和最大无覆盖歧义切分路径集中切分路径的个数.表1五个句子的全切分路径个数和最大无覆盖歧义切分路径个数比较S 1S 2S 3S 4S 5全切分集612142435389443764387840最大无覆盖歧义切分路径集2212216我们知道,句子的全切分集和句子的全切分词图相对应.那么,我们怎样才能得到与最大无覆盖歧义切分路径集相对应的词图呢?3覆盖歧义检测法回顾构造句子的全切分词图的过程.我们称以某一位置为结束位置的候选词条为该位置的前驱词条,称以某一位置为开始位置的候选词条为该位置的后续词条.构造句子的全切分词图的过程可以分为两步.首先找到句子中每一个位置的所有候选词条.然后在该位置的所有前驱词条和后续词条之间建立弧.全切分算法之所以会遍历如此多的切分路径,主要原因就是它不仅考虑了整个词条在切分路径中出现时的情况,它还考虑了将词条“切碎”时的情况.正是这些将词条“切碎”的形式导致了覆盖歧义,也导致了切分路径数的指数级增长.比如说在句子S 2中,我们不仅考虑了词条“万岁”出现时的情况,还考虑了“万岁”出现时的情况.也就是说,在考虑位置4,也就是“民”的后续词条时,不仅考虑了词条“万岁”,还考虑了词条“万”.在位置4的后续词条为“万”时,引入了含有“万岁”的切分形式.因此,如果我们想得到句子S 2的最大无覆盖歧义切分路径集,我们就不需要考虑位置4的后续词条为“万”时的情况.引入几个定义.设句子的某个候选词条w ml 的开始位置为m ,长度为l (也就是说该词条的结束位置也就是该词条后面的下一个候选词条的开始位置为m +l ).另一个候选词条15第1期王显芳:一种能够检测所有交叉歧义的汉语分词算法ÓÉ Foxit Reader ±à¼-°æÈ¨ËùÓÐ (C) Foxit Software Company,2005-2006½öÓÃÓÚÆÀ¹À¡£年歧义局部切分路径.再检查词条“中”,其结束位置为位置1,位置1的后续词条为“国人”和“国”.“国人”的结束位置为位置3,正好是位置0的后续最大长度侯选词条的结束位置.词条“国”的结束位置为位置2.位置2已经判断过,不需要再对位置2的后续词条进行判断.位置2为位置0的可导致交叉歧义位置.此时得到的局部切分路径为“中国”,需要判断此局部切分路径是否是已经得到的位置0的无覆盖歧义局部切分路径的覆盖歧义.因为“中国”为“中国”的一种覆盖歧义切分路径.因此,不将此切分路径加入位置0的可导致交叉歧义内部切分路径.位置0的无覆盖歧义后续词条为“中国人”和“中国”,无覆盖歧义前驱词条为虚词条!Start.在虚词条!Start 和“中国人”之间和虚词条!Start和“中国”之间建立弧.至此,位置0判断完毕.位置1不是可后续位置,不需要对它做任何判断.位置2为可后续位置.位置2的后续最大长度侯选词条为“人民”,位置2的后续词条还有“人”.“人”的后续词条是“民”,其结束位置为4,正好是词条“人民”的结束位置.因此,“人民”是不可导致交叉歧义侯选词条.因此位置2的无覆盖歧义后续词条为“人民”.然后我们考虑跨越位置2的弧.位置2的无覆盖歧义前驱词条为“中国”,其起始位置为位置0,以位置0为起始位置的词条的最大长度为3.因此在“中国”和“人民”之间建立弧.位置2判断完毕.位置3为可后续位置.其后续词条只有一个,“民”.“民”是不可导致交叉歧义侯选词条.因此位置3的无覆盖歧义切分后续词条为“民”,其结束位置为4.然后我们考虑跨越位置3的弧.位置3的无覆盖歧义前驱词条为“中国人”,其起始位置为位置0,以位置0为起始位置的词条的结束位置为3,小于4.因此在“中国人”和“民”之间建立弧.位置3判断完毕.位置4为可后续位置.位置4的后续最大长度侯选词条为“万岁”,位置4的后续词条还有“万”.“万”的后续词条是“岁”,其结束位置为6,正好是词条“万岁”的结束位置.因此,“万岁”是不可导致交叉歧义词条,位置4的无覆盖歧义后续词条为“万岁”.然后我们考虑跨越位置4的弧.位置4的无覆盖歧义前驱词条为“人民”和“民”.“人民”的起始位置为位置2,以位置2为起始位置的词条的最大长度为4,小于位置6.因此可以在“人民”和“万岁”之间建立弧.“民”的起始位置为位置3,以位置3为起始位置的最大长度词条的结束位置为4,小于位置6.因此可以在“民”和“万岁”之间建立弧.位置4判断完毕.位置5不是可后续位置.不需要对它做任何判断.位置6为句子的结束位置.位置6的无覆盖歧义前驱词条为“万岁”,在“万岁”和虚词条!End之间建立弧.位置6判断完毕.判断过程结束.5运算复杂度分析设句子的长度为N,词典的最大词长为T.步骤1.对于位置i,0≤i≤N,找到位置i开始的候选词条,每个位置最多需要找的候选词条数为词典的最大词长T.因此本步的运算复杂度为O(N).步骤2.对于位置i,0≤i≤N.首先判断该位置的后续最大长度候选词条,是否为无交叉歧义词条.判断的次数为该位置的后续词条个数,由于每次判断仅在后续最大长度候选词条的长度范围内进行判断,和句子的长度N没有关系.然后我们考虑该位置的无覆盖歧义后续词条和无覆盖歧义前驱词条之间建立弧.很显然,该位置的无覆盖歧义后续词条必然是该位置的后续词条,所以个数将不超过T.该位置的无覆盖歧义前驱词条的起始位置将在该位置的前T个位置的范围之内.以该位置前面第i个位置的无覆盖歧义前驱词条的长度显然不可能超过i,因此其个数最多为i个,所以一个位置的无覆盖歧义前驱词条的个数最多为T*(T-1)/2.对于每个无覆盖歧义前驱词条,最多需要判断T次,因此判断的次数不超过T*T*(T-1)/2.所以本步骤的运算复杂度为O(N).因此,算法的运算复杂度为O(N).6算法性能在整个句子是一个交叉歧义链时,覆盖歧义检测法仍然是有效的.句子“结合成分子时”的交叉歧义链长为6.其全切分路径个数为13个,而其最大无覆盖歧义切分路径数为4个.期王显芳:一种能够检测所有交叉歧义的汉语分词算法句子个数为31句,最大无覆盖歧义切分路径个数最大为384.覆盖歧义检测法的运算效率是很高的,下图给出了在CPU 为P Ⅲ800的计算机处理上述数据,最大匹配法、覆盖歧义检测法和全切分算法所需要的时间.王显芳男,1975年7月生于安徽萧县,1997年毕业于北京大学数学科学学院信息科学系,获理学学士学位,现为中国科学院声学研究所博士生,主要研究领域为语音识别,对话系统.杜利民男,1957年1月生于四川南充,1983年、1987年、1991年分别于北京大学、中国科大研究生院、中国科学院声学研究所获理学学士、工学硕士、理学博士学位;1996年美国麻省理工学院(MIT )高级访问科学家,现为中国科学院声学研究所研究员、博士研究生导师、IEEE 高级会员、中国电子学会理事、电子学报编委.45电子学报2004年。