先说一点题外话,最近发现 Linode 因为庆祝13周年活动将所有的Plan加了一倍,又来了一次加量不加价,这一下子和别的产品拉开了差距,可惜目前Linode日本节点并不参加活动,否则52nlp目前所用的这台 Linode 主机性能就可以翻倍了。不过还是搞了一台 Linode 8GB(8G内存,4核,96G SSD硬盘容量) 的VPS套餐(40$/mo),选择了美国西部的 Fremont 节点,据说国内连接速度很不错。在上面选择了64位的Ubuntu14.04 版本,但是在这个环境下安装Mecab的过程中接连踩了几个坑,所以记录一下。

==============================================================================
Update: 2017.03.21

近期又试了一下Ubuntu上基于apt-get的安装方式,非常方便,如果不想踩下面源代码编译安装的坑,推荐这种方式,参考自:https://gist.github.com/YoshihitoAso/9048005

$ sudo apt-get install mecab libmecab-dev mecab-ipadic
$ sudo apt-get install mecab-ipadic-utf8
$ sudo apt-get install python-mecab

注意其中mecab-ipadic 和 mecab-ipadic-utf8 是日文词典和模型,可以选择安装或者不安装,基于需求而定。剩下的用法和之前的一样,选定一个中文词典和模型,使用即可。

==============================================================================

这里曾写过“Mecab中文分词”系列文章,也在github上发布过一个中文分词项目 MeCab-Chinese:Chinese morphological analysis with Word Segment and POS Tagging data for MeCab ,但是这个过程中没有怎么写到Mecab安装的问题,因为之前觉得rickjin的这篇《日文分词器 Mecab 文档》应该足够参考,自己当时也在Mac OS和Ubuntu环境下安装成功并测试,印象貌似不是太复杂。这次在Ubuntu 14.04的环境安装的时候,遇到了几个小坑,记录一下,做个备忘,仅供参考。

安装的是Mecab 0.996版本,这个版本我在github上做了一个备份:mecab-0.996.tar.gz

tar -zxvf mecab-0.996.tar.gz
cd mecab-0.996/
./configure
make

make的时候遇到如下错误:

libtool: link: g++ -O3 -Wall -o .libs/mecab mecab.o /usr/local/lib/libiconv.so -Wl,-rpath -Wl,/usr/local/lib ./.libs/libmecab.so -lpthread -lstdc++
./.libs/libmecab.so: undefined reference to `libiconv'
./.libs/libmecab.so: undefined reference to `libiconv_close'
./.libs/libmecab.so: undefined reference to `libiconv_open'
collect2: error: ld returned 1 exit status
make[2]: *** [mecab] Error 1

说明没有安装libiconv ,官方目前提供的最新版本是1.14版本:http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz,Mecab-Chinese里同样做了一个备份:libiconv-1.14.tar.gz

所以需要先安装libiconv:

tar -zxvf libiconv-1.14.tar.gz
cd libiconv-1.14/
./configure
make

同样,在make的时候遇到了如下的错误:

gcc -DHAVE_CONFIG_H -DEXEEXT=\"\" -I. -I.. -I../lib -I../intl -DDEPENDS_ON_LIBICONV=1 -DDEPENDS_ON_LIBINTL=1 -g -O2 -c progname.c
In file included from progname.c:26:0:
./stdio.h:1010:1: error: ‘gets’ undeclared here (not in a function)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
^
make[2]: *** [progname.o] Error 1

google了一下,解决方案参考自这里,稍有不同,直接修改源码包下srclib/stdio.in.h的代码:

通过关键字 gets 找到698 行,将其和695行一同注释:
695 /* It is very rare that the developer ever has full control of stdin,
696 so any use of gets warrants an unconditional warning. Assume it is
697 always declared, since it is required by C89.
698 _GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");*/

然后再注释的行下面添加以下三行:
#if defined(__GLIBC__) && !defined(__UCLIBC__) && !__GLIBC_PREREQ(2, 16)
_GL_WARN_ON_USE (gets, "gets is a security hole - use fgets instead");
#endif

修改完毕之后重新执行如下命令安装libiconv:

make clean
make
sudo make install

这次没有问题了,之后重新编译安装测试mecab:

cd ..
cd mecab-0.996/
make clean
make

又一次遇到问题:

libtool: link: g++ -O3 -Wall -o .libs/mecab mecab.o /usr/local/lib/libiconv.so -Wl,-rpath -Wl,/usr/local/lib ./.libs/libmecab.so -lpthread -lstdc++
./.libs/libmecab.so: undefined reference to `libiconv'
./.libs/libmecab.so: undefined reference to `libiconv_close'
./.libs/libmecab.so: undefined reference to `libiconv_open'
collect2: error: ld returned 1 exit status

印象之前确实遇到过这个问题,再次google,在这篇日文网页里找到了答案:

setenv CFLAGS "-L/usr/local/lib"
setenv CPPFLAGS "-I/usr/local/include"
setenv LDFLAGS "-liconv"

不过在ubuntu里,需要把setenv替换为export:

export CFLAGS="-L/usr/local/lib"
export CPPFLAGS="-I/usr/local/include"
export LDFLAGS="-liconv"

再次编译:

make clean
make
make check
sudo make install

mecab终于ok了,接下来安装mecab-python版本:mecab-python-0.996.tar.gz:

tar -zxvf mecab-python-0.996.tar.gz
cd mecab-python-0.996/
sudo python setup.py build
sudo python setup.py install

安装过程无误,用ipython测试了一下:

Python 2.7.6 (default, Jun 22 2015, 17:58:13)
Type "copyright", "credits" or "license" for more information.

IPython 1.2.1 -- An enhanced Interactive Python.
? -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help -> Python's own help system.
object? -> Details about 'object', use 'object??' for extra details.

In [1]: import MeCab
---------------------------------------------------------------------------
ImportError Traceback (most recent call last)
in ()
----> 1 import MeCab

/home/textminer/mecab/mecab-python-0.996/MeCab.py in ()
24 fp.close()
25 return _mod
---> 26 _MeCab = swig_import_helper()
27 del swig_import_helper
28 else:

/home/textminer/mecab/mecab-python-0.996/MeCab.py in swig_import_helper()
16 fp, pathname, description = imp.find_module('_MeCab', [dirname(__file__)])
17 except ImportError:
---> 18 import _MeCab
19 return _MeCab
20 if fp is not None:

ImportError: libmecab.so.2: cannot open shared object file: No such file or directory

In [2]:

又google了一下这个Error:

"ImportError: libmecab.so.2: cannot open shared object file: No such file or directory"

又一次在一个日本网页里找到了答案,执行 “sudo ldconfig” 即可。这一次,终于Mecab可以在python中正常导入了。

安装成功之后的问题就比较好办了,如果你想使用日文分词,直接安装mecab相关的日文词典文件,例如ipadic;如果你想使用mecab中文分词,可以通过"Mecab-Chinese"项目直接下载中文分词相关的词典和模型文件,具体可参考“Mecab中文分词”系列。

注:原创文章,转载请注明出处及保留链接“我爱自然语言处理”:https://www.52nlp.cn

本文链接地址:Mecab安装过程中的一些坑 https://www.52nlp.cn/?p=9208

作者 52nlp

《Mecab安装过程中的一些坑》有4条评论
  1. 还有一个坑,MeCab 和 MeCab-Python的坑。
    最近有个日本的项目,也是NLP的。
    MeCab不知道为什么RHEL6.5的时候,
    import mecab-python
    RHEL7.2的时候
    import MeCab了。
    希望能和你加个微信交流一下:mywechatapp
    Manju,Kpn,这两个是日语分词用的。

    [回复]

    52nlp 回复:

    谢谢提醒;不过我目前比较忙,如果有问题,可以直接在这里留言或者邮件交流,抱歉。

    [回复]

  2. 想请教下这个Mecab也是用来作为中文分词的吧?和一些开源的项目比如说jieba等,是一个作用是吗?请问有什么优点嘛?

    [回复]

    52nlp 回复:

    看这篇文章先了解一下mecab的背景吧:https://www.52nlp.cn/%E6%97%A5%E6%96%87%E5%88%86%E8%AF%8D%E5%99%A8-mecab-%E6%96%87%E6%A1%A3

    [回复]

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注