首页 > 算法 > 分词系统汇总

分词系统汇总

Nov 20th,2011 发表评论

分词的原理

1、 英文分词的原理

基本的处理流程是:输入文本、词汇分割、词汇过滤(去除停留词)、词干提取(形态还原)、大写转为小写、结果输出。

2、 中文分词原理

中文分词比较复杂,并没有英文分词那么简单。这主要是因为中文的词与词之间并不像英文中那样用空格来隔开。

主要的方法有三种:基于词典匹配的分词方法、基于语义理解的分词、基于词频统计的分词。


2.1.基于词典匹配的分词方法
基于字典匹配的分词方法按照一定的匹配策略将输入的字符串与机器字典词条进行匹配。如果在词典中找到当前字符串,则匹配成功输出识别的词汇。

  • 按照匹配操作的扫描方向不同,字典匹配分词方法可以分为正向匹配和逆向匹配,以及结合了两者的双向匹配算法;
  • 按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;
  • 按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与词性标注相结合的方法。几种常用的词典分词方法如下所示:正向最大匹配(由左到右的方向)。逆向最大匹配(由右到左的方向)。最少切分(是每一句中切除的词数最小)。

实际应用中上述各种方法经常组合使用,达到最好的效果,从而衍生出了结合正向最大匹配方法和逆向最大匹配算法的双向匹配分词法。由于中分词最大的问题是歧义处理,结合中文语言自身的特点,经常采用逆向匹配的切分算法,处理的精度高于正向匹配,产生的切分歧义现象也较少。

真正实用的分词系统,都是把词典分词作为基础手段,结合各种语言的其他特征信息来提高切分的效果和准确度。有的实用系统中将分词和词性标注结合起来,利用句法和词法分析对分词决策提高帮助,在词性标注过程中迭代处理,利用词性和语法信息对分词结果进行检验、调整。既然是基于分词词典的分词方法,当然还要考虑选择一个好的查找词典算法。一般有数字搜索树,Trie 算法等等。所谓的数字搜索树(retrieve 树)就是要求树的一个节点保留一个字符。如果一个单词比一个字符长,则包含第一个字符串的节点有指向下一个字符的节点,以此类推。这样组成一个层次结构的树,树的第一层包括所有单词的第一个字符,树的第二层包括所有单词的第二个字符,以此类推,数字搜索树的最大高度是词典中最长单词的长度。但是这样的树,每一个节点都需要很多内存。假设每个词都是由一个小写英文字母组成的,这个节点中会有26 个指针。所以不太可能直接用这样的数字搜索树来存储中文这样的大字符集。Trie 树,即三叉搜索树,每一个节点包括一个字符,但只有三个指针,一个指向左边的树,一个指向右边的树,还有一个向下,指向单词的下一个数据单元。三叉搜索树是二叉搜索树和数字搜索树的混合体。它有和数字搜索树差不多的速度但是和二叉搜索树一样只需要相对较少的内存空间。单词的读入顺序对于创建平衡的三叉搜索树很重要,但对于二叉搜索树就不是太重要了。由于限于篇幅,这里就不写上代码了。

2.2基于语义理解的分词
基于语义理解的分词方法是模拟人脑对语言和句子的理解,达到识别词汇单元的效果。基本模式是把分词、句法、语义分析并行进行,利用句法和语义信息来处理分词的歧义。一般结构中通常包括分词子系统、句法语义子系统、调度系统。在调度系统的协调下,分词子系统可以获得有关词、句子等的句法和语义信息,模拟人脑对句子的理过程。基于语义理解的分词方法需要使用大量的语言知识和信息。目前国内外对汉语语言知识的理解和处理能力还没有达到语义层面,具体到语言信息很难组织成机器可直接读取、计算的形式,因此目前基于语义理解的分词系统还处在试验阶段。

2.3基于词频统计的分词
这种做法基于人们对中文词语的直接感觉。通常词是稳定的词的组合,因此在中文文章的上下文中,相邻的字搭配出现的频率越多,就越有可能形成一个固定的词。根据n 元语法知识可以知道,字与字相邻同时出现的频率或概率能够较好地反映成词的可信度。实际的系统中,通过对精心准备的中文语料中相邻共现的各个字的组合的频度进行统计,计算不同字词的共现信息。根据两个字的统计信息,计算两个汉字的相邻共现概率。统计处来的信息体现了中文环境下汉字之间结合紧密程度。当紧密程度高于某一个阈值时,便可认为此字组可能构成一个词。基于词频统计的分词方法只需要对语料中的字组频度进行统计,不需要切分词典,因而又叫做无词典分词法或统计分词方法。这种方法经常抽出一些共现频度高、但并不是词的常用字组,需要专门处理,提高精确度。实际应用的统计分词系统都使用一个基本的常用词词典,把字典分词和统计分词结合使用。基于统计的方法能很好地解决词典未收录新词的处理问题,即将中文分词中的串频统计和串匹配结合起来,既发挥匹配分词切分速度快、效率高的特点,有利用了无词典分词结合上下文识别生词、自动消除歧义的优点。

TF-IDF

TF-IDF(term frequency–inverse document frequency)是一种用于信息搜索和信息挖掘的常用加权技术。在搜索、文献分类和其他相关领域有广泛的应用。

TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)的主要思想是:如果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

使用TF*IDF可以计算某个关键字在某篇文章里面的重要性,因而识别这篇文章的主要含义,实现计算机读懂文章的功能。

 

提取标签其中一步:去停止词

分词后要去除停止词,停止词自己从网上搜索一份,如果不去除停止词,最后肯定是“了”,“的”,“我”等词出现的频率最高,你不会把这些常用词做tags吧,呵呵。当然NICTCLAS是可以标注中文词性的,你可以分词后把语气词、副词等虚词去了,这样更好一些,但我就懒得做了,直接分词、去除停止词两步。

完了计算每个词出现的频率就好说了,弄一个全局的字典,每个词出现一次增加一个计数,第一次出现先添加到字典,并计数为0,最后把出现次数在某个阈值以上的词插入到数据库里,这就是你要的tag了。

 

常见中文分词系统:

1、ICTCLAS – 全球最受欢迎的汉语分词系统

中文词法分析是中文信息处理的基础与关键。中国科学院计算技术研究所在多年研究工作积累的基础上,研制出了汉语词法分析系统ICTCLAS(Institute of Computing Technology, Chinese Lexical Analysis System),主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典;支持繁体中文;支持GBK、UTF-8、UTF-7、UNICODE等多种编码格式。我们先后精心打造五年,内核升级6次,目前已经升级到了ICTCLAS3.0。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到3M,是当前世界上最好的汉语词法分析器。

系统平台:Windows

开发语言:C/C++、Java、C#

使用方式:dll调用

演示网址:http://ictclas.org/ictclas_demo.html

开源官网:http://ictclas.org

作者博客:http://hi.baidu.com/drkevinzhang/blog/category/ictclas%B7%D6%B4%CA

晴枫附注:ICTCLAS有共享版、商业版、行业版,支持Linux平台,但不开源。ICTCLAS已进入商用,且应用范围较广,相信分词效率出色。

2、HTTPCWS – 基于HTTP协议的开源中文分词系统(张宴模仿ICTCLAS 3.0 共享版搞的,原名phpcws)

HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。

ICTCLAS是中国科学院计算技术研究所在多年研究工作积累的基础上,基于多层隐马模型研制出的汉语词法分析系统,主要功能包括中文分词;词性标注;命名实体识别;新词识别;同时支持用户词典。ICTCLAS经过五年精心打造,内核升级6次,目前已经升级到了ICTCLAS3.0,分词精度98.45%,各种词典数据压缩后不到3M。ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名,是当前世界上最好的汉语词法分析器。

ICTCLAS 3.0 商业版是收费的,而免费提供的 ICTCLAS 3.0 共享版不开源,词库是根据人民日报一个月的语料得出的,很多词语不存在。所以本人补充的一个19万条词语的自定义词库,对ICTCLAS分词结果进行合并处理,输出最终分词结果。

由于 ICTCLAS 3.0 2009 共享版只支持GBK编码,因此,如果是UTF-8编码的字符串,可以先用iconv函数转换成GBK编码,再用httpcws进行分词处理,最后转换回UTF-8编码。

HTTPCWS 软件自身(包括httpcws.cpp源文件、dict/httpcws_dict.txt自定义词库)采用NewBSD开源协议,可以自由修改。HTTPCWS 使用的 ICTCLAS 共享版 API 及 dict/Data/ 目录内的语料库,版权及著作权归中国科学院计算技术研究所、ictclas.org所有,使用需遵循其相关协议。

系统平台:Linux

开发语言:C++

使用方式:HTTP服务

演示网址:http://blog.s135.com/demo/httpcws/

开源官网:http://blog.s135.com/httpcws_v100/

下载地址:http://code.google.com/p/httpcws/

 

原名phpcws:http://blog.s135.com/phpcws_v100/

晴枫附注:基于ICTCLAS,增加了19万条词语的扩展词库,并且构建成HTTP服务的方式,使用上更加便捷。

3、SCWS – 简易中文分词系统

SCWS 在概念上并无创新成分,采用的是自行采集的词频词典,并辅以一定程度上的专有名称、人名、地名、数字年代等规则集,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些中小型搜索引擎、关键字提取等场合运用。 SCWS 采用纯 C 代码开发,以 Unix-Like OS 为主要平台环境,提供共享函数库,方便植入各种现有软件系统。此外它支持 GBK,UTF-8,BIG5 等汉字编码,切词效率高。

系统平台:Windows/Unix

开发语言:C

使用方式:PHP扩展

演示网址:http://www.ftphp.com/scws/demo.php

开源官网:http://www.ftphp.com/scws/

晴枫附注:作为PHP扩展,容易与现有的基于PHP架构的Web系统继续集成,是其一大优势。

4、PhpanAlysis – PHP无组件分词系统

PhpanAlysis分词系统是基于字符串匹配的分词方法 ,这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配 和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。

系统平台:PHP环境

开发语言:PHP

使用方式:HTTP服务

演示网址:http://www.itgrass.com/phpanalysis/

开源官网:http://www.itgrass.com/phpanalysis/

晴枫附注:实现简单,容易使用,能做一些简单应用,但大数据量的计算效率不如前几种。

试用了几个系统,基本分词功能都没什么问题,只是在个别一些词的划分上存在一些差异;对于词性的确定,系统间有所不同。

5 、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 已经实现了这两种分词算法。

6、盘古分词

盘古分词是一个基于.net 平台的开源中文分词组件,提供lucene(.net 版本) 和HubbleDotNet的接口

高效:Core Duo 1.8 GHz 下单线程 分词速度为 390K 字符每秒

准确:盘古分词采用字典和统计结合的分词算法,分词准确率较高。

功能:盘古分词提供中文人名识别,简繁混合分词,多元分词,英文词根化,强制一元分词,词频优先分词,停用词过滤,英文专名提取等一系列功能。

7、IKAnalyzer  开源的轻量级中文分词工具包

IKAnalyzer 是一个开源的,基于java语言开发的轻量级的中文分词工具包。从2006年12月推出1.0版开始,IKAnalyzer已经推出 了3个大版本。最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。新版本的IKAnalyzer3.0则发展为 面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。

IKAnalyzer3.0特性:

采用了特有的“正向迭代最细粒度切分算法“,具有60万字/秒的高速处理能力。

采用了多子处理器分析模式,支持:英文字母(IP地址、Email、URL)、数字(日期,常用中文数量词,罗马数字,科学计数法),中文词汇(姓名、地名处理)等分词处理。优化的词典存储,更小的内存占用。

支持用户词典扩展定义,针对Lucene全文检索优化的查询分析器IKQueryParser(作者吐血推荐);采用歧义分析算法优化查询关键字的搜索排列组合,能极大的提高Lucene检索的命中率。

8.Xapian是一个用C++编写的英文全文检索程序

Xapian的api和检索原理和lucene在很多方面都很相似,但是也有一些地方存在不同,具体请看Xapian自己的文档:http://www.xapian.org/docs/

Xapian除了提供原生的C++编程接口之外,还提供了Perl,PHP,Python和Ruby编程接口和相应的类库,所以你可以直接从自己喜欢的脚本编程语言当中使用Xapian进行全文检索了。

 

 

其它分词系统(多英文)

1、 StopAnalyzer

StopAnalyzer 能过滤词汇中的特定字符串和词汇,并且完成大写转小写的功能。

2、 StandardAnalyzer

StandardAnalyzer 根据空格和符号来完成分词,还可以完成数字、字母、E-mail 地址、IP 地址以及中文字符的分析处理,还可以支持过滤词表,用来代替StopAnalyzer 能够实现的过滤功能。

3、 SimpleAnalyzer

SimpleAnalyzer 具备基本西文字符词汇分析的分词器,处理词汇单元时,以非字母字符作为分割符号。分词器不能做词汇的过滤,之进行词汇的分析和分割。输出地词汇单元完成小写字符转换,去掉标点符号等分割符。

在全文检索系统开发中,通常用来支持西文符号的处理,不支持中文。由于不完成单词过滤功能,所以不需要过滤词库支持。词汇分割策略上简单,使用非英文字符作为分割符,不需要分词词库的支持。

4、 WhitespaceAnalyzer

WhitespaceAnalyzer 使用空格作为间隔符的词汇分割分词器。处理词汇单元的时候,以空格字符作为分割符号。分词器不做词汇过滤,也不进行小写字符转换。

实际中可以用来支持特定环境下的西文符号的处理。由于不完成单词过滤和小写字符转换功能,也不需要过滤词库支持。词汇分割策略上简单使用非英文字符作为分割符,不需要分词词库支持。

5、 KeywordAnalyzer

KeywordAnalyzer 把整个输入作为一个单独词汇单元,方便特殊类型的文本进行索引和检索。针对邮政编码,地址等文本信息使用关键词分词器进行索引项建立非常方便。

6、 CJKAnalyzer

CJKAnalyzer 内部调用CJKTokenizer 分词器,对中文进行分词,同时使用StopFilter 过滤器完成过滤功能,可以实现中文的多元切分和停用词过滤。在Lucene3.0 版本中已经弃用。

7、 ChineseAnalyzer

ChineseAnalyzer 功能与StandardAnalyzer 分析器在处理中文是基本一致,都是切分成单个的双字节中文字符。在Lucene3.0 版本中已经弃用。

8、 PerFieldAnalyzerWrapper

PerFieldAnalyzerWrapper 功能主要用在针对不同的Field 采用不同的Analyzer 的场合。比如对于文件名,需要使用KeywordAnalyzer ,而对于文件内容只使用StandardAnalyzer 就可以了。通过addAnalyzer() 可以添加分类器。

9、 JE-Analysis

JE-Analysis 是Lucene 的中文分词组件,需要下载。

10、 Imdict-Chinese-Analyzer

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

11、 Paoding Analysis

Paoding Analysis 中文分词具有极高效率和高扩展性。引入隐喻,采用完全的面向对象设计,构思先进。其效率比较高,在PIII 1G 内存个人机器上,1 秒可准确分词100 万汉字。采用基于不限制个数的词典文件对文章进行有效切分,使能够将对词汇分类定义。能够对未知的词汇进行合理解析。

 

声明: 本文采用 BY-NC-SA 协议进行授权. 转载请注明转自: 分词系统汇总
  1. 本文目前尚无任何评论.
  1. Ti » 改进的同义词替换算法
    2011年11月20日16:05