by shigemk2

当面は技術的なことしか書かない

rubyで形態素解析をやってみたくなったからokuraを使うことにしたんだよ

perlにはText::MeCabとかいうCPANモジュールがあるのに、
rubyのgemにはそんな感じのやつってないのかなって思っていたら
ありましたよ。

ソース(on Github)

todesking/okura · GitHub

取得方法

まあREADMEを読めばいいんだけど、

1. gemの取得

gem install okura

2. 辞書データの取得
ダウンロード - NAIST Japanese Dictionary - SourceForge.JP
(アーカイブなのでtar xzvfで解凍してください)

3. コンパイルした辞書データ置き場のためのディレクトリ作成

mkdir okura-dic

4. 辞書データのコンパイル

$ okura compile mecab-naist-jdic-0.6.3b-20111013/ okura-dic

まあこれだけで形態素解析 on Rubyが出来るようになる。

実演

コンソールから使えますが…

$ okura console okura-dic
okura> 革命はいつもインテリが始めるが、. 夢みたいな目標をもってやるから、いつも過激なことしかやらない!
BOS/EOS	BOS/EOS 0

革	名詞,一般,*,*,*,*,* 5227
革	名詞,一般,*,*,*,*,* 5345
革命	名詞,一般,*,*,*,*,* 4913

命	名詞,一般,*,*,*,*,* 4750
命	動詞,自立,*,*,一段,連用形,* 6005
命	動詞,自立,*,*,一段,未然形,* 6005

は	助詞,係助詞,*,*,*,*,は 2299
は	動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7290
は	動詞,非自立,*,*,五段・ラ行,体言接続特殊2,* 7147
は	名詞,一般,*,*,*,*,* 7507
は	動詞,自立,*,*,五段・ラ行,体言接続特殊2,* 7290
(以下略)

子供に付き合っていられるか!

というわけでプログラムから使う方法を。
(ブログコードを一部改変してます)

# -*- coding: utf-8 -*-
require 'okura/serializer'
dict_dir='./okura-dic'
require 'pp'
tagger=Okura::Serializer::FormatInfo.create_tagger dict_dir

str='そうやって達成された革命の気高い志も、その後は官僚主義と大衆に飲み込まれてしまう。'

# 文字列から単語候補を計算
nodes=tagger.parse(str)

# 単語候補の中で、一番最もらしい組み合わせを選択
nodes.mincost_path.each{|node|
  word=node.word
  pp word.surface # 単語の表記
  pp word.left.text # 品詞
  # 品詞はword.leftとword.rightがありますが、一般的に使われる辞書(IPA辞書やNAIST辞書)では
  # 両方同じデータが入ってます
}

結果

"BOS/EOS"
"BOS/EOS"
"そう"
"副詞,助詞類接続,*,*,*,*,*"
"やっ"
"動詞,自立,*,*,五段・ラ行,連用タ接続,*"
"て"
"助詞,接続助詞,*,*,*,*,て"
"達成"
"名詞,サ変接続,*,*,*,*,*"
"さ"
"動詞,自立,*,*,サ変・スル,未然レル接続,する"
"れ"
"動詞,接尾,*,*,一段,連用形,*"
"た"
"助動詞,*,*,*,特殊・タ,基本形,た"
"革命"
"名詞,一般,*,*,*,*,*"
"の"
"助詞,格助詞,一般,*,*,*,の"
"気高い"
"形容詞,自立,*,*,形容詞・アウオ段,基本形,*"
"志"
"名詞,一般,*,*,*,*,*"
"も"
"助詞,係助詞,*,*,*,*,も"
"、"
"記号,読点,*,*,*,*,*"
"その後"
"名詞,副詞可能,*,*,*,*,*"
"は"
"助詞,係助詞,*,*,*,*,は"
"官僚"
"名詞,一般,*,*,*,*,*"
"主義"
"名詞,一般,*,*,*,*,*"
"と"
"助詞,並立助詞,*,*,*,*,と"
"大衆"
"名詞,一般,*,*,*,*,*"
"に"
"助詞,格助詞,一般,*,*,*,に"
"飲み込ま"
"動詞,自立,*,*,五段・マ行,未然形,*"
"れ"
"動詞,接尾,*,*,一段,連用形,*"
"て"
"助詞,接続助詞,*,*,*,*,て"
"しまう"
"動詞,非自立,*,*,五段・ワ行促音便,基本形,しまう"
"。"
"記号,句点,*,*,*,*,BOS/EOS"
"BOS/EOS"
"BOS/EOS"

parseとかmincost_pathとか知らないので、どのように要素を取りだすのかイマイチ見えないですが、
とてもよいと思いました。

どうでもいいが、okuraっていう名前はこっから来てるんだろうか。