作者: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源代码编译安装流程:
顺利的话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文件拷贝到当前目录,确保编译的通过,详细操作如下:
顺利的话,编译好的mmseg.so就会被拷贝到ruby的系统库扩展目录下面。你可以简单的测试一下,进入irb,尝试load一下mmseg,看能否成功:
四、创建词典文件
进入libmmseg软件包的data目录下面,执行如下命令:
把生成的文件改名为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目录),记得在程序里面正确的加载词典文件:
有了这个ChineseAnalyzer,我们就可以方便的在Rails程序里面进行中文分词和全文检索了。
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源代码编译安装流程:
- unzip mmseg-0.7.3.zip
- cd mmseg-0.7.3
- chmod a+x configure
- ./configure
- make && make install
unzip mmseg-0.7.3.zip cd mmseg-0.7.3 chmod a+x configure ./configure 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文件拷贝到当前目录,确保编译的通过,详细操作如下:
- cd ruby
- cp /usr/local/include/mmseg/*.h .
- cp ../src/*.h .
- cp ../src/css/*.h .
- ruby extconf.lin.rb
- make && make install
cd ruby cp /usr/local/include/mmseg/*.h . cp ../src/*.h . cp ../src/css/*.h . ruby extconf.lin.rb make && make install
顺利的话,编译好的mmseg.so就会被拷贝到ruby的系统库扩展目录下面。你可以简单的测试一下,进入irb,尝试load一下mmseg,看能否成功:
- irb
- require 'mmseg'
irb require 'mmseg'
四、创建词典文件
进入libmmseg软件包的data目录下面,执行如下命令:
- mmseg -u unigram.txt
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目录),记得在程序里面正确的加载词典文件:
- require 'ferret'
- require 'mmseg'
- class ChineseAnalyzer < Ferret::Analysis::Analyzer
- def initialize
- @mmseg = Mmseg.createSeg("#{RAILS_ROOT}/dict", "")
- end
- def token_stream(field, text)
- Ferret::Analysis::LowerCaseFilter.new(Tokenizer.new(@mmseg, text))
- end
- end
- class Tokenizer < Ferret::Analysis::TokenStream
- def initialize(mmseg, text)
- @mmseg = mmseg
- self.text = text
- end
- def next
- if @mmseg.next
- @token.text = @text[@mmseg.start...@mmseg.end]
- @token.start = @mmseg.start
- @token.end = @mmseg.end
- @token
- end
- end
- def text
- @text
- end
- def text=(text)
- @text = text
- @mmseg.setText(text)
- @token = Ferret::Analysis::Token.new("", 0, 0)
- end
- end
require 'ferret'
require 'mmseg'
class ChineseAnalyzer < Ferret::Analysis::Analyzer
def initialize
@mmseg = Mmseg.createSeg("#{RAILS_ROOT}/dict", "")
end
def token_stream(field, text)
Ferret::Analysis::LowerCaseFilter.new(Tokenizer.new(@mmseg, text))
end
end
class Tokenizer < Ferret::Analysis::TokenStream
def initialize(mmseg, text)
@mmseg = mmseg
self.text = text
end
def next
if @mmseg.next
@token.text = @text[@mmseg.start...@mmseg.end]
@token.start = @mmseg.start
@token.end = @mmseg.end
@token
end
end
def text
@text
end
def text=(text)
@text = text
@mmseg.setText(text)
@token = Ferret::Analysis::Token.new("", 0, 0)
end
end
有了这个ChineseAnalyzer,我们就可以方便的在Rails程序里面进行中文分词和全文检索了。

