【超便利】C#とNMeCabで形態素解析!ユーザー辞書の登録も詳しく解説。

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

形態素解析といえば、MeCabが有名ですが、C#からMeCabを扱うためのライブラリ「NMeCab」が存在します。

NMeCabについては他のサイトでも解説されていますが、本格的に形態素解析を行う場合はユーザー辞書が重要であるにも関わらず、その部分は少ししか触れられていないことが多く、結局はMeCabの記事を参考にすることになります。

今回はC#を使ってNMeCabによる形態素解析と、形態素解析では欠かせないユーザー辞書の作り方について詳しく解説します。

NMeCabとは

形態素解析とは?おすすめの5大解析ツールや実際の応…|Udemy メディア

形態素とは、「文書の中に登場する、意味を持つ最小限の単位」のことです。

言い換えると、「文書を、代名詞、副助詞、名詞、動詞などの品詞に分解した結果の1つ1つ」とも言えます。

たとえば、「今日は私の誕生日です」という文書があるとすると、「今日」「は」「私」「の」「誕生日」「です」という具合に分解されるのです。

英語の場合、品詞はスペースで区切られているため、単純にスペースで分割すれば事が足りるのですが、日本語の場合はそういう訳にはいかないので、形態素解析を使います。

形態素解析を行うツールとして、MeCab、Jumanが最も有名ですが、それぞれが単体のアプリ(コンソールアプリ)として作られているため、C#から呼び出す場合は 、文書を一旦ファイルに出力し、Process.Start() メソッドでMeCabやJumanの実行ファイルを呼び出して形態素解析させた上で、その出力結果を受け取るという方法しか使えませんでした。

しかし、今回紹介するNMeCabは、MeCabのエンジンを直接C#から呼び出せるようにしたライブラリであるため、NMeCabの引数に解析したいテキストを指定するだけで、メソッドの戻り値として解析結果を受け取れるようになります。

NMeCabのインストール方法

NMeCab は NuGet を使って、プロジェクトにインストールします。

NuGetの詳しい使い方が知りたい方は、こちらの記事を合わせてお読みください。

NuGetから “NMeCab” で検索して、インストールするだけになります。

ユーザー辞書を登録する場合のは本家のMeCabが必要

残念ながらNMeCabにはユーザー辞書を作成したり、追加する機能はありません。

これらを実現するには、本家のMeCabをインストールして、辞書を作成するコマンド (mecab-dict-index.exe)を呼び出す必要があります。

MeCabのインストールは簡単で、下記の公式サイトからインストーラーをダウンロードし、実行するだけです。

表示されるページの真ん中あたりに実際のダウンロードリンクがあるのですが、ページが長いためスクロールして探すのが面倒です。

そこで、ページの先頭に「ダウンロード」というリンクが張られていますので、これをクリックしましょう。

実は、このリングはページ内リンクであり、公式ページの真ん中あたりにジャンプします。

ここで、 Binary package for MS-Windows という行を見つけ、 「mecab-0.9.9.6.exe ダウンロード」をクリックすると、インストーラーのダウンロードが開始されます。

あとは、インストーラーを実行してもらえれば、インストールは完了です。

インストールが完了すると、以下の様なフォルダが作成されます。

使いたいのは赤の点線で囲った mecab-dict-index.exe です。

MeCabの直下に dic フォルダがありますが、NMeCabの辞書フォルダは別のところにあるので、こちらは使いません。

NMeCabの辞書フォルダは、実行ファイルの直下にある

NMeCabの辞書フォルダは、実行ファイルが置かれているフォルダの直下にある、 dic フォルダ配下が使われます。

Visual Studioのプロジェクトフォルダの場合、Debug フォルダに実行ファイル(*.exe)が置かれますが、それと同じレベルに存在する dic 配下の辞書が参照されます。

実際には、dic の下に更に ipadic フォルダがあり、その下に辞書関連のファイルが格納されています。

ですから、ユーザー辞書を置く場合も、この ipadic フォルダに置いて下さい。

NMeCabによる形態素解析

NMeCabを使う場合、ソースコードの先頭で using を記述する必要があります。

実際の形態素解析は次の様になります。

NMeCabの解析結果は 本家のMeCabと同じく、以下の結果が返されます。

順番内容プロパティ
1表層形(形態素)描いSurface
2品詞動詞Featureをカンマで区切った1個目の要素
3品詞細分類1自立Featureをカンマで区切った2個目の要素
4品詞細分類2Featureをカンマで区切った3個目の要素
5品詞細分類3Featureをカンマで区切った4個目の要素
6活用形五段・カ行イ音便Featureをカンマで区切った5個目の要素
7活用型連用タ接続Featureをカンマで区切った6個目の要素
8原型描くFeatureをカンマで区切った7個目の要素
9読みエガイFeatureをカンマで区切った8個目の要素
10発音エガイFeatureをカンマで区切った9個目の要素

例えば、「キャンバスに描いた似顔絵は限りなく僕に似ていない」という文書をNMeCabで形態素解析すると、次のような結果になります。

本家のMeCabは、1列目と2列目(表層形と品詞)の間はタブで、2列目以降(品詞以降)はカンマで区切った結果を返してきます。

NMeCabの場合、表層形は Surfaceプロパティに、それ以外はカンマ区切りで Feature プロパティに格納されますが、解析内容は全く同じです。

ユーザー辞書の登録方法

ユーザー辞書はCSV形式のファイルを mecab-dict-index.exe の引数に渡すことで作成できます。

通常はProgram Files(x86)直下にMeCabがインストールされますので、具体的には次の様になります。

これは、MyDic.csvに記載したCSV形式のファイルから、MyDic.dicというMeCab用辞書を作成するコマンド例です。

辞書を作るためのCSVは次の様なフォーマットになります。

大半が省略可能なのと、「読み」「発音」はカンマすら入れなくても良いので、最低限のフォーマットとしては次の様になります。

項目の意味については次の通りです。

順番内容記述例説明
1表層形(形態素)似顔絵辞書に登録したい単語
2左文脈ID空白ググると「その単語を左から見たときの内部状態ID」という説明がなされているが、詳細は不明。空白にすると自動連番される。
3右文脈ID空白ググると「その単語を右から見たときの内部状態ID」という説明がなされているが、詳細は不明。空白にすると自動連番される。
4コスト10出現頻度を示す数値で、小さいほど出現頻度が高いとみなされる。
似たような単語が合った場合の優先順位として使われるが、シビアな判定が必要でないかぎり、適当な値(10とか)で良い。
5品詞名詞省略する場合は*を指定。形態素解析の結果、品詞で何か判定するのであれば、適切なものを指定しておく。
6品詞細分類1一般省略する場合は*を指定
7品詞細分類2省略する場合は*を指定
8品詞細分類3省略する場合は*を指定
9活用型省略する場合は*を指定
10活用形省略する場合は*を指定
11原形独自辞書何らかの文字を記述しておかないとエラーで辞書が作成できない
12読み空白省略する場合は空白にする
13発音空白省略する場合は空白にする

ユーザー辞書の参照方法

ユーザー辞書を作成したら、次はNMeCabから参照できるようにしましょう。

方法は2通りあります。

1つは MeCabParam クラスにユーザー辞書を設定する方法、もう1つは App.config に記述する方法です。

MeCabParamによるユーザー辞書参照

MeCabParamのクラスにある UserDic プロパティでユーザー辞書を指定する方法です。

NMeCabは複数のユーザー辞書を使う事が可能なので、UserDic にも複数の辞書が指定できるよう、文字列配列を渡す仕様になっています。

MeCabTagger.Createの引数に param を渡すことで、ユーザー辞書を利用することができるようになります。

ちなみに、DicDir というプロパティも持っており、全く別のフォルダにあるMeCabの辞書を使いたい場合、そのフォルダへのパスを指定します。

DicDirを特に指定しない場合、デフォルトの値(dic\ipadic)で動作するようになっています。

この方法は、環境によってはうまく動作しないがあるようで、私の環境では実行時に例外が発生しました。

App.configによるユーザー辞書参照

App.config でユーザー辞書を参照させる場合、<configSections>タグと、<applicationSettings>タグに次の内容を挿入します。

<configSections>タグについては、次の固定の内容を記述すればOKです。

<applicationSettings>については、以下のタグを張り付ければ良いのですが、<value>~</value>のところに、ユーザー辞書の名前をカンマ区切りで列記して下さい。

例えば、MyDic1.dic、MyDic2.dic を指定する場合、次のようになります。

この<configSections>タグと、<applicationSettings>を App.config に挿入すれば終わりなのですが、おそらく皆さんのプロジェクトごとにApp.conifgの内容が違うと思います。

従って、皆さんの内容に応じて、適切な位置に挿入してください。

皆さんが、App.config を特に何も変更していない場合は、次の位置に挿入してもらえればOKです。

実際の挿入例は次の様になります。

まとめ

今回は NMeCabについて、インストール方法と使い方、辞書の登録方法について解説しました。

形態素解析を行うだけなら NMeCabをインストールするだけで事が足りますが、ユーザー辞書を使いたい場合は、本系の MeCabをインストールして、mecab-dict-index.exe を使ってユーザー辞書を作成してあげる必要があります。

また、MeCabParamクラスのUserDicプロパティを使うか、App.config にタグを記述するかの2通りの方法のどちらかで、ユーザー辞書を指定してあげると、NMeCabからユーザー辞書が使えるようになります。

NMeCabを使うと簡単に形態素解析が出来てしまうので、是非ご活用下さい。

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