Help us understand the problem. What is going on with this article?

NMeCabで形態素解析してみよう

More than 5 years have passed since last update.

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

と思いたちまして。 今回は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 = @"..\..\lib\dic\ipadic";

                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 アプリに組み込んで形態素解析

その他

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away