`
robbin
  • 浏览: 4820348 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:136995
社区版块
存档分类
最新评论

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

    博客分类:
  • Ruby
阅读更多
用Ruby on Rails开发web2.0网站的人都知道,ruby的全文检索功能不像Java支持的那样好,要提供中文的全文检索功能是一件很困难的事情,而偏偏全文检索是web2.0网站绕不过去的一道坎。虽然ruby也有类似lucene的全文检索软件ferret,但是ferret本身并没有提供中文分词功能,必须自己另行扩展中文分词功能。因此攻克ruby中文全文检索功能的瓶颈在于提供ruby的中文分词功能。

Java的lucene虽然也没有中文分词功能,但是现在有很多第三方开源的Java中文分词项目,因此Java的中文分词并不是一个难以解决的问题。但对于ruby来说,由于ruby的性能相当差,因此中文分词这种需要大量的、密集的字符串运算,ruby编写的中文分词代码性能根本无法接受,唯一的办法就是用C/C++编写分词算法,用ruby去调用。

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源代码编译安装流程:
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


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


四、创建词典文件

进入libmmseg软件包的data目录下面,执行如下命令:
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


有了这个ChineseAnalyzer,我们就可以方便的在Rails程序里面进行中文分词和全文检索了。根据我的实际测试,在ruby代码中调用libmmseg,性能相当不错,而且内存消耗比较低,完全可以放心的在生产环境使用,作为Rails网站的中文全文检索功能的支撑。

分享到:
评论
12 楼 zhangzldipan 2008-09-26  
require 'ChineseAnalyzer'

acts_as_ferret({:fields =>  {:theme=>{},:content=>{}}},   {:analyzer=>ChineseAnalyzer::ChineseAnalyzer.new})

加多点参数吧!提高速度啊!
11 楼 Stainlesssteel 2008-07-10  
universac 写道
robbin,不知道你相关文章是怎么实现的,用什么算法提取关键字的?总不可能把分词结果一股脑交给sphinx或者ferret作为关键字去全文检索吧?

搜索 分类算法
10 楼 universac 2008-06-17  
robbin,不知道你相关文章是怎么实现的,用什么算法提取关键字的?总不可能把分词结果一股脑交给sphinx或者ferret作为关键字去全文检索吧?
9 楼 robbin 2008-06-12  
dazuiba 写道
不知道大家尝试过没有:
单字切词的查询效果已经相当不错了!

针对一般的需要,起码够用了。
如果大家的精力有限,还有查询精度要求并不很高,可以考虑跳过使用第三方分词器。直接单子切词。


对,如果只是提供简单的全站搜索的话,单字拆分切词已经基本够用。 更高精确度的切分在提供相关文章,语料训练,以及好友推荐方面会发挥作用。
8 楼 dazuiba 2008-06-12  
不知道大家尝试过没有:
单字切词的查询效果已经相当不错了!

针对一般的需要,起码够用了。
如果大家的精力有限,还有查询精度要求并不很高,可以考虑跳过使用第三方分词器。直接单子切词。
7 楼 purpen 2008-06-11  
安装ruby扩展时,报以下error:
引用
cc -dynamic -bundle -undefined suppress -flat_namespace -o mmseg.bundle rubyapi.o -L"." -L"/opt/local/lib" -L. -L/opt/local/lib    -lruby -lmmseg -lstdc++  -lpthread -ldl -lobjc 
/usr/bin/ld: can't locate file for: -lmmseg
collect2: ld returned 1 exit status
make: *** [mmseg.bundle] Error 1


顺便问一下,还有别的语言的扩展吗?
6 楼 hapybird 2008-05-27  
rmmseg不是早就有了吗?
5 楼 beenhero 2008-05-27  
子曰网,就用了李兄贡献的libmmseg做全文检索,http://www.zikii.com/search?q=地震&model=all,sphinx本身速度非常快,基本在0.006的水平,分词的效果我也很满意了。
4 楼 xinbo.tang 2008-05-26  
rails 的中文支持终于拨云见日了阿~
3 楼 judytang 2008-05-25  
Robbin朋友好,来回访,谢谢你的跟帖,你写的这个帖子很认真,刚来JAVAEYE给我最深刻的感觉是这里的帖子都很认真,非常喜欢这样的氛围,我是GLASSFISH测试组的管理,我们组也测试WEB2.o和jRUBY.  GLASSFISH V3 支持jRUBY. 希望能多交流 !

2 楼 jollibee 2008-05-25  
很好很强大
1 楼 CaiDeHen 2008-05-24  
个人觉得这个具有跨时代的意义。

相关推荐

    Linux/OS X 下安装 LibMMSeg 中文分词包

    你可以通过示例代码学习如何在程序中集成分词功能。通常,会有一个简单的命令行工具,允许用户直接输入文本进行分词测试。 LibMMSeg的性能和效果很大程度上取决于所选的分词算法。最大匹配法(MaxMatch)是最常用的...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)[收集].pdf

    - 中文分词词库:Sphinx支持第三方分词器如LibMMSeg,对中文文本进行有效的分词处理,提升搜索准确度。 二、MYSQL+SPHINX+SPHINXSE安装步骤 1. 安装Python支持:Sphinx的部分工具如`indexer`和`searchd`需要...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1_张宴

    在处理中文文本时,Sphinx 需要一个分词器来将连续的汉字序列拆分成有意义的词语。libmmseg 是一个常用的中文分词库,它提供了高效的分词算法,能够准确地处理各种中文词汇,确保搜索的准确性。 ### 总结 Sphinx ...

    mmseg-0.7.3.tar.gz

    安装完成后,Sphinx将能够利用MMSeg的分词功能,对中文文本进行高效的处理。 在Sphinx中配置和使用LibMMSeg,需要在配置文件中指定分词器为mmseg,并配置相关的词典文件。一旦设置完成,Sphinx在构建索引时会调用...

    张宴Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.doc

    1. **生成Sphinx中文分词词库**:包括词典构造、格式规范和XX网的具体实现,这是中文搜索功能的基础。 2. **创建Sphinx主索引文件、增量索引文件存放目录**:组织存储索引数据,便于管理和访问。 3. **创建Sphinx...

    SPhinx在量子知道中的应用-征宇.pdf

    Coreseek是Sphinx在中国的一个分支,它添加了对中文分词的支持,采用了libmmseg分词引擎。 Sphinx的核心工作原理基于倒排索引,这是一种优化搜索效率的数据结构。在量子知道这样的应用中,Sphinx能够快速查找包含...

    (word完整版)Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.doc

    - **生成中文分词词库**:词典是分词的基础,通过特定的构造方法和格式创建,对于XX网这样的应用,可能需要定制化的中文词库来优化搜索效果。 - **创建索引文件目录**:索引文件存放目录的设置对性能有很大影响,...

    Sphinx搜索引擎架构与使用文档(和MySQL结合).pdf

    - **中文分词词库**:对于中文搜索,需要有合适的分词库,如LibMMSeg,来处理中文词汇的拆分,确保搜索准确性。 二、MYSQL+SPHINX+SPHINXSE安装步骤 1. **安装python支持** - Python通常用于编写Sphinx的管理...

    Sphinx搜索引擎架构与使用文档(和MySQL结合)V1.1.

    ⑹、中文分词词库: 5 二、MYSQL+SPHINX+SPHINXSE安装步骤: 5 1、安装python支持 5 2、编译安装LibMMSeg 5 3、编译安装MySQL 5.1.26-rc、Sphinx、SphinxSE存储引擎 5 4、创建Sphinx索引文件和MySQL数据文件存放目录...

Global site tag (gtag.js) - Google Analytics