NMeCabで独自辞書を読み込んで使う

形態素解析がしたくなり調べていたところ、MeCabの.Net版として作られた NMeCab (サイト) を見つけた。
これに、Wikipediaとはてなの辞書を追加し自分のソフトウェアで利用するまでの話。
環境は
 Windows7 Pro 64bit
 Visual Studio 2010 Pro

まず、Wikipediaとはてなの辞書を作成する。
そのためにこちらのサイトを参考にさせていただきました。ありがとうございます。
MeCabにユーザ辞書を追加する。』 タチコマ好きなエンジニアのブログ

こちらの記事はLinux向けに書かれているので、Windowsでの操作。

辞書を作成する
【3. ユーザ辞書のコンパイル】から
Mecabのインストール先はデフォルトで、
PATHが
C:\Program Files (x86)\MeCab\bin
に設定されていて
辞書はIPAが入っているとする。
カレントディレクトリは、csvファイルが置いてある場所。

mecab-dict-index -d C:\Program Files (x86)\MeCab\dic\ipadic -u hatena-keyword.dic -f utf-8 -t utf-8 hatena_userdic.csv
mecab-dict-index -d C:\Program Files (x86)\MeCab\dic\ipadic -u wikipedia-keyword.dic -f utf-8 -t utf-8 wikipedia_userdic.csv

すると、カレントディレクトリに二つの辞書ファイルが出力される。

NMeCabの中に辞書ファイルをコピー
NMeCabはプロジェクトで既に読み込まれているものとする。
プロジェクトの、lib\dic\ipadic に
C:\Program Files (x86)\MeCab\dic\ipadic
の中身をすべてコピーする。
ついでに先ほど作成した二つの .dic ファイルも lib\dic\ipadic へ入れる。

.configファイルに設定を記述する。
もし new MeCabParam(); などで DicDirを設定している場合は削除して大丈夫です。
プロジェクトで App.config を作成していない人は
● NMeCabからコピー
NMeCabのフォルダ -> src\ -> WindowsFormSample\ -> app.config
をプロジェクトに追加
又は
● 自分で作成
 [プロジェクト名] を右クリック
 [追加] -> [新しい項目] -> [アプリケーション構成ファイル]

作成したら、中身を以下のように書き換える

<?xml version="1.0"?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section name="NMeCab.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false"/>
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <NMeCab.Properties.Settings>
      <setting name="DicDir" serializeAs="String">
        <value>..\..\lib\dic\ipadic</value>
      </setting>
      <setting name="UserDic" serializeAs="String">
        <value>hatena-keyword.dic, wikipedia-keyword.dic</value>
      </setting>
    </NMeCab.Properties.Settings>
  </applicationSettings>
</configuration>

それぞれの value の階層は人によって違うため ..\ の数を調整しましょう。
UserDic の value は、DicDir が基準になっています。
上記の例だと
 ..\..\lib\dic\ipadic\hatena-keyword.dic
が参照されます。

簡単なソースぺたり。 ..フォームアプリケーションです。

using System;
using System.Windows.Forms;
using NMeCab;

namespace post_346_nmecab
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void Form1_Load(object sender, EventArgs e)
        {}

        private void text_analysis()
        {
            try
            {
                string txt = "";
                tAnalysed.Clear();
                MeCabTagger t = MeCabTagger.Create();
                MeCabNode n = t.ParseToNode(tBaseString.Text);
                while (n != null)
                {
                    if (n.CharType > 0)
                    {
                        txt += n.Surface + "\t" + n.Feature + Environment.NewLine;
                    }
                    n = n.Next;
                }
                tAnalysed.Text = txt; 
            }
            catch (Exception e)
            {
                MessageBox.Show(e.ToString(), "エラー☆", MessageBoxButtons.Yes, MessageBoxIcon.Error);
                this.Close();
            }
        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
        }

        private void bAnalysis_Click(object sender, EventArgs e)
        {
            text_analysis();
        }
    }
}

でも、大きなファイルを解析するときは、マルチスレッドに対応させた方がいいと思います。

おわり

Atsumi3

したいことをします。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください