imadedede のブログ

今出川潤の出張所。

NMeCab を .NET アプリに組み込んで形態素解析

MeCab というものがある。
誤解される恐れがあるのを承知で、かなりざっくりといいかげんに説明すると、これを使うと日本語の漢字の読みとかを文脈に沿って解析してくれる。

MacOS X には(10.5以降から?)標準で入っていて Spotlight 検索などに使われているし、ゆっくり MovieMaker はこれを使っていることが売りの一つになっている。

NMeCab とは、その MeCabC# で書き直されたもの。「ゆっくいち!」は C# 2.0 で開発しているので、試しに NMeCab を使ってみた。

準備

ダウンロードしてくる

NMeCab 配布ページにて最新版をダウンロード。

解凍して、フォルダ内からいくつかテストに必要なモノをもってくる。

現時点での最新版は 0.06.3 。解凍すると NMeCab0.06.3 というフォルダができる。

NMeCab.dll をとってくる

NMeCab0.06.3/trunk/bin にある。 NMeCab の核。

MMF 版もあるけど、これを使うなら C# 4.0 でないといけない。今回は C# 2.0 環境でやりたいのでとりあえずここにあるものを使う。

元々の MeCab に対してバインディングしているわけではないので、この DLL で機能が完結している。

WindowsFormsSample.exe.config をとってくる

NMeCab0.06.3/trunk/bin にある。要は DLL と同じ場所の XML 。辞書のパス指定に使う。

XML 内のシステム辞書を指定するパスの ..\dic\ipadic を、今回は .\dic\ipadic に変更。そしてファイル名を NMeCabTest.exe.config に変更する。

ダウンロードしたものには IPA 辞書が入っているが、自分で NAIST 辞書をダウンロードしてコンパイルしてこのファイルで指定すれば、 NMeCab で NAIST 辞書を使用することも可能。

NMeCab 自体には辞書のコンパイル機能はない。元々の MeCab を使わないといけない。

辞書をとってくる

NMeCab0.06.3/trunk/ にあるdicフォルダをフォルダごととってくる。
DLL の一つ上のフォルダにある。

とってきたものをあつめる

以上、用意したモノを一つのフォルダに集める。
最終的なフォルダ構成はこんな感じ。

temp
├─LibNMeCab.dll
├─NMeCabTest.cs
├─NMeCabTest.exe.config
└─dic
    └─ipadic
        ├─char.bin
        ├─dicrc
        ├─matrix.bin
        ├─sys.dic
        └─unk.dic

この LibNMeCab.dll と同じ場所に NMeCabTest.cs ファイルを作り、コーディングしていく。

テストコード

クラス名やコンストラクタが多少違うもの、基本的には他の MeCab バインディングと変わらない。

/*
 * NMeCab はクラス名が変更されている
 * MeCab::Tagger ⇒ NMeCab.MeCabTagger
 * MeCab::Node ⇒ NMeCab.MeCabNode
 * 
 * 詳しい実装やクラスメンバなどは NMeCab0.06.3/trunk/LibNMeCab/MeCabNode.cs など参照。
 * 
 * mono で使うなら、辞書ファイルパスのバックスラッシュをスラッシュに変更
 * コンパイルは
 * gmcs -r:module.dll use_module.cs
 * 
 */
using System;
using NMeCab;

public class NMeCabTest{
	static public void Main(){
		string sentence = "行く川のながれは絶えずして、しかも本の水にあらず。";
		
		// NMeCab はクラス名が変更されている
		MeCabTagger t = MeCabTagger.Create();
		
		// 形態素を一つずつたどっていく
		Console.WriteLine("形態素をひとつずつたどっていく");
		MeCabNode node = t.ParseToNode( sentence );
		while( node != null ){
			Console.WriteLine(node.Surface + "\t" + node.Feature);
			node = node.Next;
		}
		Console.WriteLine();
		
		// 一気に結果をもらう
		Console.WriteLine("一気に結果をもらう");
		string result = t.Parse( sentence );
		Console.WriteLine(result);
	}
 
}

コンパイル

DLL をライブラリとして指定するのを忘れずに。

csc \r:LibNMeCab.dll NMeCabTest.cs

あと実行前に EXE ファイル名と .exe.config のファイル名が対応していることを確認。

NMeCabTest.exe
NMeCabTest.exe.config

実行結果

コマンドを実行。

$ .¥NMeCabTest.exe
形態素をひとつずつたどっていく
行く川のながれは絶えずして、しかも本の水にあらず。	BOS/EOS,*,*,*,*,*,*,*,*
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
	BOS/EOS,*,*,*,*,*,*,*,*

一気に結果をもらう
行く	動詞,自立,*,*,五段・カ行促音便,基本形,行く,イク,イク
川	名詞,一般,*,*,*,*,川,カワ,カワ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
ながれ	動詞,自立,*,*,一段,連用形,ながれる,ナガレ,ナガレ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
絶えず	副詞,一般,*,*,*,*,絶えず,タエズ,タエズ
し	動詞,自立,*,*,サ変・スル,連用形,する,シ,シ
て	助詞,接続助詞,*,*,*,*,て,テ,テ
、	記号,読点,*,*,*,*,、,、,、
しかも	接続詞,*,*,*,*,*,しかも,シカモ,シカモ
本	名詞,一般,*,*,*,*,本,ホン,ホン
の	助詞,連体化,*,*,*,*,の,ノ,ノ
水	名詞,一般,*,*,*,*,水,ミズ,ミズ
に	助詞,格助詞,一般,*,*,*,に,ニ,ニ
あら	動詞,自立,*,*,五段・ラ行,未然形,ある,アラ,アラ
ず	助動詞,*,*,*,特殊・ヌ,連用ニ接続,ぬ,ズ,ズ
。	記号,句点,*,*,*,*,。,。,。
EOS

解析できてる。

その他

ライセンスは GPL / LGPL のデュアルライセンス。アプリに組み込むのも悪くない。

そんな感じで、将来的には「ゆっくいち!」にも組み込みたい。