MMSEG 是一个开源的中文分词项目。在我们的应用开发中,我们使用了 mmseg 完成中文分词的任务。本程序是用 C++ 编写的,但是不提供 UNIX 下的 Makefile。
在 Coreseek 项目中包含了一个 mmseg,并提供了 Python 试验程序以及 mmseg 的 GNU Autotools 脚本,可以方便的进行 configure – make – make install 形式的安装。但是,其 Python 绑定并没有提供相应的脚本。为了解决这个问题,我写了一些 Python 脚本辅助进行这项编译过程。
首先,从 Coreseek 项目中下载回 Coreseek,并解包,进行 mmseg 的编译。注意应当先执行./bootstrap
其次,进入 src/css 目录,编译 libcss。这里,我使用的编译脚本如下:


g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 mmthunk.cpp -ommthunk.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 segmenter.cpp -osegmenter.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 SegmenterManager.cpp -oSegmenterManager.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 SegmentPkg.cpp -oSegmentPkg.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 SynonymsDict.cpp -oSynonymsDict.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 ThesaurusDict.cpp -oThesaurusDict.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 UnigramCorpusReader.cpp -oUnigramCorpusReader.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 UnigramDict.cpp -oUnigramDict.o
g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall -c -fPIC -O4 UnigramRecord.cpp -oUnigramRecord.o

这时,我们可以得到一些目标文件。但是,仅仅有目标文件是不够的,我们需要编译得到 libcss。通常情况下,运行

g++ -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall *.o -olibcss.so

即可得到 libcss,但是实际上 libmmseg 并不会被链接进去。为了修正这个问题,我进行了如下的修改:

(a) 进入src目录,修改Makefile.am,libmmseg_la_LDFLAGS = -static修改成libmmseg_la_LDFLAGS = -shared

(b) 进入根目录,进行./bootstrap,make clean后重新make一份libmmseg.so,不要make install。

(c) 将libmmseg.so(有版本号)放入合适的位置,例如/usr/local/lib或者/lib。

(d) 进入src/css目录。执行

g++ -v -I. -I../ -I../utils/ -L/usr/local/lib -L/lib -lmmseg -g -Wall *.o -olibcss.so
你会看到

使用內建 specs。
目的:i686-amazon-linux
配置為:../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --disable-gjdoc --enable-languages=c,c++,objc,obj-c++,java,fortran,ada --disable-dssi --without-x --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-1.5.0.0/jre --enable-libgcj-multifile --enable-java-maintainer-mode --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --disable-libjava-multilib --with-ppl --with-cloog --with-tune=generic --with-arch=i686 --build=i686-amazon-linux
執行緒模型:posix
gcc version 4.4.5 20110214 (Red Hat 4.4.5-6) (GCC)
COMPILER_PATH=/usr/libexec/gcc/i686-amazon-linux/4.4.5/:/usr/libexec/gcc/i686-amazon-linux/4.4.5/:/usr/libexec/gcc/i686-amazon-linux/:/usr/lib/gcc/i686-amazon-linux/4.4.5/:/usr/lib/gcc/i686-amazon-linux/:/usr/libexec/gcc/i686-amazon-linux/4.4.5/:/usr/libexec/gcc/i686-amazon-linux/:/usr/lib/gcc/i686-amazon-linux/4.4.5/:/usr/lib/gcc/i686-amazon-linux/
LIBRARY_PATH=/usr/lib/gcc/i686-amazon-linux/4.4.5/:/usr/lib/gcc/i686-amazon-linux/4.4.5/:/usr/lib/gcc/i686-amazon-linux/4.4.5/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-I.' '-I../' '-I../utils/' '-L/usr/local/lib' '-L/lib' '-g' '-Wall' '-shared' '-o' 'libcss.so' '-shared-libgcc' '-mtune=generic' '-march=i686'
/usr/libexec/gcc/i686-amazon-linux/4.4.5/collect2 --eh-frame-hdr --build-id -m elf_i386 --hash-style=gnu -shared -o libcss.so /usr/lib/gcc/i686-amazon-linux/4.4.5/../../../crti.o /usr/lib/gcc/i686-amazon-linux/4.4.5/crtbeginS.o -L/usr/local/lib -L/lib -L/usr/lib/gcc/i686-amazon-linux/4.4.5 -L/usr/lib/gcc/i686-amazon-linux/4.4.5 -L/usr/lib/gcc/i686-amazon-linux/4.4.5/../../.. -lmmseg mmthunk.o SegmenterManager.o segmenter.o SegmentPkg.o SynonymsDict.o ThesaurusDict.o UnigramCorpusReader.o UnigramDict.o UnigramRecord.o -lstdc++ -lm -lgcc_s -lc -lgcc_s /usr/lib/gcc/i686-amazon-linux/4.4.5/crtendS.o /usr/lib/gcc/i686-amazon-linux/4.4.5/../../../crtn.o

类似的结果。这是在 Amazon EC2 上运行的结果。(原谅我,这里确实比较复杂)复制下来最后一行的内容,在命令的最后附加 -lmmseg /lib/libmmseg.so.0.0.0。请注意修改 /lib/libmmseg.so.0.0.0 为你自己的库名。下面的命令直接复制一定不能用的
/usr/libexec/gcc/i686-amazon-linux/4.4.5/collect2 --eh-frame-hdr --build-id -m elf_i386 --hash-style=gnu -shared -o libcss.so /usr/lib/gcc/i686-amazon-linux/4.4.5/../../../crti.o /usr/lib/gcc/i686-amazon-linux/4.4.5/crtbeginS.o -L/usr/local/lib -L/lib -L/usr/lib/gcc/i686-amazon-linux/4.4.5 -L/usr/lib/gcc/i686-amazon-linux/4.4.5 -L/usr/lib/gcc/i686-amazon-linux/4.4.5/../../.. -lmmseg mmthunk.o SegmenterManager.o segmenter.o SegmentPkg.o SynonymsDict.o ThesaurusDict.o UnigramCorpusReader.o UnigramDict.o UnigramRecord.o -lstdc++ -lm -lgcc_s -lc -lgcc_s /usr/lib/gcc/i686-amazon-linux/4.4.5/crtendS.o /usr/lib/gcc/i686-amazon-linux/4.4.5/../../../crtn.o -lmmseg /lib/libmmseg.so.0.0.0

这样才会避免不链接libmmseg导致的symbol not found问题。

(e) 得到了 libcss.so 之后,将其放入你的LIBDIR中,例如 /lib 或者 /usr/local/lib。

接下来,我们应该编译 cmmseg, mmseg 的 Python 绑定了。用 distutil 太烦,我自己写了几句命令编译成功。请按照下面的命令输入:


g++ -I/usr/include/python2.6 -I../src -I../src/utils -I../src/css -lpython2.6 -lmmseg -g -Wall -c -fPIC -O4 -ommseg_interface.o
g++ -I/usr/include/python2.6 -I../src -I../src/utils -I../src/css -lpython2.6 -lmmseg pymmseg.c -g -Wall -c -fPIC -O4 -o pymmseg.o
g++ -I../src -I../src/utils -I../src/css -lpython2.6 -g -Wall -shared -O4 -o cmmseg.so pymmseg.o mmseg_interface.o

你就有了 cmmseg.so 这个 Python 库。安装很简单,请将其拷贝到你的 Python site-package 目录,例如

sudo cp cmmseg.so /usr/lib/python2.6/site-packages/cmmseg.so

提示:

  • 请注意维持 libdir 的整洁
  • 请 strip 库

这个模块使用起来比较简单。这段程序足够演示:

# -*- coding: utf-8 -*-

import cmmseg
cmmseg.init('/usr/local/etc') # 放置 uni.lib, unigram.txt 的位置
rs = cmmseg.segment((u'一个幽灵,共产主义的幽灵,在欧洲游荡。为了对这个幽灵进行神圣的围剿,旧欧洲的一切势力,教皇和沙皇、梅特涅和基佐、法国的激进派和德国的警察,都联合起来了。').encode('utf-8'))
for i in rs:
    print i.decode('utf-8') + '-',

结果:


一个- 幽灵- ,- 共产主义- 的- 幽灵- ,- 在- 欧洲- 游荡- 。- 为了- 对- 这个- 幽灵- 进行- 神圣- 的- 围剿- ,- 旧- 欧洲- 的- 一切- 势力- ,- 教皇- 和- 沙皇- 、- 梅- 特- 涅- 和- 基- 佐- 、- 法国- 的- 激进- 派- 和- 德国- 的- 警察- ,- 都- 联合- 起来- 了- 。-

2 thoughts on “浅谈 MMSEG 中文分词的编译以及使用

  1. 好文,当初用ICTCLAS中文分词,在Linux下折腾得一塌糊涂不堪回首啊。。

  2. 您好!!
    我使火狐论坛的一名菜鸟,我看到您在一篇帖子上的留言,我找了半天才找到这里,我很兴奋,我是一名linux技术工程师,因为我遇到一个问题,您在这个地址曾经解答过http://mozilla.com.cn/qa/dev/Q.5724/   , 就是如何实现firefox启动时自动全屏的效果(是F11的效果),我对火狐这不太了解,但是工作中确实遇到这洋的问题,能不能帮我详细解答一下,应该修改什么配置文件,我是在linux操作系统上,不胜感激,非常感谢您!!谢谢您!!!!!!!!我的email是646290873@qq.com如果可以麻烦发邮件给我!!!谢谢谢谢!!!!!!!!跪求!!!!!!!!!!!

Leave a reply

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> 

required

This site uses Akismet to reduce spam. Learn how your comment data is processed.