2007-12-13

Schemeのmecabバインディング

関数型言語を勉強して来たが、実用を考えるとマルチバイト文字を扱えることが必須になる。
その時点で早くもHaskellは立場が弱くなるのだが、その点Gaucheはすばらしいということに改めて気づいた。(Schemeでは破壊的代入ができますが、そういう細かいことは自分のような初心者にはまあ、いいでしょう。)

そこで、自分の分野でガリガリ使ってGaucheの勉強をするために、Gaucheからmecabを使ってみようと思った。

この点での先人のすばらしい記事を発見。
その記事「Gauche:MeCab」に、自分としてはparseToNode相当の機能がほしかったので、Gaucheのバインディングの細かい事を勉強せずに推測で機能追加してみた。

Gauche-mecab.tar.gz

いちおう下のようなプログラムで動くようになる。

(ただし、mecabの文字コードとGaucheの内部encodingをそろえておく必要あり。)


;; coding: utf-8

(use mecab)

(define (allnodes node)
(if (mecab-node-null? node)
'()
(cons node (allnodes (mecab-node-next node))))
)

(define m (mecab-new2 ""))

(let ((node (mecab-sparse-tonode m "太郎は極悪です。")))
(map
(lambda (x)
(print (mecab-node-surface x))
(print (mecab-node-feature x)))
(allnodes node))
)

(mecab-destroy m)

実行結果

ayu@~/work/Gauche-mecab% gosh sample.scm | nkf -e

BOS/EOS,*,*,*,*,*,*,*,*
太郎
名詞,固有名詞,人名,名,*,*,太郎,タロウ,タロー

助詞,係助詞,*,*,*,*,は,ハ,ワ
極悪
名詞,形容動詞語幹,*,*,*,*,極悪,ゴクアク,ゴクアク
です
助動詞,*,*,*,特殊・デス,基本形,です,デス,デス

記号,句点,*,*,*,*,。,。,。

BOS/EOS,*,*,*,*,*,*,*,*