なんじゃくにっき

プログラミングの話題中心。

形態素解析エンジンIgoをScalaから使う

日本語の形態素解析Scalaで行おうと思う。
 
日本語の形態素解析エンジンとしてはMecabが有名だが、
MecabC++製なので、ScalaJavaから使うにはJNIやらを使わないといけないのでイケてない。
 
ので、できればJava実装のものが好ましいのだが、幸いJavaで実装された形態素解析エンジンも存在する。
 
SenMecabJava実装
IgoMecabとは独自実装だがインターフェイスは互換性がある。Common Lispバージョンもあり。
Rubyに移植されたigo-rubyというものも存在するようだ。
 
今回はIgoを使う。
手順1:
ダウンロードページからigo-0.4.5.jarを落としてきてパスを通す。
(デフォルトのsbtプロジェクトなら%PROJECT_HOME%/libに突っ込むだけ)

手順2:
Mecabのリポジトリからmecab-ipadic-2.7.0-20070801.tar.gzといった感じの名前のファイルを探してダウンロードして解凍。
 
手順3:
辞書のビルド
java -cp ./lib/igo-0.4.5.jar net.reduls.igo.bin.BuildDic ipadic mecab-ipadic-2.7.0-20070801 EUC-JP
(パスやライブラリのバージョンは適当に読み替えてください)

これで形態素解析が行えるようになる。
以下、サンプルコード。


package nanjakkun.com.github

import net.reduls.igo._
import collection.JavaConversions._

object Main extends App {
val tagger = new Tagger("ipadic")

args.firstOption match {
case None => println("第一引数に何か文章を指定してね")
case Some(str) => {
tagger.parse(str).foreach(morpheme =>{
println(morpheme.surface + ": " + morpheme.feature)
})
}
}
}

これを


sbt 'run 私がウスウスと眼を覚ました時、こうした蜜蜂の 唸るような音は、まだ、その弾力の深い余韻を、私の耳の穴の中にハッキリと引き残していた。'

みたいに起動すると以下の結果が得られる


私: 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
が: 助詞,格助詞,一般,*,*,*,が,ガ,ガ
ウスウス: 名詞,一般,*,*,*,*,*
と: 助詞,並立助詞,*,*,*,*,と,ト,ト
眼: 名詞,一般,*,*,*,*,眼,メ,メ
を: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
覚まし: 動詞,自立,*,*,五段・サ行,連用形,覚ます,サマシ,サマシ
た: 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
時: 名詞,非自立,副詞可能,*,*,*,時,トキ,トキ
、: 記号,読点,*,*,*,*,、,、,、
こうした: 連体詞,*,*,*,*,*,こうした,コウシタ,コーシタ
蜜蜂: 名詞,一般,*,*,*,*,蜜蜂,ミツバチ,ミツバチ
の: 助詞,格助詞,一般,*,*,*,の,ノ,ノ
唸る: 動詞,自立,*,*,五段・ラ行,基本形,唸る,ウナル,ウナル
よう: 名詞,非自立,助動詞語幹,*,*,*,よう,ヨウ,ヨー
な: 助動詞,*,*,*,特殊・ダ,体言接続,だ,ナ,ナ
音: 名詞,一般,*,*,*,*,音,オト,オト
は: 助詞,係助詞,*,*,*,*,は,ハ,ワ
、: 記号,読点,*,*,*,*,、,、,、
まだ: 副詞,助詞類接続,*,*,*,*,まだ,マダ,マダ
、: 記号,読点,*,*,*,*,、,、,、
その: 連体詞,*,*,*,*,*,その,ソノ,ソノ
弾力: 名詞,一般,*,*,*,*,弾力,ダンリョク,ダンリョク
の: 助詞,格助詞,一般,*,*,*,の,ノ,ノ
深い: 形容詞,自立,*,*,形容詞・アウオ段,基本形,深い,フカイ,フカイ
余韻: 名詞,一般,*,*,*,*,余韻,ヨイン,ヨイン
を: 助詞,格助詞,一般,*,*,*,を,ヲ,ヲ
、: 記号,読点,*,*,*,*,、,、,、
私: 名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
の: 助詞,連体化,*,*,*,*,の,ノ,ノ
耳: 名詞,一般,*,*,*,*,耳,ミミ,ミミ
の: 助詞,連体化,*,*,*,*,の,ノ,ノ
穴: 名詞,一般,*,*,*,*,穴,アナ,アナ
の: 助詞,連体化,*,*,*,*,の,ノ,ノ
中: 名詞,非自立,副詞可能,*,*,*,中,ナカ,ナカ
に: 助詞,格助詞,一般,*,*,*,に,ニ,ニ
ハッキリ: 副詞,助詞類接続,*,*,*,*,ハッキリ,ハッキリ,ハッキリ
と: 助詞,副詞化,*,*,*,*,と,ト,ト
引き: 動詞,自立,*,*,五段・カ行イ音便,連用形,引く,ヒキ,ヒキ
残し: 動詞,自立,*,*,五段・サ行,連用形,残す,ノコシ,ノコシ
て: 助詞,接続助詞,*,*,*,*,て,テ,テ
い: 動詞,非自立,*,*,一段,連用形,いる,イ,イ
た: 助動詞,*,*,*,特殊・タ,基本形,た,タ,タ
。: 記号,句点,*,*,*,*,。,。,。

featureの中に 「名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ」
のように単語に関する情報が文字列として連結されて入っているので、
品詞だけ欲しい場合などは自分で文字列を分割して使用する必要あり。