Ruby1.8.7+bundler+mecab-rubyのインストール

和布蕪(めかぶ)は美味しい。あのコリコリ感とぬめり感が最高である。一方、MeCab*1も素晴らしいソフトウェアである。日本語を扱う時はどうしても欲しくなる。和布蕪はスーパーで買うけど、MeCabはHomebrewでインストールした。

  • まずはmecabで検索してみた。
$ brew search mecab
mecab		mecab-ipadic	mecab-jumandic	mecab-ko	mecab-ko-dic	mecab-unidic
  • 必要なのはmecab(本体)とmecab-ipadic(辞書)である。
  • mecab-ipadicをインストールすると、依存関係によってmecabもインストールされた。
$ brew install mecab-ipadic
==> Installing mecab-ipadic dependency: mecab
==> Downloading https://downloads.sf.net/project/machomebrew/Bottles/mecab-0.996.mavericks.bottle.1.tar.gz
Already downloaded: /Library/Caches/Homebrew/mecab-0.996.mavericks.bottle.1.tar.gz
==> Pouring mecab-0.996.mavericks.bottle.1.tar.gz
🍺  /usr/local/Cellar/mecab/0.996: 18 files, 4.5M
==> Installing mecab-ipadic
==> Downloading https://downloads.sourceforge.net/project/mecab/mecab-ipadic/2.7.0-20070801/mecab-ipadic-2.7.0-20070801.tar.gz
Already downloaded: /Library/Caches/Homebrew/mecab-ipadic-2.7.0-20070801.tar.gz
==> ./configure --prefix=/usr/local/Cellar/mecab-ipadic/2.7.0-20070801 --with-charset=utf8
==> make install
🍺  /usr/local/Cellar/mecab-ipadic/2.7.0-20070801: 6 files, 16K, built in 6 seconds
  • さっそく試してみる。
  • mecabコマンドでmecabワールドに入って、「日本語を解析する」と入力すると、その素晴らしさを実感できる。
$ mecab
日本語を解析する
日本語	名詞,一般,*,*,*,*,日本語,ニホンゴ,ニホンゴ
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
解析	名詞,サ変接続,*,*,*,*,解析,カイセキ,カイセキ
する	動詞,自立,*,*,サ変・スル,基本形,する,スル,スル
EOS

$ mecab -O wakati
日本語を解析する
日本語 を 解析 する 
  • 区切りのない一連の日本語の文章を、最小の品詞単位に分解してくれるのだ。
    • 日本語を扱う時のはじめの一歩になる。
    • 一方、英語はスペースで区切られた単語の連続なので、この処理は不要。
  • このMeCabを使うと何が出来るかというと...
  • このようにとっても面白いことができるのだ。
  • もしMeCabのような形態素解析エンジンがないと、日本語を解析する最初の部分で躓いてしまう...。


先日、古いRailsプロジェクトを再起動する時に、どうしてもMeCabをインストールする必要があった。

  • ところが、エラーが出てしまった..。(Ruby-1.8.7環境において)
    • シェル環境で使うmecabコマンドはインストールされているのだが、
    • Rubyからmecabを利用する仕組みのgemがインストールできない...。
$ gem install mecab
Fetching: mecab-0.996.gem (100%)
Building native extensions.  This could take a while...
ERROR:  Error installing mecab:
	ERROR: Failed to build gem native extension.

        /Users/zari/.rbenv/versions/1.8.7-p375/bin/ruby extconf.rb
checking for make... yes
checking for main() in -lstdc++... yes
checking for main() in -lmecab... yes
checking for main() in -lstdc++... yes
checking for mecab.h... yes
creating Makefile

make
c++ -I. -I. -I/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/1.8/i686-darwin13.4.0 -I. -DHAVE_MECAB_H -I/opt/X11/include -I/Users/zari/.rbenv/versions/1.8.7-p375/include  -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE  -I/opt/X11/include -I/Users/zari/.rbenv/versions/1.8.7-p375/include  -fno-common  -O3 -Wno-error=shorten-64-to-32  -pipe -fno-common  -I/usr/local/Cellar/mecab/0.996/include -x c++   -c mecab_wrap.cpp
mecab_wrap.cpp:1859:10: fatal error: 'ruby/version.h' file not found
#include "ruby/version.h"
         ^
1 error generated.
make: *** [mecab_wrap.o] Error 1


Gem files will remain installed in /Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-0.996 for inspection.
Results logged to /Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-0.996/ext/mecab/gem_make.out
  • ちなみに、Ruby-2.0.0以上の環境なら、問題なくインストールできる。
# ruby-2.0.0p481
$ gem install mecab
Fetching: mecab-0.996.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mecab-0.996
Parsing documentation for mecab-0.996
unable to convert "\xCA" from ASCII-8BIT to UTF-8 for /Library/Ruby/Gems/2.0.0/extensions/universal-darwin-13/2.0.0/mecab-0.996/mecab.bundle, skipping
unable to convert "\xCA" from ASCII-8BIT to UTF-8 for lib/mecab.bundle, skipping
Installing ri documentation for mecab-0.996
1 gem installed
# ruby-2.1.3
$ gem install mecab
Fetching: mecab-0.996.gem (100%)
Building native extensions.  This could take a while...
Successfully installed mecab-0.996
Parsing documentation for mecab-0.996
Installing ri documentation for mecab-0.996
Done installing documentation for mecab after 2 seconds
1 gem installed
  • そこで、歴代のMeCabバージョンのダウンロードページから、片っ端からダウンロード。そしてmake。
  • しかし、ことごとくエラーが出てインストールできない...。
  • 検索してみると、インストールできないで悩んでいる方々が結構いらっしゃるようだ。
  • 紹介されているその解決策を片っ端から試してみても、makeのエラーは続く...。

作業環境

ダウンロードするもの

$ cd ~/Downloads
$ curl -o mecab-ruby-0.994.tar.gz https://mecab.googlecode.com/files/mecab-ruby-0.994.tar.gz
$ tar -zxvf mecab-ruby-0.994.tar.gz
x mecab-ruby-0.994/
x mecab-ruby-0.994/COPYING
x mecab-ruby-0.994/MeCab_wrap.cpp
x mecab-ruby-0.994/bindings.html
x mecab-ruby-0.994/test.rb
x mecab-ruby-0.994/LGPL
x mecab-ruby-0.994/BSD
x mecab-ruby-0.994/AUTHORS
x mecab-ruby-0.994/GPL
x mecab-ruby-0.994/README
x mecab-ruby-0.994/extconf.rb
x mecab-ruby-0.994/mecab-ruby.gemspec

修正する箇所

extconf.rb
  • $LDFLAGS += ' -L' + `#{mecab_config} --libs-only-L`.chompが要だった。
  • この修正でmakeが正常に完了するようになった。
$ diff -u <(pbpaste) extconf.rb
--- extconf.rb	2012-06-03 23:45:42.000000000 +0900
+++ ../mecab-ruby-0.994_2/extconf.rb	2014-10-30 10:18:53.000000000 +0900
@@ -3,6 +3,8 @@
 mecab_config = with_config('mecab-config', 'mecab-config')
 use_mecab_config = enable_config('mecab-config')
 
+$LDFLAGS += ' -L' + `#{mecab_config} --libs-only-L`.chomp
+
 `mecab-config --libs-only-l`.chomp.split.each { | lib |
   have_library(lib)
 }
  • 以下はついでの修正。必ずしも必要ではない。
mecab-ruby.gemspec
  • ついでに、.gemspecファイルのバージョンを0.994に合わせておいた。
$ diff -u <(pbpaste) mecab-ruby.gemspec
--- /dev/fd/63	2014-10-30 16:34:25.000000000 +0900
+++ mecab-ruby.gemspec	2014-10-30 16:34:22.000000000 +0900
@@ -1,6 +1,6 @@
 Gem::Specification.new do |s|
 	s.name = %q{mecab-ruby}
-	s.version = '0.99'
+	s.version = '0.994'
 	s.author = 'Taku Kudo'
 	s.date = '2011-12-24'
 	s.description = <<-EOF
test.rb
  • もう一つ、Ruby-1.8系で必要になるrequire 'rubygems'も追記しておいた。
$ diff -u <(pbpaste) test.rb test.rb
--- test.rb	2012-06-03 23:45:42.000000000 +0900
+++ ../mecab-ruby-0.994_2/test.rb	2014-10-30 10:44:45.000000000 +0900
@@ -1,6 +1,7 @@
 #!/usr/bin/ruby
 # -*- coding: utf-8 -*-
 
+require 'rubygems'
 require 'MeCab'
 sentence = "太郎はこの本を二郎を見た女性に渡した。"

ビルド

  • 修正が完了したら、gem buildする。
$ gem build mecab-ruby.gemspec
  Successfully built RubyGem
  Name: mecab-ruby
  Version: 0.994
  File: mecab-ruby-0.994.gem
  • ビルドが成功した!

インストール

  • ここまで出来れば、あとはgem installすればいい。
$ gem install mecab-ruby
Building native extensions.  This could take a while...
Successfully installed mecab-ruby-0.994
1 gem installed
Installing ri documentation for mecab-ruby-0.994...
Installing RDoc documentation for mecab-ruby-0.994...
  • テストも問題なく完了する。
$ ruby test.rb
0.994
太郎	名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
この	連体詞,*,*,*,*,*,この,コノ,コノ
本	名詞,一般,*,*,*,*,本,ホン,ホン
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
二	名詞,数,*,*,*,*,二,ニ,ニ
郎	名詞,一般,*,*,*,*,郎,ロウ,ロー
を	助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
見	動詞,自立,*,*,一段,連用形,見る,ミ,ミ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
女性	名詞,一般,*,*,*,*,女性,ジョセイ,ジョセイ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
渡し	動詞,自立,*,*,五段・サ行,連用形,渡す,ワタシ,ワタシ
た	助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。	記号,句点,*,*,*,*,。,。,。
EOS
...中略...

bundlerでインストールするには?

  • ところで、MeCabはどこにあるのか確認してみると、globalなRuby環境にインストールされていた。
$ gem which MeCab
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-ruby-0.994/lib/MeCab.bundle
  • プロジェクトごとに古いRailsのバージョンがいくつかあるので、できればプロジェクトごとにbundlerで管理しておきたい。
  • その場合、Gemfileではどのように指定するべきだろうか?やってみた。
  • 既存のRails1.1.6プロジェクトに移動して...
$ cd ~/Desktop/rails116/todo
  • Gemfileにgem "mecab-ruby", :pathオプションを追記してみた。(末尾の行)
    • ちなみに、gem名=mecab-ruby、require名=MeCabと一致していないので、:requireオプションも追加しておいた。
    • mecab-rubyの場合、lib/MeCab.bundleとなっているために、require 'MeCab'と指定する必要があるのだ。
    • :requireオプションを追加しておくことで、gem名と一致しないrequire名でも、Railsのautoloadが機能するようになる。
# A sample Gemfile
ruby '1.8.7'
source "https://rubygems.org"
gem "rails", "1.1.6"
gem "sqlite3", "1.3.9"
gem "classifier"
gem "stemmer"
gem "gettext", "1.90.0"
gem "rake", "0.7.1"
gem "mecab-ruby", :path => ''~/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-ruby-0.994/'', :require => 'MeCab'
  • bundle installしてみると、正常にインストールできた模様。
$ bundle install --path='vendor/bundle'
Resolving dependencies...
Using rake 0.7.1
Using activesupport 1.3.1
Using actionpack 1.12.5
Using actionmailer 1.2.5
Using activerecord 1.14.4
Using actionwebservice 1.1.6
Using fast-stemmer 1.0.2
Using classifier 1.3.4
Using gettext 1.90.0
Using mecab-ruby 0.994 from source at ~/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-ruby-0.994/
Using rails 1.1.6
Using sqlite3 1.3.9
Using stemmer 1.0.1
Using bundler 1.7.4
Your bundle is complete!
It was installed into ./vendor/bundle
  • bundle consoleでirbを起動してみると、MeCabがちゃんと使えた!
$ bundle console
irb(main):001:0> wakati = MeCab::Tagger.new('-O wakati')
=> #
irb(main):002:0> puts wakati.parse('日本語を解析する')
日本語 を 解析 する 
=> nil
  • しかし、mecab-rubyがどこにあるか調べてみると、vendor/bundleにはコピーされていない。
$ bundle show mecab-ruby
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8/gems/mecab-ruby-0.994
  • どうやら:pathオプションは、指定されたパスのgemをコピーする訳ではなく、そのパス位置のままbundle管理に組み込むだけ、のようだ。

mecab-rubyをvendor/bundleにインストールして管理するには?

  • そこで今度は、ローカル(自分のマシンにインストールされた)のgemのサーバーを起動して、インストールする方法を試してみた。
$ cd ~/Desktop/rails116/todo
$ gem server
# A sample Gemfile
ruby '1.8.7'
source "https://rubygems.org"
source "http://localhost:8808"
gem "rails", "1.1.6"
gem "sqlite3", "1.3.9"
gem "classifier"
gem "stemmer"
gem "gettext", "1.90.0"
gem "rake", "0.7.1"
gem "mecab-ruby", :require => 'MeCab'
  • 一旦Gemfile.lockとvendor/bundleを削除してからbundle installしてみると、vendor/bundleに正常にインストールできた!
$ rm -fr Gemfile.lock vendor/bundle
$ bundle install
Fetching source index from http://localhost:8808/
Fetching gem metadata from https://rubygems.org/...........
Fetching additional metadata from https://rubygems.org/.........
Resolving dependencies...
Installing rake 0.7.1
Installing activesupport 1.3.1
Installing actionpack 1.12.5
Installing actionmailer 1.2.5
Installing activerecord 1.14.4
Installing actionwebservice 1.1.6
Installing fast-stemmer 1.0.2
Installing classifier 1.3.4
Installing gettext 1.90.0
Installing mecab-ruby 0.994
Installing rails 1.1.6
Installing sqlite3 1.3.9
Installing stemmer 1.0.1
Using bundler 1.7.4
Your bundle is complete!
It was installed into ./vendor/bundle
  • しかし、以下のような激しい警告をされてしまった...。
Warning: the gem 'rake' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'rake', :source => 'http://localhost:8808/'
Warning: the gem 'activesupport' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'activesupport', :source => 'http://localhost:8808/'
Warning: the gem 'actionpack' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'actionpack', :source => 'http://localhost:8808/'
Warning: the gem 'actionmailer' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'actionmailer', :source => 'http://localhost:8808/'
Warning: the gem 'activerecord' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'activerecord', :source => 'http://localhost:8808/'
Warning: the gem 'actionwebservice' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'actionwebservice', :source => 'http://localhost:8808/'
Warning: the gem 'rails' was found in multiple sources.
Installed from: http://localhost:8808/
Also found in:
  * https://rubygems.org/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'rails', :source => 'http://localhost:8808/'
Warning: the gem 'sqlite3' was found in multiple sources.
Installed from: https://rubygems.org/
Also found in:
  * http://localhost:8808/
You should add a source requirement to restrict this gem to your preferred source.
For example:
    gem 'sqlite3', :source => 'https://rubygems.org/'
  • なるほど、二つのソース("http://localhost:8808/"と"https://rubygems.org")から、同じgemバージョンを見つけてしまう状態らしい。
  • bundlerは、"http://localhost:8808/"からインストールしたと教えてくれているようだ。
  • 但し、警告はされているけど、必要なgemは正常にインストールされている。問題はない。
  • 実は最初にbundle install :path=オプションを忘れて、globalなgem環境にbundle installしてしまっていたのだった。
  • だから、ローカルのgemサーバーも、以下のgemをすべて提供しているのだ。
$ gem env home
/Users/zari/.rbenv/versions/1.8.7-p375/lib/ruby/gems/1.8
$ gem list

*** LOCAL GEMS ***

actionmailer (1.2.5)
actionpack (1.12.5)
actionwebservice (1.1.6)
activerecord (1.14.4)
activesupport (1.3.1)
bundler (1.7.4)
mecab-ruby (0.994)
rails (1.1.6)
rake (0.7.1)
sqlite3 (1.3.10)

検証

  • そこで、globalなgem環境をbundlermecab-rubyだけにしておいた。
$ gem list --no-version|grep ^[a-z]|grep -v bundler|grep -v mecab-ruby|xargs gem uninstall -aIx
$ gem list

*** LOCAL GEMS ***

bundler (1.7.4)
mecab-ruby (0.994)
  • この状態で再インストールしてみると、余計な警告はされずに完了した!
$ rm -fr Gemfile.lock vendor/bundle
$ bundle install
Fetching source index from http://localhost:8808/
Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Installing rake 0.7.1
Installing activesupport 1.3.1
Installing actionpack 1.12.5
Installing actionmailer 1.2.5
Installing activerecord 1.14.4
Installing actionwebservice 1.1.6
Installing fast-stemmer 1.0.2
Installing classifier 1.3.4
Installing gettext 1.90.0
Installing mecab-ruby 0.994
Installing rails 1.1.6
Installing sqlite3 1.3.9
Installing stemmer 1.0.1
Using bundler 1.7.4
Your bundle is complete!
It was installed into ./vendor/bundle

*1:MeCabとは、品詞区切りのない日本語を、品詞単位に分解して、その品詞を解析するソフトウェア。形態素解析エンジンと呼ばれる。