【必見】形態素解析(NMeCab)とユーザー辞書登録をC#から行うクラスのサンプル

プログラミングTips
この記事は約10分で読めます。

こちらの記事で MeCab をC#で使う方法について解説しましたが、今回はC#から簡単に形態素解析とユーザー辞書登録を行えるようにしたヘルパークラスを作りましたので、紹介します。

NMeCab を解説しているサイトはいくつかありますが、クラス化しているものとか、ユーザー辞書の登録について詳しく解説しているサイトは見つからなかったので、それらを網羅した記事になっています。

サンプルプログラムも用意し、ソースも公開していますので、皆さん適宜必要な個所を修正のうえ、お使いください。

サンプルプログラムの動作

今回作成したサンプルプログラムの動作について簡単に解説しましょう。

一番上のテキストボックスに解析したいテキストを入力し、「形態素解析」ボタンをクリックすると、真ん中のDataGird部分に解析結果が表示されます。

一番下のテキストボックスが辞書を登録する部分で、辞書に登録したいキーワードを列挙して、「辞書登録」ボタンをクリックすると、ユーザー辞書が生成されます。

辞書を登録後に「形態素解析」ボタンをクリックすると、最初は「超」「便利」「な」「ドラッグ」「&」「ドロップ」という具合に分割されていたものが、「超便利」と「ドラッグ&ドロップ」がそれぞれ単語として認識されていることが分かると思います。

プロジェクトのダウンロード

プロジェクト一式は下記からダウンロードできます。

尚、NMecabを入れるとファイルが巨大化するので、プロジェクト一式には含んでいません。

ビルドする場合は必ずNMecabをインストール(後述)してから行ってください。

NMeCabのインストール方法

NMeCabのインストール方法は NuGetを使って行います。

Visual Studio の NuGet で ”NMeCab”というキーワードで検索すると、以下の様にNMeCabが表示されますので、プロジェクト欄にチェックを入れて「インストール」をクリックしてください。

NuGetの詳しい解説がお知りになりたい方は、こちらをご覧ください。

C#からユーザー辞書を登録するにはMeCabのインストールが必要

NMeCabは直接ユーザー辞書を作成する機能をサポートしていません。

ユーザー辞書を登録する場合、MeCabが扱える辞書ファイル形式にコンパイルする必要があるのですが、これは本家のMeCabに添付されている

mecab-dict-index.exe を使うことになります。

今回のサンプルプログラムでも、C#からこのファイルを呼び出しています。

本家のMeCabはこちらの公式サイトからダウンロード&インストールして下おいてください。

公式サイトを表示すると「ダウンロード」のリンクがありますので、これをクリックすると、ページ中央のダウンロードリンクの位置までジャンプします。

続けて、以下のダウンロードリンクをクリックすると、インストーラーがダウンロードできます。

ソースコード解説

今回はWPFを使ってサンプルを作成していますが、NMeCabを扱うクラスはWindowsForm でも Console プログラムでも共通です。

まず、XAMLの解説から始めましょう。

画面のソースコード

ボタンが2つ、テキストボックスが2つ、DataGridが1つというシンプルな構成です。

WPFではありますが、MVVMではなくWindowsFormと同じくイベントドリブンでベタ書きしているので、WindowsForm技術者の方でも理解しやすいかと思います。

次にC#のソースコードを見ていきます。

C#のソースコード

こちらもWindowsFormと同じく、イベントハンドラに処理を記述しています。

ソースコードの真ん中(70行目当たり)に public class MecabUtil という記述がありますが、これが NMeCabを簡単に使うためのクラスです。 

辞書を参照するためのApp.config

ユーザー辞書をNMecabから参照するための方法として、App.config に記述する方法と、MeCabParamクラスで辞書を指定する方法の2通りが有ります。

どちらでも良いのですが、私の場合 MeCabParam を使って辞書を登録すると例外エラーが発生してしまいましたので、App.config に記述する方法を採用しています。

ユーザー辞書を参照する場合、<configSections>タグと、<applicationSettings>タグを App.configに挿入する必要がありますが、ポイントは11行目の<value>~</value>の間に、ユーザー辞書を記述するところです。

ユーザー辞書が複数ある場合は、<value>MyDic1.dic,MyDic2.dic,MyDic3.dic<value> の様に、カンマ区切りで辞書名を羅列します。

App.config に この編集を行った後で、列記した辞書が所定フォルダ(後述)に存在しない場合、実行時にエラーになってしまいます

あらかじめ、記述した名前でユーザー辞書を作成しておいて下さい。

所定のフォルダとはプログラム実行フォルダに存在する dic フォルダ⇒ iPadicフォルダの事です。

NMeCabの場合、このフォルダが辞書の場所として初期設定されていて、ここからの相対パスによって UserDicを探します。

MecabUtilのCreateUserDicメソッドを使うと簡単に辞書が作成できますので、プログラム起動時に辞書を作るようにしてもらえれば良いかと思います。

辞書を作成する際、1つでも良いので何らかの単語を CreateUserDicに指定してあげる必要があります。

というのも、MeCabの仕様上、空のユーザー辞書を作成することが出来ないからです。

では、実際に App.config に手を加えてみましょう。

MecabTestプロジェクトのApp.config の初期状態は次の様になっていました。

【変更前】

<configuration>タグの中に、<configSections>タグと<applicationSettings>を入れればよいので、次のようになります。

この時、<startup>タグの直前に入れるようにしてください。

<startup>タグより後ろに入れると、実行時にエラーになってしまいます。

【変更後】

MeCabUtilの使い方

では、使い方について解説しておきます。

MeCabUtilのリファレンス

MeCabUtilには1つのプロパティと4つのメソッドが実装されています。

DicDirはユーザー辞書を置く場所を指定します。

MeCabUtilで作成したユーザー辞書は、DicDirで指定されたフォルダにコピーされます。

NMecabの辞書が置かれているフォルダ(相対指定で ”dic\ipadic”)と同じ場所を指定しないといけないので、初期値はそのようになっています。

属性リファレンス
プロパティDicDir
ユーザー辞書のコピー先フォルダ。
初期値はNMeCabのデフォルトの辞書フォルダである “dic\ipadic”
特に問題が無い限り、このまま使用する。
メソッドList<string[]> Analyze(string test)
形態素解析を実行し、結果の配列をLISTで返す。
通常、MeCabは解析結果を1単語(形態素)毎に、タブとカンマ区切りの1行として返してくる。

 <MeCabの出力例>
 今日\t名詞,副詞可能,*,*,*,*,今日,キョウ,キョー
 
これをタブとカンマで分解して配列に格納し、全ての形態素をLIST形でまとめて戻り値にしている。
メソッドstring[] CreateUserDic(string dicName,string[] keyword
keywordで指定された文字列を使って dicName の名前で辞書を作成する。
既に存在する場合は上書きされる。
メソッドstring[] CreateUserDic(string dicPath,string csvPath)
上記と同じだが、辞書を記述したCSVファイルを使って、dicPathで指定したパスに辞書を作成する。
メソッドstring[] ProcessCall(string program, string args = “”)
C#からコンソールプログラムを呼び出すためのメソッド。
戻り値としてコンソールプログラムの出力結果を配列形式で返す。
C#からmecab-dict-index.exe を呼び出すために使用している。

MeCabUtilの使い方

では、形態素解析の方法とユーザー辞書の方法について、順に解説していきたいと思います。

形態素解析の実行

NMecabUtilのインスタンスを生成し、Analyzeメソッドに解析したい文字列を渡せば、結果がList形式で返ってきます。

出力イメージは次の様になります。

各項目(列)の意味については、こちらで詳しく解説していますので、ご参照下さい。

ユーザー辞書の登録

辞書を登録する場合は、CreateUserDicメソッドを使います。

辞書を登録すると言っても、既存のユーザー辞書に追加するのではなく、呼び出される度に新規作成していることにご注意ください。

既存のユーザー辞書に新しい単語を追加したい場合、過去に登録した単語を含んだ文字列配列を、第2引数に指定する必要があります。

MeCabに辞書を登録する場合、フォーマットが決まっていますので、登録したい単語だけだとエラーになってしまいます。

登録したい単語の後ろに、品詞や読み仮名などの情報も一緒に付け加える必要があります。

しかし、幸いなことに省略できる項目も多く、単に形態素解析を行うだけであれば、登録したい単語に続けて”,,,10,名詞,一般,,,,,独自辞書”などの固定文字列を付加してあげれば辞書が作成できます。

CreateUserDicメソッドは、第2引数で指定されたキーワード(登録したい単語)に対して、この固定文字を付加したものを mecab-dict-index.exe に渡して辞書を作成しています。

mecab-dict-index.exe で指定している引数の意味は次の通りです。

-dフォルダ名
-uユーザー辞書名
-fCSVの文字コード
-tユーザー辞書の文字コード

今回 -d オプションに指定しているフォルダは “C:\Program Files (x86)\MeCab\dic\ipadic\” にしています。

実行プログラムのフォルダにある “dic\ipadic”を指定しても良いのかもしれませんが、そうなるとプロジェクト毎に修正する必要が生じるので、本家のMeCabのシステム辞書フォルダを指定しています。

もし、異なった場所にインストールしている場合、この部分を適宜修正して下さい。

まとめ

以上でNMeCabのヘルパークラスの解説は終了です。

クラス化しているため、その部分だけコピペしてご自身のプロジェクトで再利用ができます。

あとは、皆さんのニーズに合わせてカスタマイズして頂ければ幸いです。

タイトルとURLをコピーしました