Fri Jun 17 14:24:01 JST 2016

Ruby から mecab を叩く

あるコマンドラインツールをプログラミング言語におけるライブラリのであるように振るまわせるためのバインドみたいなのが普通あって、mecab ruby でググればそういうのがあるんだけど、 gem install mecab したら mecab.h がないよ って怒られたし、なんか面倒臭いので自前で書いた. 言っても大したことはなくて、PTY モジュールっていうのを使えば裏で仮想ターミナル開いてくれて、そのターミナルへの入出力を扱える.

require 'pty'

PTY.spawn("mecab") {|r_f,w_f,pid|
  w_f.sync = true

  def mecab(sentences, r_f, w_f)
    ret = []
    sentences = sentences.split("\n").map(&:chomp)
    sentences.each{|s|
      w_f.print "#{s}\n"
      loop {
        out = r_f.gets.chomp
        break if out == "EOS"
        ret << out if out =~ /\t/
      }
    }
    return ret
  end
    
  p mecab("今日も1日頑張るぞい", r_f, w_f)

}
[
  "今日\t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー",
  "も\t助詞,係助詞,*,*,*,*,も,モ,モ",
  "1\t名詞,数,*,*,*,*,*",
  "日\t名詞,接尾,助数詞,*,*,*,日,ニチ,ニチ",
  "頑張る\t動詞,自立,*,*,五段・ラ 行,基本形,頑張る,ガンバル,ガンバル",
  "ぞい\t名詞,接尾,一般,*,*,*,ぞい,ゾイ,ゾイ"
]

ダメ

IO 周りでバグだらけ (EOSという文字がたまにとれない、一行あたり1024バイトまでしかよめない、EOFが唐突にやってくる) なので gem install natto しましょう.