natto gemで形態素解析をする!(Windows7 64bit編)

あけましてから結構な日数が経ちましたが、去年どころか一昨年のご挨拶さえしたかどうか定かではない今日このごろ。皆さんお久しぶりです。いいえむしろ初めまして sandmark です。もともと定期購読してお得なブログを目指したわけでもなく、その場しのぎのナマモノ情報をお届けしているわけでして、本年もこんな自堕落な調子で過ごしていきたいと思います。

恋するプログラム

さて、先日こんな本を見つけました。
恋するプログラム―Rubyでつくる人工無脳

2005年出版かつWindowsベースの解説なので、ruby-1.8系のstableが出るか出ないかの時代ですね。RubyGemsさえないという。そんな中でよくGUIインターフェイスの実装まで解説したなぁと思って感心しているのですが、ライブラリや処理系の時代背景はともかく非常によくできた構成で、「これを機にRubyWindowsアプリケーション開発しよう」と読者に奮起させる意図もあったのかな、と思います。当時はRubyもまだマイナーで、GUIアプリケーションといえばVisual C++デファクトスタンダードだったわけですし(今でも実質そうなんだけど)。それでも最近はQtやGTKをラッパーライブラリ経由で使ったり、.NETがいろいろ進化してたり、当時に比べればかなり敷居は低くなったんじゃないかなと思います。では本書のGUI解説がまったくの役立たずかというとそうでもなくて、コアライブラリと完全に分離されているため、GUI無しでもそのまま読み進められます。むしろ「ライブラリをどのように分離するか」の説明に重きを置いているので、プログラミング or Ruby初心者向けでもあります。テーマもなかなか魅力的……っていうかそれが目的で買ったんですが、人工無能の開発イディオムを1から解説してくれる書籍もあまり見つけられないので、個人的には☆5つ付けたいくらいの良書です。

libmecab.dllの64bit版がなかった

読み進めてきたところで、これ系のプログラムには必須とも言える形態素解析が必要になりました。本書では茶筅(ChaSen)FFI経由で利用する手法が採用されていましたが、私の開発環境はUbuntuなので、できればgemでなんとかしたい。というかプラットフォーム依存のコードにしたくなかったので「ruby 形態素解析」でぐぐった結果、どうもMeCab: Yet Another Part-of-Speech and Morphological Analyzerを使うのが王道な感じで、natto gemから叩くのが良さそう。

だったのですが、MeCabWindowsバイナリは32bit版しか提供されておらず、他の言語用のバイナリをnattoから読もうとするとエラーが頻出したので、もう諦めて自前でビルドしました。他の方に倣って置いておきます。

64bit版libmecab.dll (See also: 64 Bit Windows · buruzaemon/natto Wiki · GitHub)
libmecab_X64.zip - Google ドライブ

%MeCabをインストールしたディレクトリ%/bin/にあるファイルをバックアップしておいて、上記バイナリを放り込んでください。これでrequire 'natto'の戻り値がtrueなら大丈夫です。それでもダメなら環境変数MECAB_PATH=C:\Path\To\libmecab.dllを設定してみましょう。

文字コードのお化け

Windowsコマンドプロンプトで実行すると、 natto は自動的にShift_JISMeCabに渡すっぽいです。MeCab辞書をUTF-8でインストールしている場合、

require 'natto'

Encoding.default_external = 'UTF-8'

nm = Natto::MeCab.new
puts nm.parse(readline.chomp)

とかやるととっても文字化けるので、よくわからんちんな私のような人はMeCab辞書をあらかじめShift_JISでインストールしておくといいと思います。

require 'natto'

nm = Natto::MeCab.new
charset = nm.dicts.first.charset
encoding = (charset == 'SHIFT-JIS') ? 'Shift_JIS' : charset

puts nm.parse(readline.chomp.encode(encoding)).encode('UTF-8')

こんな感じでうまいことやってくれます。もっと良い方法があったら教えて下さい。

それではー。