`
liuxinglanyue
  • 浏览: 561780 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

开源中文分词算法

阅读更多

一,IK Analyzer(暗黑的“不朽之王Immortal King”) :IK Analyzer 是更多的考虑了互联网用户在产品及名址信息搜索这块的应用,IK特别适用于搜索商家,产品,名址,如商品交易,美食,娱乐,电子地图等,因为它是基于这样 的应用诞生的。IK在一开始的设计的时候,它有一个隐形的目标,是对数词,量词,专有名词的增强处理,这是由于它的基于web gis搜索的需求定位决定的。

在IKQuerypa
rser 中,它不是简单的返回所有分词结果的组合,而是建立起一个分词树,将有可能的组合放在一起,它的输出会类似于这样:(“永和” && “服装” && “饰品”) || (“和服”&& “装饰”), 通过这个搜索逻辑去索引中进行匹配。

二,JE-MManalyzer:它的算法具有歧义分析,比较适合做垂直搜索和信息挖掘。他的中文名称是“极易”,开发者的理念是-简单即是美。 

三,中科院的分词器(ICTCLAS):中科院的分词器很牛,其切分结果明显基于语义分析。
下载地址 :http://ictclas.org/Down_OpenSrc.asp 

四,paoding:paoding的结构设计的非常灵活,适合于对其进行开源改造。 

五,mmseg4j:单从mmseg4j 的项目介绍上看,它是一个很纯粹的基于词典分词的实现,既有细粒度的切分,也有最大长度的切分。应该说,是一个学习词典分词的很好的典范。

IK分词多些但速度比paoding差些。

=========================


3. 用户自定义词库:

paoding :支持不限制个数的用户自定义词库,纯文本格式,一行一词,使用后台线程检测词库的更新,自动编译更新过的词库到二进制版本,并加载
imdict :暂时不支持用户自定义词库。但 原版 ICTCLAS 支持。支持用户自定义 stop words
mmseg4j :自带sogou词库,支持名为 wordsxxx.dic, utf8文本格式的用户自定义词库,一行一词。不支持自动检测。 -Dmmseg.dic.path
ik : 支持api级的用户词库加载,和配置级的词库文件指定,无 BOM 的 UTF-8 编码,\r\n 分割。不支持自动检测。

 

 

4. 速度(基于官方介绍,非自己测试)

paoding :在PIII 1G内存个人机器上,1秒 可准确分词 100万 汉字
imdict :483.64 (字节/秒),259517(汉字/秒)
mmseg4j : complex 1200kb/s左右, simple 1900kb/s左右
ik :具有50万字/秒的高速处理能力

 

 

5. 算法和代码复杂度

paoding :svn src 目录一共1.3M,6个properties文件,48个java文件,6895 行。使用不用的 Knife 切不同类型的流,不算很复杂。
imdict :词库 6.7M(这个词库是必须的),src 目录 152k,20个java文件,2399行。使用 ICTCLAS HHMM隐马尔科夫模型,“利用大量语料库的训练来统计汉语词汇的词频和跳转概率,从而根据这些统计结果对整个汉语句子计算最似然(likelihood)的切分”
mmseg4j : svn src 目录一共 132k,23个java文件,2089行。MMSeg 算法 ,有点复杂。
ik : svn src 目录一共6.6M(词典文件也在里面),22个java文件,4217行。多子处理器分析,跟paoding类似,歧义分析算法还没有弄明白。

 

 

6. 文档

paoding :几乎无。代码里有一些注释,但因为实现比较复杂,读代码还是有一些难度的。
imdict : 几乎无。 ICTCLAS 也没有详细的文档,HHMM隐马尔科夫模型的数学性太强,不太好理解。
mmseg4j : MMSeg 算法 是英文的,但原理比较简单。实现也比较清晰。
ik : 有一个pdf使用手册,里面有使用示例和配置说明。

 

 

7. 其它

paoding :引入隐喻,设计比较合理。search 1.0 版本就用的这个。主要优势在于原生支持词库更新检测。主要劣势为作者已经不更新甚至不维护了。
imdict :进入了 lucene trunk,原版 ictclas 在各种评测中都有不错的表现,有坚实的理论基础,不是个人山寨。缺点为暂时不支持用户词库。
mmseg4j : 在complex基础上实现了最多分词(max-word),但是还不成熟,还有很多需要改进的地方。
ik : 针对Lucene全文检索优化的查询分析器IKQueryParser

 

 

8. 结论

个人觉得,可以在 mmseg4j 和 paoding 中选一个。关于这两个分词效果的对比,可以参考:

http://blog.chenlb.com/2009/04/mmseg4j-max-word-segment-compare-with-paoding-in-effect.html

或者自己再包装一下,将 paoding 的词库更新检测做一个单独的模块实现,然后就可以在所有基于词库的分词算法之间无缝切换了。

 

 

ps,对不同的 field 使用不同的分词器是一个可以考虑的方法。比如 tag 字段,就应该使用一个最简单的分词器,按空格分词就可以了。

 

======================================

 

 

对paoding je、IK等进行测试,发现JE使用时一不注意就容易出现在索引或者检索时内存泄漏,其加载字典时花费内存45m左右,所以在运行时一般会在环境下设置内存参数 -Xmx256M等方法解决 

paoding 比较麻烦的是要设置字典的环境变量,一般做法是新建环境变量 
PAODING_DIC_HOME 
再加入字典路径(如 F:\paoding-analysis\dic) 
这种方法在项目移位后还得配置字典环境,麻烦 
可以直接把paoding源文件夹下的paoding-dic-home.properties拷贝的你自己的 
项目src文件夹下,然后将paoding-dic-home.properties文件中的 
#paoding.dic.home=dic修改成 
paoding.dic.home=F:/paoding-analysis/dic即可 

当然你可以自己建一个名为paoding-dic-home.properties的文件 
在里面加入一条语句paoding.dic.home=F:/paoding-analysis/dic(字典路径,自己换) 

别忘记拷贝lib文件夹下的jar文件到项目中, 

commons-logging.jar一定不能少 


----------------------------下面是对同一个文件分词时间消耗 
Time taken for PaoDing Analyzer behaviour : 1156 milli seconds 
Time taken for IK Analyzer behaviour : 1531 milli seconds 
Time taken for JE Analyzer behaviour : 1719 milli seconds

 

分享到:
评论

相关推荐

    最新逆向最大匹配分词算法 盘古分词 分词算法 中文分词 源码

    盘古分词是一个知名的开源中文分词工具,它采用了高效的分词算法,包括逆向最大匹配法,能够提供准确且快速的分词服务。盘古分词支持多种分词模式,如精确模式、全模式和搜索引擎模式,以满足不同应用场景的需求。 ...

    中文分词算法

    本文将详细介绍两种主要的中文分词算法:基于统计的贝叶斯算法以及ChineseAnalysis和IKAnalysis这两个开源算法。 首先,让我们探讨基于统计的贝叶斯算法。贝叶斯算法是一种在概率论框架下进行决策的统计方法,它以...

    C#文章分类程序(基于shootseg中文分词算法、词频分类)

    ShootSeg开源分词算法是这个程序的核心部分,它的设计和实现考虑到了中文语言的特点,如词语边界模糊、多音字和成语等问题。通过分词,程序能够理解文章的内容并提取关键信息。在分词基础上,程序进一步采用了“词频...

    运用在lucene中的中文分词算法源码

    《深入剖析Lucene中的中文分词算法源码》 在信息检索领域,Lucene作为一款强大的全文搜索引擎库,被广泛应用于各种数据检索系统。而中文分词是Lucene处理中文文本时的关键步骤,它决定了搜索的准确性和效率。本文将...

    基于HTTP协议的开源中文分词系统,64位

    常见的分词算法有最大匹配法、前向最大匹配、逆向最大匹配、Viterbi算法等,可能还会结合词典、统计模型和深度学习方法来提升分词准确率。 2. 词典:分词依赖于丰富的词库,包含各种词汇及其对应的属性,如词性、...

    中文分词工具word-1.0,Java实现的中文分词组件多种基于词典的分词算法

    word分词是一个Java实现的中文分词组件,提供了多种基于词典的分词算法,并利用ngram模型来消除歧义。 能准确识别英文、数字,以及日期、时间等数量词,能识别人名、地名、组织机构名等未登录词。 同时提供了Lucene...

    盘古分词-开源中文分词组件词典-词典

    每个词都有对应的词频信息,用于指导分词算法进行决策,即在遇到连续的汉字序列时,选择出现频率更高的切分方式。词典的大小和质量直接影响分词效果,通常需要不断更新以适应语言的发展和特定领域的术语。 2. **...

    中文分词开源项目 JAVA中文分词

    JMenu algorithmMenu = new JMenu("分词算法"); JMenu trainMenu = new JMenu("训练语料"); JMenu helpMenu = new JMenu("帮助"); openDicItem = fileMenu.add("载入词典"); fileMenu.addSeparator(); ...

    基于HTTP协议的开源中文分词系统,php演示

    7. **自然语言处理API**:通过HTTP协议提供分词服务,可以看作是一种NLP API,使得开发者无需深入了解复杂的分词算法,就能在自己的应用中集成中文分词功能。 8. **应用实例**:这样的系统可以应用于各种场景,如...

    src_seg(java).rar_java 分词_中文文本分词_分词 java_分词算法

    《Java实现中文文本分词算法详解》 在信息爆炸的时代,中文文本的处理与分析显得尤为重要,其中分词是基础且关键的一环。本篇文章将深入探讨如何利用Java语言实现中文文本的分词,旨在帮助开发者理解并掌握这一技术...

    工具查询开源中文分词系统 HTTPCWS 1.0.0 PHP演示程序-httpcws-php-demo.zip

    中文分词是将连续的汉字序列按照语义和语法切分成有意义的词语单位,是理解和处理中文文本的基础步骤。 【描述】中提到的“httpcws-php-demo.zip”表明这是一份压缩包,包含了HTTPCWS的PHP演示程序。用户可以下载、...

    CRF 分词算法

    **CRF分词算法详解** 条件随机场(Conditional Random Fields, CRF)是一种在序列标注任务中广泛应用的统计建模方法。在这个压缩包文件中,包含了一个名为"crfparser_0.10"的程序,它是一个实现CRF算法的源代码库,...

    盘古中文分词 开源 C#

    总之,盘古中文分词是一款优秀的开源分词工具,不仅在性能和准确性上表现出色,而且具有良好的可扩展性和社区支持,是C#开发者进行中文信息处理的理想选择。通过阅读和研究其源代码,开发者不仅可以提升自身的分词...

    IK Analyzer 开源中文分词 2012 u6.zip

    最初,它是以开源项目Luence为应用主体的,结合词典分词和文法分析算法的中文分词组件。从3.0版本开 始,IK发展为面向Java的公用分词组件,独立于Lucene项目,同时提供了对Lucene的默认优化实现。在2012版本中,IK...

    gkseg, 基于字符的标注启发式算法和通用通用分词算法中的另一个.zip

    gkseg, 基于字符的标注启发式算法和通用通用分词算法中的另一个 GkSeg: 另一个中文分词软件包GkSeg是由 Guokr.com. 提供的汉语分词包,它是基于字符标注启发算法和通用格式算法。目前它只支持Linux平台。特性精确:>...

    使用IK Analyzer实现中文分词之Java实现

    最初,它是以开源项目Luence 为应用主体的,结合词典分词和文法分析算法的中文分词组件。 从 3.0 版本开始,IK 发展为面向 Java 的公用分词组件,独立于 Lucene 项目,同时提供了对 Lucene 的默认优化实现。 在 2012...

    python中文分词

    Python中文分词是Python在处理中文文本时的关键技术,它涉及到自然语言处理(NLP)领域,主要用于将连续的汉字序列切分成具有语义的单个词汇,这在数据分析、机器学习、信息检索、文本挖掘等领域有着广泛的应用。...

    c#中文分词类库 可用来做搜索引擎分词 准确率90% 支持Lucene.net

    6. **评估与优化**:了解如何评估分词效果,如F1分数、准确率、召回率等指标,以及如何优化分词算法以提高性能。 开发者在实际应用中,需要结合这些知识点,学习如何将分词类库集成到自己的项目中,以满足特定的...

    golang中文分词服务(基于scws的c语言分词算法),提.zip

    golang中文分词服务(基于scws的c语言分词算法),提

    开源_易语言中文分词_非网页调用

    所以这个分词算法用于提权关键字是比较合适的 .用于更高的要求估计还不够合适 .sqlite采用的是kyozy的sqlite模块,因为他的模块可以吧数据库读入内存... .程序中还有许多可以提升速度的地方....比如说使用的数据库...

Global site tag (gtag.js) - Google Analytics