我在前一篇文章向大家介绍了
libmmseg实现ruby的中文分词,在这篇文章当中向大家介绍另外一个优秀的ruby中文分词程序rmmseg-cpp。
rmmseg是浙江大学的学生pluskid开发的纯ruby版本的中文分词程序,采用的也是“基于词典的最大匹配算法”,rmmseg的相关介绍请看:
http://www.iteye.com/news/1380。
rmmseg的主要问题是性能和内存消耗。用纯ruby编写的rmmseg分词的速度非常慢,而且内存消耗非常惊人,当使用复杂分词算法的时候,内存呈线性上升的现象,在我作的大量索引测试程序中曾经上升到了900MB以上。
为此rmmseg的作者pluskid再接再厉用C++重写了一遍rmmseg项目,这就是rmmseg-cpp。根据作者自己的简单测试表明:rmmseg-cpp的性能是rmmseg的400倍之多。下面简单介绍rmmseg-cpp的安装和使用:
1、安装
rmmseg-cpp目前只支持Unix操作系统,不支持Windows
gem install pluskid-rmmseg-cpp --source=http://gems.github.com
2、使用
require 'ferret'
require 'rmmseg'
analyzer = RMMSeg::Ferret::Analyzer.new do |tokenizer|
Ferret::Analysis::LowerCaseFilter.new(tokenizer)
end
就可以了,然后就可以使用analyzer进行分词索引和查询了。
rmmseg-cpp和libmmseg目前都可以作为比较好的ruby中文分词程序来使用,他们的性能和内存管理都相当不错,经过我们测试和使用的情况来看,都可以放心在生产环境当中使用。不过他们也有一些区别和各自的特点:
1、rmmseg-cpp的分词速度比libmmseg快一倍左右
rmmseg-cpp是专门为ruby的ferret编写的中文分词接口,代码十分简练,和ruby结合的很好;libmmseg主要是用来和sphinx配合的,并不是为ruby而写,他仅仅提供了一个非常简陋的ruby调用接口,在ruby程序当中使用中文分词的时候,rmmseg-cpp的性能明显胜出一筹。
2、rmmseg-cpp的内存管理似乎不如libmmseg稳定
Ruby本身是带有GC功能的脚本语言,用C/C++编写Ruby扩展本身是一件很麻烦的事情,因为C/C++自身是需要手工分配内存的,但是如果程序员对于Ruby的GC机制没有足够的了解,会带来很多麻烦,弄不好就可能内存泄漏,或者发生不期望的被使用中的对象被Ruby GC掉的问题。
rmmseg-cpp已经在GC方面下了很大的功夫,因此内存管理相当不错,但是我曾在一次数据量非常大量的全文索引过程当中观察到内存短时间内快速上升了几十MB的现象(但这种现象不常见)。
而libmmseg没有对ruby的依赖,仅仅提供一个简陋的接口,因此在数次测试当中,已经程序长时间运行观察下来,内存管理比rmmseg-cpp显得更加平稳一点,没有出现过一次内存快速上升的现象。
3、rmmseg-cpp目前没有Windows版本,而libmmseg支持windows版本
4、rmmseg-cpp安装配置很简单,不像libmmseg那么麻烦
总得来说,rmmseg-cpp和libmmseg都是用C++编写的优秀的中文分词程序,并且都可以支持在ruby当中实现全文检索的中文分词功能。如果不是特殊的需要,仅仅只是在ruby当中使用中文分词功能,那么推荐使用rmmseg-cpp。目前JavaEye网站的中文分词算法已经采用rmmseg-cpp,效果还不错。