中文
分词指的是中文在基本文法上有其特殊性而存在的分词。
背景简介
存在中文分词技术,是由于中文在基本文法上有其特殊性,具体表现在:
1.与英文为代表的
拉丁语系语言相比,英文以空格作为天然的
分隔符,而中文由于继承自
古代汉语的传统,词语之间没有分隔。 古代汉语中除了
连绵词和人名地名等,词通常就是单个汉字,所以当时没有分词书写的必要。而
现代汉语中双字或多字词居多,一个字不再等同于一个词。
2.在中文里,“词”和“词组”边界模糊
现代汉语的基本表达单元虽然为“词”,且以双字或者多字词居多,但由于人们认识水平的不同,对词和短语的边界很难去区分。
例如:“对随地吐痰者给予处罚”,“随地吐痰者”本身是一个词还是一个短语,不同的人会有不同的标准,同样的“海上”“酒厂”等等,即使是同一个人也可能做出不同判断,如果汉语真的要分词书写,必然会出现混乱,难度很大。
中文分词的方法其实不局限于中文应用,也被应用到英文处理,如
手写识别,单词之间的空格就不很清楚,中文分词方法可以帮助判别
英文单词的边界。
作用
中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑
自动识别语句含义的效果。
中文
分词技术属于
自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其
处理过程就是分词算法。
影响
中文分词对于搜索引擎来说,最重要的并不是找到所有结果,因为在上百亿的网页中找到所有结果没有太多的意义,没有人能看得完,最重要的是把最相关的结果排在最前面,这也称为
相关度排序。中文分词的准确与否,常常直接影响到对搜索结果的相关度排序。从定性分析来说,搜索引擎的分词算法不同,
词库的不同都会影响页面的返回结果。
算法分类
现有的分词算法可分为三大类:基于
字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。按照是否与
词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。
这种方法又叫做
机械分词方法,它是按照一定的策略将待分析的汉字串与一个“
充分大的”机器词典中的词条进行匹配,若在词典中找到某个
字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;常用的几种机械分词方法如下:
(1)正向最大匹配法(由左到右的方向);
(2)逆向最大匹配法(由右到左的方向);
(4)双向最大匹配法(进行由左到右、由右到左两次扫描)
还可以将上述各种方法相互组合,例如,可以将正向最大
匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的
歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的
准确率。
一种方法是改进
扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。
对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
理解法
这种分词方法是通过让
计算机模拟人对句子的理解,达到识别词的效果。其基本思想就是在分词的同时进行句法、
语义分析,利用句法信息和
语义信息来处理歧义现象。它通常包括三个部分:分词
子系统、句法语义子系统、总控部分。在总控部分的协调下,分词子系统可以获得有关词、句子等的句法和语义信息来对分词歧义进行判断,即它模拟了人对句子的理解过程。这种分词方法需要使用大量的语言知识和信息。由于汉语语言知识的笼统、复杂性,难以将各种语言
信息组织成机器可直接读取的形式,因此目前基于理解的分词系统还处在试验阶段。
从形式上看,词是稳定的字的组合,因此在
上下文中,相邻的字同时出现的次数越多,就越有可能构成一个词。因此字与字相邻共现的频率或概率能够较好的反映成词的
可信度。可以对语料中相邻共现的各个字的组合的频度进行统计,计算它们的互现信息。定义两个字的互现信息,计算两个汉字X、Y的相邻共现概率。互现信息体现了汉字之间结合关系的紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成了一个词。这种方法只需对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计取词方法。但这种方法也有一定的局限性,会经常抽出一些共现频度高、但并不是词的常用字组,例如“这一”、“之一”、“有的”、“我的”、“许多的”等,并且对常用词的识别精度差,时空开销大。实际应用的统计分词系统都要使用一部基本的分词词典(
常用词词典)进行串匹配分词,同时使用
统计方法识别一些新的词,即将串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,又利用了无词典分词结合上下文识别生词、自动
消除歧义的优点。
另外一类是基于统计
机器学习的方法。首先给出大量已经分词的文本,利用统计机器学习模型学习词语切分的规律(称为训练),从而实现对未知文本的切分。我们知道,汉语中各个字单独作词语的能力是不同的,此外有的字常常作为前缀出现,有的字却常常作为后缀(“者”“性”),结合两个字相临时是否成词的信息,这样就得到了许多与分词有关的知识。这种方法就是充分利用汉语组词的规律来分词。这种方法的最大缺点是需要有大量预先分好词的语料作支撑,而且训练过程中时空开销极大。
到底哪种分词算法的
准确度更高,目前并无定论。对于任何一个成熟的分词系统来说,不可能单独依靠某一种算法来实现,都需要综合不同的算法。例如,
海量科技的分词算法就采用“复方分词法”,所谓复方,就是像
中西医结合般综合运用机械方法和知识方法。对于成熟的中文分词系统,需要多种算法综合处理问题。
技术难点
有了成熟的分词算法,是否就能容易的解决中文分词的问题呢?事实远非如此。中文是一种十分复杂的语言,让
计算机理解中文语言更是困难。在中文分词过程中,有两大难题一直没有完全突破。
歧义识别
歧义是指同样的一句话,可能有两种或者更多的切分方法。主要的歧义有两种:交集型歧义和组合型歧义,例如:表面的,因为“表面”和“面的”都是词,那么这个短语就可以分成“表面 的”和“表 面的”。这种称为交集型歧义(交叉歧义)。像这种交集型歧义十分常见,前面举的“和服”的例子,其实就是因为交集型歧义引起的错误。“化妆和服装”可以分成“化妆 和 服装”或者“化妆 和服 装”。由于没有人的知识去理解,计算机很难知道到底哪个方案正确。
交集型歧义相对组合型歧义来说是还算比较容易处理,组合型歧义就必须根据整个句子来判断了。例如,在句子“这个
门把手坏了”中,“把手”是个词,但在句子“请把手拿开”中,“把手”就不是一个词;在句子“将军任命了一名中将”中,“中将”是个词,但在句子“产量三年中将增长两倍”中,“中将”就不再是词。这些词计算机又如何去识别?
如果交集型歧义和组合型歧义计算机都能解决的话,在歧义中还有一个难题,是真歧义。真歧义意思是给出一句话,由人去判断也不知道哪个应该是词,哪个应该不是词。例如:“乒乓球拍卖完了”,可以切分成“乒乓 球拍 卖 完 了”、也可切分成“乒乓球 拍卖 完 了”,如果没有上下文其他的句子,恐怕谁也不知道“拍卖”在这里算不算一个词。
新词识别
命名实体(人名、地名)、新词,
专业术语称为
未登录词。也就是那些在分词词典中没有收录,但又确实能称为词的那些词。最典型的是人名,人可以很容易理解。句子“王军虎去广州了”中,“王军虎”是个词,因为是一个人的名字,但要是让计算机去识别就困难了。如果把“王军虎”做为一个词收录到字典中去,全世界有那么多名字,而且每时每刻都有新增的人名,收录这些人名本身就是一项既不划算又巨大的工程。即使这项工作可以完成,还是会存在问题,例如:在句子“王军虎头虎脑的”中,“王军虎”还能不能算词?
除了人名以外,还有机构名、地名、产品名、商标名、简称、省略语等都是很难处理的问题,而且这些又正好是人们经常使用的词,因此对于搜索引擎来说,分词系统中的新词识别十分重要。新词识别准确率已经成为评价一个分词系统好坏的重要标志之一。
技术应用
在
自然语言处理技术中,中文处理技术比西文处理技术要落后很大一段距离,许多西文的
处理方法中文不能直接采用,就是因为中文必需有分词这道工序。中文分词是其他
中文信息处理的基础,
搜索引擎只是中文分词的一个应用。其他的比如
机器翻译(MT)、
语音合成、
自动分类、
自动摘要、自动校对等等,都需要用到分词。因为中文需要分词,可能会影响一些研究,但同时也为一些企业带来机会,因为国外的计算机处理技术要想进入中国市场,首先也是要解决中文分词问题。
分词
准确性对搜索引擎来说十分重要,但如果分词速度太慢,即使准确性再高,对于搜索引擎来说也是不可用的,因为搜索引擎需要处理数以亿计的网页,如果分词耗用的时间过长,会严重影响搜索引擎内容更新的速度。因此对于搜索引擎来说,分词的准确性和速度,二者都需要达到很高的要求。研究中文分词的大多是科研院校,
清华、北大、
哈工大、中科院、
北京语言大学、
山西大学、
东北大学、
IBM研究院、
微软中国研究院等都有自己的研究队伍,而真正专业研究中文分词的商业公司除了海量以外,几乎没有了。科研
院校研究的技术,大部分不能很快产品化,而一个专业公司的力量毕竟有限,看来中文
分词技术要想更好的服务于更多的产品,还有很长一段路。
常见项目
word分词
word分词是一个
Java实现的分布式的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。能准确识别英文、数字,以及日期、时间等
数量词,能识别人名、地名、组织机构名等未登录词。能通过自定义
配置文件来改变组件行为,能自定义用户词库、自动检测词库变化、支持大规模分布式环境,能灵活指定多种分词算法,能使用refine功能灵活控制分词结果,还能使用词性标注、同义标注、反义标注、拼音标注等功能。同时还无缝和
Lucene、
Solr、
ElasticSearch、
Luke集成。
智呈分词
功能性能
一个PHP函数实现中文分词。使分词更容易,如图《SCWS调用示例》所示
SCWS
Hightman开发的一套基于
词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。
FudanNLP
FudanNLP主要是为中文
自然语言处理而开发的
工具包,也包含为实现这些任务的
机器学习算法和
数据集。本工具包及其包含数据集使用
LGPL3.0许可证。开发语言为Java。功能包括中文分词等,不需要字典支持。
这是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,
API不超过200KB,各种词典
数据压缩后不到3M.ICTCLAS全部采用
C/C++编写,支持
Linux、
FreeBSD及Windows系列操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。
HTTPCWS
HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持
Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009
共享版中文分词算法”的API
进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展。
CC-CEDICT
一个中文词典
开源项目,提供一份以汉语拼音为中文辅助的汉英辞典,截至2009年2月8日,已收录82712个单词。其词典可以用于中文分词使用,而且不存在
版权问题。
Chrome中文版就是使用的这个词典进行中文分词的。
IK
IKAnalyzer是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。
Paoding
Paoding(庖丁解牛分词)基于Java的开源中文分词组件,提供lucene和solr 接口,具有极 高效率和 高扩展性。引入隐喻,采用完全的
面向对象设计,构思先进。
高效率:在PIII 1G内存个人机器上,1秒可准确分词 100万汉字。
采用基于 不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。
能够对未知的词汇进行合理解析。
仅支持Java语言。
MMSEG4J
MMSEG4J基于Java的开源中文分词组件,提供lucene和solr 接口:
1.
mmseg4j 用 Chih-Hao Tsai 的 MMSeg 算法实现的中文分词器,并实现 lucene 的 analyzer 和 solr 的TokenizerFactory 以方便在Lucene和Solr中使用。
2.MMSeg 算法有两种分词方法:Simple和Complex,都是基于正向最大匹配。Complex 加了四个规则过虑。官方说:词语的正确
识别率达到了 98.41%。
mmseg4j 已经实现了这两种分词算法。
盘古分词是一个基于.net 平台的开源中文分词组件,提供lucene(.net 版本) 和HubbleDotNet的接口
高效:Core Duo 1.8
GHz 下单
线程 分词速度为 390K 字符每秒
准确:盘古分词采用字典和统计结合的分词算法,分词准确率较高。
功能:盘古分词提供中文人名识别,简繁混合分词,多元分词,英文词根化,强制一元分词,词频优先分词,
停用词过滤,英文专名提取等一系列功能。
Jcseg
jcseg是使用Java开发的一个中文分词器,使用流行的mmseg算法实现。
1。mmseg四种
过滤算法,分词准确率达到了98.4%以上。
2。支持
自定义词库。在lexicon文件夹下,可以随便添加/删除/更改词库和词库内容,并且对词库进行了分类,词库整合了《
现代汉语词典》和cc-cedict辞典。
3。词条拼音和
同义词支持,jcseg为所有词条标注了拼音,并且词条可以添加同义词集合,jcseg会自动将拼音和同义词加入到分词结果中。
6。支持基本单字单位的识别,例如2012年。
7。良好的英文支持,自动识别
电子邮件,网址,分数,小数,
百分数……。
8。智能圆角半角转换处理。
9。特殊字母识别:例如:Ⅰ,Ⅱ
10。特殊数字识别:例如:①,⑩
11。配对标点内容提取:例如:最好的Java书《java编程思想》,‘畅想杯
黑客技术大赛’,被『,‘,“,』标点标记的内容。
12。智能中文人名识别。中文人名识别正确率达94%以上。
jcseg佩带了jcseg.
properties配置文档,使用
文本编辑器就可以自主的编辑其选项,配置适合不同应用场合的分词应用。例如:最大匹配分词数,是否开启中文人名识别,是否载入词条拼音,是否载入词条同义词……。
friso
friso是使用
c语言开发的一个中文分词器,使用流行的mmseg算法实现。完全基于
模块化设计和实现,可以很方便的植入到其他程序中,例如:
MySQL,PHP等。并且提供了一个php中文分词扩展
robbe。
1。只支持
UTF-8编码。【源码无需修改就能在各种平台下编译使用,加载完20万的词条,内存占用稳定为14M。】。
2。mmseg四种过滤算法,分词准确率达到了98.41%。
3。支持自定义词库。在dict文件夹下,可以随便添加/删除/更改词库和词库词条,并且对词库进行了分类。
4。词库使用了friso的Java版本jcseg的简化词库。
7。很好的英文支持,电子邮件,网址,小数,分数,百分数。
8。支持阿拉伯数字基本单字单位的识别,例如2012年,5吨,120斤。
并且具有很高的分词速度:简单模式:3.7M/秒,复杂模式:1.8M/秒。