作者:robbin 来源:robbin的自言自语   酷勤网收集 2008-05-24

摘要
  libmmseg主要被作者用来实现Sphinx全文检索软件的中文分词功能,因此作者给Sphinx提供了一个补丁文件,可以让Sphinx集成libmmseg,从而支持对于中文文章的全文检索功能。libmmseg从0.7.2版本开始,提供了ruby调用的接口,所以可直接在ruby程序里面调用libmmseg进行分词

libmmseg是李沫南用C++编写的开源的中文分词软件,libmmseg的分词算法采用的是“基于词库的最大匹配算法”,分词速度为每秒300KB左右。

libmmseg主要被作者用来实现Sphinx全文检索软件的中文分词功能,因此作者给Sphinx提供了一个补丁文件,可以让Sphinx集成libmmseg,从而支持对于中文文章的全文检索功能,关于这一点可以看:http://www.coreseek.cn/index.php?page=Sphinx的介绍。

libmmseg从0.7.2版本开始,作者提供了ruby调用的接口,所以我们可以直接在ruby程序里面调用libmmseg进行分词了。特别是我们可以用ferret去调用libmmseg分词功能,从而让ruby原生支持中文的全文检索,这无疑是一个好消息。然而libmmseg和ruby的集成颇有些麻烦,因此希望这篇文章可以提供一点点指导。

一、下载libmmseg

首先是到作者的网站下面最新版本的libmmseg http://www.coreseek.cn/opensource/mmseg/,但libmmseg 0.7.3作者还没有在网站上面更新,因此可以从本文附件下载。

二、安装libmmseg

解压缩以后,标准的Unix源代码编译安装流程:
C代码
  1. unzip mmseg-0.7.3.zip   
  2. cd mmseg-0.7.3   
  3. chmod a+x configure   
  4. ./configure   
  5. make && make install  


顺利的话libmmseg被安装到/usr/local相应的目录下面,建议再执行一下 ldconfig 命令,更新链接库缓存。

提示:编译libmmseg,gcc的版本必须是4.0以上。我的Linux是gcc 3.3.3编译失败,解决办法是注释掉src/css/UnigramCorpusReader.cpp这个文件的int UnigramCorpusReader::open(const char* filename, const char* type)方法里面的所有内容,让这个方法为空方法,这样就可以编译通过了。但是mmseg命令行工具就无法使用了。

三、安装ruby扩展

libmmseg软件包下面有一个ruby目录,进入该目录编译ruby。这里作者没有把相应的h文件依赖关系写好,因此需要我们手工把所有相关h文件拷贝到当前目录,确保编译的通过,详细操作如下:
C代码
  1. cd ruby   
  2. cp /usr/local/include/mmseg/*.h .    
  3. cp ../src/*.h .   
  4. cp ../src/css/*.h .   
  5. ruby extconf.lin.rb   
  6. make && make install  


顺利的话,编译好的mmseg.so就会被拷贝到ruby的系统库扩展目录下面。你可以简单的测试一下,进入irb,尝试load一下mmseg,看能否成功:
Ruby代码
  1. irb   
  2. require 'mmseg'  


四、创建词典文件

进入libmmseg软件包的data目录下面,执行如下命令:
C代码
  1. mmseg -u unigram.txt  

把生成的文件改名为uni.lib,拷贝到ruby目录下面,然后执行测试:ruby test.rb,如果一切都顺利的话,你可以看到test.rb测试是通过的。

提示:如果你的gcc版本低于4.0,则无法编译libmmseg,如果你按照前面的提示编译通过了,那么这里无法使用mmseg生成词典文件。解决办法就是另外找台机器安装gcc4.0编译,生成字典文件。

五、编写ferret的Analyzer,封装一个可以处理中文的分词器

我们知道ferret的StandardAnalyzer是不支持中文分词的,因此我们要自己封装一个Analyzer,用mmseg来分词。然后在我们自己的Rails项目目录下面,我们把前面创建好的词典文件uni.lib放在项目的dict/uni.lib位置(可以自己创建一个dict目录),记得在程序里面正确的加载词典文件:
Ruby代码
  1. require 'ferret'  
  2. require 'mmseg'  
  3.   
  4. class ChineseAnalyzer < Ferret::Analysis::Analyzer   
  5.   def initialize   
  6.     @mmseg = Mmseg.createSeg("#{RAILS_ROOT}/dict""")   
  7.   end  
  8.      
  9.   def token_stream(field, text)   
  10.     Ferret::Analysis::LowerCaseFilter.new(Tokenizer.new(@mmseg, text))   
  11.   end  
  12. end  
  13.   
  14. class Tokenizer < Ferret::Analysis::TokenStream   
  15.   def initialize(mmseg, text)   
  16.     @mmseg = mmseg   
  17.     self.text = text   
  18.   end  
  19.      
  20.   def next  
  21.     if @mmseg.next  
  22.       @token.text = @text[@mmseg.start...@mmseg.end]   
  23.       @token.start = @mmseg.start   
  24.       @token.end = @mmseg.end  
  25.       @token  
  26.     end  
  27.   end  
  28.      
  29.   def text   
  30.     @text  
  31.   end  
  32.   
  33.   def text=(text)   
  34.     @text = text   
  35.     @mmseg.setText(text)   
  36.     @token = Ferret::Analysis::Token.new("", 0, 0)   
  37.   end       
  38. end  


有了这个ChineseAnalyzer,我们就可以方便的在Rails程序里面进行中文分词和全文检索了。

来自:使用libmmseg实现Ruby的中文分词功能

分类: 搜索引擎技术 人工智能

上一篇:教你索引邮件   下一篇:Xapian - C++全文检索程序