ちょっと形態素解析でもしてみるか

と思いたちまして。 今回はC#で書く必要があったので、.NetでMeCabを参照する方法を調べていたら、 MeCabの.Netでの実装したその名もNMeCabってライブラリがあったので早速使ってみました。

NMeCabは、オープンソース形態素解析エンジンMeCabの解析処理部分を、.NETライブラリとして移植したものです。 オリジナル版MeCabと同じ辞書を使用し、同じ解析結果を得ることができます。 純粋なC#言語で作成されており、ラッパーではないため、インストールがシンプルで、高速性と安定性にも優れています。

とのこと。 辞書は同じなので結果はオリジナルとほぼ変わらないと考えて良さそうです。

ダウンロード

上記NMeCabの公式サイトより最新版がダウンロード可能です。

中身を見てみる

ダウンロードしたファイルを解凍すると、このような構造のフォルダが現れます。

  • trunk
    • bin
      • MMF
      • LibNMeCab.dll
      • WindowsFormsSample.exe
      • WindowsFormsSample.exe.config
    • dic
      • ipadic
    • src
      • LibNMeCab
      • LibNMeCabMMF
      • WindowsFormSample
      • NMeCab.sln

bin以下は、サンプルアプリケーションです。 こんな感じのWindowsフォームアプリケーションで、入力した文字を形態素解析して遊ぶことができます。 ちなみに起動には.NetFramework2.0以上が必要です。

dic以下には辞書ファイルが格納されています。 srcはその名の通りソース群ですね。上には記載してませんがテストもしっかり付いているようです。

組み込んでみる

Program.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NMeCab;

namespace NMecabTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                string sentence = "";

                MeCabParam param = new MeCabParam();
                param.DicDir = @"....libdicipadic";

                MeCabTagger t = MeCabTagger.Create(param);
                MeCabNode node = t.ParseToNode(sentence);
                while (node != null)
                {
                    if (node.CharType > 0)
                    {
                        Console.WriteLine(node.Surface + "t" + node.Feature);
                    }
                    node = node.Next;
                }
                Console.WriteLine();
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
            finally
            {
                Console.Read();
            }
        }
    }
}

MeCabの仕様で、実行結果の最初と最後にBOS/EOSというヘッダとフッタ?のようなオブジェクトが返ってくるらしく、これらにはFeatureが存在しないので node.Featureを実行するとオブジェクト参照エラーになります。 そのため、CharTypeの値を見てFeatureを出力するか判定しています。

あと、辞書の参照先を相対パスで指定していますが、Exe化することを考えればApp.configで持たせたほうがいいでしょうね。

プロジェクトは下記のような構成になってます。

  • NMeCabTest
    • bin
    • lib
      • dic
      • LibNMeCab.dll
    • Program.cs
  • NMeCabTest.sln

参考

コードはほぼ以下のブログを参考にしています。

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

その他

自社バグトラッキングシステムの変更リクエストの内容を形態素解析したら面白いデータが取れそう、とか思っちゃったのがキッカケ。