RubyからMecabを使う

形態素解析プログラムhttp://mecab.sourceforge.net/とそのRubyインターフェイスを入れた時のメモ。

インストールはMac Portsで一発……かとおもいきや、エラー。詳細を見てみると

sh: /opt/local/bin/ruby1.9: No such file or directory

とか言うてる。おそらくruby19をインストールするときnosuffixのvariantを入れたせいだと思われるので、取り敢えず

$ cd /opt/local/bin
$ sudo ln -s ruby ruby1.9

としておく。んで、改めてport install

$ sudo port install rb19-mecab

今度は無事入った。

テスト。標準入力から「私の名前は中田です」と入れてみる。

$ mecab
私の名前は中田です
私      名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
の      助詞,連体化,*,*,*,*,の,ノ,ノ
名前    名詞,一般,*,*,*,*,名前,ナマエ,ナマエ
は      助詞,係助詞,*,*,*,*,は,ハ,ワ
中田    名詞,固有名詞,人名,姓,*,*,中田,ナカタ,ナカタ
です    助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS

上手く行ってるっぽい。起動時に-O wakati というオプションを付けると、分かち書きをしてくれる。

$ mecab -O wakati
私の名前は中田です
私 の 名前 は 中田 です

素晴らしい。

Rubyから使うテスト。公式サイトのスクリプト言語のバインディングの例を改変して、irbで実行。

$ irb
irb(main):001:0> require 'MeCab'
=> true
irb(main):002:0> m = MeCab::Tagger.new ("-O wakati")
=> #<MeCab::Tagger:0x007f9c850a7728>
irb(main):003:0> print m.parse ("今日もしないとね")
今日 も し ない と ね 
=> nil

パーペキである。

MikuInstallerを最新のWineで使う

東方がやりたくてMac OSX LionでWineを使おうと思っていたのだが、設定が面倒くさそうだったのでしばらく放置していた。
今日になってはい、どーも!! Macでも東方 を読んで、MikuInstallerを使えば導入が簡単になる気がしたので、こいつを使ってみた。
MikuInstallerにバンドルされてるWineはバージョンが古いので、上記のサイトではMac用にコンパイルされたWineのバイナリを持ってきてバージョンを上げているが、Mac Portsを使えば常に最新のWineが使えるので少しアレンジしてインストールしてみた。

まずはMac Portsで最新版のWineをインストール。

$ sudo port install wine-devel

MikuInstaller からdmgファイルをダウンロードして開き、指示通りMikuInstallerをApplicationにコピー。

MikuInstallerが呼ぶWineは/Applications/MikuInstaller.app/Contents/Resources/Wine.bundle/Contents/Resources にあるので、これを先ほどMac Portsで入れたWineに入れ替えていく。
bin, include, lib, shareを全て/opt/local/以下のものへ変えていいのかもしれないが、binの下にはMac Portsでは入らないプログラムもあるようなので、Mac Portsで入るもののみ以下のコマンドでファイルを個別にシンボリックリンクに置き換えていく。

$ cd /Applications/MikuInstaller.app/Contents/Resources/Wine.bundle/Contents/Resources
$ for i in bin/*; [ -r /opt/local/$i ] && sudo rm -r $i && sudo ln -s /opt/local/$i $i
$ for i in include/*; [ -r /opt/local/$i ] && sudo rm -r $i && sudo ln -s /opt/local/$i $i
$ for i in lib/*; [ -r /opt/local/$i ] && sudo rm -r $i && sudo ln -s /opt/local/$i $i
$ for i in share/*; [ -r /opt/local/$i ] && sudo rm -r $i && sudo ln -s /opt/local/$i $i

ホントはディレクトリの中身を再帰的にチェックすべきだけど、面倒なのでパス。

ここでMikuInstallerを起動してみると、必要なディレクトリが無いと文句を云うので、

$ mkdir -p ~/Library/Application\ Support/MikuInstaller/prefix/default

とやって自分で作ってやれば良い。

最新のWineを入れたせいか、別のソフトを入れなくてもデフォルトでジョイパッドを認識してくれて、快適無敵。

Mac OS X Lion の emacs-appでmigemoを使えるようにする

最近買ったMac miniで、cmigemoをインストールした時のメモ。


C/Migemo — KaoriYaでcmigemoの最新版をチェック。

% wget http://cmigemo.googlecode.com/files/cmigemo-default-src-20110227.zip
% unzip cmigemo-default-src-20110227.zip 
% cd cmigemo-default-src 

doc/README_j.txtを見ながら作業する。

% chmod +x configure
% ./configure
% make osx

ここで

src/wordbuf.c:118: error: ‘INT_MAX’ undeclared (first use in this function)
src/wordbuf.c:118: error: (Each undeclared identifier is reported only once
src/wordbuf.c:118: error: for each function it appears in.)
make[1]: *** [build/object/wordbuf.o] Error 1
make: *** [osx-rel] Error 2

とエラーを吐かれるので、src/wordbuf.cがlimits.hをインクルードするように書き換える。

/* vim:set ts=8 sts=4 sw=4 tw=0: */
/*
 * wordbuf.h -
 *
 * Written By:  MURAOKA Taro <koron@tka.att.ne.jp>
 * Last Change: 20-Sep-2009.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h> /* この行を追加 */
#include "wordbuf.h"

再びターミナルで

% make osx
% make osx-dict

UTF-8の辞書も作る

% cd dict
% make utf-8
% cd ..

root権限でインストール

% sudo make osx-install 

これで、cmigemoのビルド+インストールは完了。続いて、Emacsインクリメンタルサーチができるように設定。
migemo.elを https://gist.github.com/457761 からダウンロード。

% cd ~/.emacs.d/
% mkdir migemo
% cd migemo
% curl -L -o migemo.el https://raw.github.com/gist/457761/539882a79ec11bc9b6e1ac417cdafe0e198e245f/migemo.el

~/.emacs.d/init.elに設定を書く。

(setq load-path (cons "~/.emacs.d/migemo/" load-path))
(require 'migemo)
(setq migemo-command "/usr/local/bin/cmigemo")
(setq migemo-options '("-q" "--emacs"))
(setq migemo-dictionary "/usr/local/share/migemo/utf-8/migemo-dict")
(setq migemo-user-dictionary nil)
(setq migemo-coding-system 'utf-8-unix)
(setq migemo-regex-dictionary nil)
(load-library "migemo")
(migemo-init)

これで、日本語インクリメンタルサーチができるようになった。

画面を3等分する。

1920x1200の26インチのディスプレイに、emacsを全画面表示して使っていると、各ウィンドウの大きさは3等分くらいでちょうど良い。
Emacsテクニックバイブル*1Emacs辞典*2、それからMeadow/Emacs memoを参考にして、

  • ウィンドウをn等分する関数
  • フレームが複数のウィンドウを持ってる時にはカーソルを隣のウィンドウに移し、そうでなければウィンドウを3等分する関数

を書いて、.emacs.d/init.el に追加した。

;;; 画面分割
(defun split-n (n)
  "現在のウィンドウをn等分する関数"
  (interactive "p") ; コマンドとして呼ぶときは前置引数を取る
  (if (= n 2)
      (progn
	(split-window-horizontally)
	(other-window 2))
    (progn
      (split-window-horizontally (/ (window-width) n))
      (other-window 1)
      (split-n (- n 1)))))
(defun other-window-or-split ()
  "windowがひとつのときは画面を3分割し、そうでなければとなりのwindowにカーソルを移す"
  (interactive)
  (if (one-window-p)
      (split-n 3))
  (other-window 1))
(global-set-key (kbd "C-t") 'other-window-or-split) ;; C-t に割り当て
;;; 分割した画面間をShift+矢印で移動
(setq windmove-wrap-around t)
(windmove-default-keybindings)

今回覚えたこと

  • いくつかの関数をまとめて実行したいときは、prognでつなぐ
  • 関数をコマンドとしても使いたい場合はinteractiveに変数の型を指定するコード文字を付けて呼ぶ

*1:

*2: