形態素解析といえば、MeCabが有名ですが、C#からMeCabを扱うためのライブラリ「NMeCab」が存在します。
NMeCabについては他のサイトでも解説されていますが、本格的に形態素解析を行う場合はユーザー辞書が重要であるにも関わらず、その部分は少ししか触れられていないことが多く、結局はMeCabの記事を参考にすることになります。
今回はC#を使ってNMeCabによる形態素解析と、形態素解析では欠かせないユーザー辞書の作り方について詳しく解説します。
尚、C# から NMeCab を操作するために便利なクラスを「【C#】NMeCabによる形態素解析とユーザー辞書登録のクラスを作りました」の記事で公開しているので、併せてご一読ください。
NMeCabとは
形態素とは、「文書の中に登場する、意味を持つ最小限の単位」のことです。言い換えると、「文書を、代名詞、副助詞、名詞、動詞などの品詞に分解した結果の1つ1つ」とも言えます。
たとえば、「今日は私の誕生日です」という文書があるとすると、「今日」「は」「私」「の」「誕生日」「です」という具合に分解されるのです。
英語の場合、品詞はスペースで区切られているため、単純にスペースで分割すれば事が足りるのですが、日本語の場合はそういう訳にはいかないので、形態素解析を使います。
形態素解析を行うツールとして、MeCab、Jumanが最も有名ですが、それぞれが単体のアプリ(コンソールアプリ)として作られているため、C#から呼び出す場合は 、文書を一旦ファイルに出力し、Process.Start() メソッドでMeCabやJumanの実行ファイルを呼び出して形態素解析させた上で、その出力結果を受け取るという方法しか使えませんでした。
今回紹介するNMeCabは、MeCabのエンジンを直接C#から呼び出せるようにしたライブラリであるため、NMeCabの引数に解析したいテキストを指定するだけで、メソッドの戻り値として解析結果を受け取れるようになります。
NMeCabのインストール方法
NuGet の検索欄から下記のキーワードで検索し、「NMeCab」を選んでインストールしてください。
NMeCab
NuGetの詳しい使い方が知りたい方は、「Visual Studio のパッケージ管理機能 NuGetとは?」の記事を合わせてお読みください。
ipadic の辞書も自動的にインストールされ、ソリューションエクスプローラーに表示されます。
NMeCabによる形態素解析
NMeCabを使う場合、ソースコードの先頭で using を記述する必要があります。
1 |
using NMeCab; |
実際の形態素解析は次の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// 解析器を生成 var mecab = MeCabTagger.Create(); // 形態素解析したい文字列を用意 var text = "キャンバスに描いた似顔絵は限りなく僕に似ていない"; // 形態素解析を実行 var node = mecab.ParseToNode(text); // 全ての形態素を取り出すループ while (node != null) { // 形態素1つ分の解析結果を取り出し string surface = node.Surface; //表層形(形態素) string feature = node.Feature; //解析結果(品詞、読み仮名等) // コンソールに結果を出力 Console.WriteLine(surface+" "+feature); //次の形態素を取り出す node = node.Next; } |
実行すると次の内容がコンソール出力されます。NMeCabの解析結果は 本家のMeCabと同じです。
キャンバスに描いた似顔絵は限りなく僕に似ていない BOS/EOS,,,,,,,,
キャンバス 名詞,一般,,,,,キャンバス,キャンバス,キャンバス
に 助詞,格助詞,一般,,,,に,ニ,ニ 描い 動詞,自立,,,五段・カ行イ音便,連用タ接続,描く,エガイ,エガイ た 助動詞,,,,特殊・タ,基本形,た,タ,タ
似顔絵 名詞,一般,,,,,似顔絵,ニガオエ,ニガオエ
は 助詞,係助詞,,,,,は,ハ,ワ
限り 名詞,ナイ形容詞語幹,,,,,限り,カギリ,カギリ
なく 助動詞,,,,特殊・ナイ,連用テ接続,ない,ナク,ナク 僕 名詞,代名詞,一般,,,,僕,ボク,ボク
に 助詞,格助詞,一般,,,,に,ニ,ニ 似 動詞,自立,,,一段,連用形,似る,ニ,ニ て 助詞,接続助詞,,,,,て,テ,テ い 動詞,非自立,,,一段,未然形,いる,イ,イ ない 助動詞,,,,特殊・ナイ,基本形,ない,ナイ,ナイ
解析結果は Surfaceプロパティと Feature プロパティで取得可能です。それぞれの内容は次の通りです。
順番 | 内容 | 例 | プロパティ |
---|---|---|---|
1 | 表層形(形態素) | 描い | Surface |
2 | 品詞 | 動詞 | Featureをカンマで区切った1個目の要素 |
3 | 品詞細分類1 | 自立 | Featureをカンマで区切った2個目の要素 |
4 | 品詞細分類2 | * | Featureをカンマで区切った3個目の要素 |
5 | 品詞細分類3 | * | Featureをカンマで区切った4個目の要素 |
6 | 活用形 | 五段・カ行イ音便 | Featureをカンマで区切った5個目の要素 |
7 | 活用型 | 連用タ接続 | Featureをカンマで区切った6個目の要素 |
8 | 原型 | 描く | Featureをカンマで区切った7個目の要素 |
9 | 読み | エガイ | Featureをカンマで区切った8個目の要素 |
10 | 発音 | エガイ | Featureをカンマで区切った9個目の要素 |
ユーザー辞書の登録方法
ユーザー辞書を登録するには、次の4つの作業が必要です。
- MeCabのインストール
公式サイトからインストーラーをダウンロードして、インストールを実行 - ユーザー辞書の作成
CSVに追加したい辞書を記述し、mecab-dict-index.exe コマンドを使ってユーザー辞書を作成 - ユーザー辞書のコピー
ユーザー辞書を所定のフォルダにコピー - ユーザー辞書の参照設定
使いたいユーザー辞書のファイル名をプログラムコード又はApp.configで指定する
では、詳しく見ていきましょう。
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の辞書フォルダは別のところにあるので、こちらは使いません。
ユーザー辞書の作成
ユーザー辞書はCSV形式のファイルを mecab-dict-index.exe の引数に渡すことで作成できます。
mecab-dict-index -d システム辞書のフォルダ -u ユーザー辞書名 -f CSVの文字コード -t 辞書の文字コード CSVファイル名
通常はProgram Files(x86)直下にMeCabがインストールされますので、具体的には次の様になります。
これは、MyDic.csvに記載したCSV形式のファイルから、MyDic.dicというMeCab用辞書を作成するコマンド例です。
1 |
"C:\Program Files (x86)\MeCab\bin\mecab-dict-index" "C:\Program Files (x86)\MeCab\dic\ipadic" -u "MyDic.dic" -f shift-jis -t utf-8 "MyDic.csv" |
辞書を作るためのCSVは次の様なフォーマットになります。
大半が省略可能なのと、「読み」「発音」はカンマすら入れなくても良いので、最低限のフォーマットとしては次の様になります。
似顔絵,,,10,名詞,一般,*,*,*,*,独自辞書
項目の意味については次の通りです。
順番 | 内容 | 記述例 | 説明 |
---|---|---|---|
1 | 表層形(形態素) | 似顔絵 | 辞書に登録したい単語 |
2 | 左文脈ID | 空白 | ググると「その単語を左から見たときの内部状態ID」という説明がなされているが、詳細は不明。空白にすると自動連番される。 |
3 | 右文脈ID | 空白 | ググると「その単語を右から見たときの内部状態ID」という説明がなされているが、詳細は不明。空白にすると自動連番される。 |
4 | コスト | 10 | 出現頻度を示す数値で、小さいほど出現頻度が高いとみなされる。 似たような単語が合った場合の優先順位として使われるが、シビアな判定が必要でないかぎり、適当な値(10とか)で良い。 |
5 | 品詞 | 名詞 | 省略する場合は*を指定。形態素解析の結果、品詞で何か判定するのであれば、適切なものを指定しておく。 |
6 | 品詞細分類1 | 一般 | 省略する場合は*を指定 |
7 | 品詞細分類2 | * | 省略する場合は*を指定 |
8 | 品詞細分類3 | * | 省略する場合は*を指定 |
9 | 活用型 | * | 省略する場合は*を指定 |
10 | 活用形 | * | 省略する場合は*を指定 |
11 | 原形 | 独自辞書 | 何らかの文字を記述しておかないとエラーで辞書が作成できない |
12 | 読み | 空白 | 省略する場合は空白にする |
13 | 発音 | 空白 | 省略する場合は空白にする |
ユーザー辞書のコピー
プロジェクトフォルダ配下にある「dic」フォルダの下に「ipadic」フォルダがあります。ここに作成したユーザー辞書をコピーしてください。
Visual Studioでプロジェクトをビルドしたタイミングで、辞書が丸ごとEXEファイルの出力先フォルダにコピーされます。
ユーザー辞書の参照設定
次はNMeCabから参照できるようにしましょう。
方法は2通りあります。1つは MeCabParam クラスにユーザー辞書を設定する方法、もう1つは App.config に記述する方法です。
MeCabParamによるユーザー辞書参照
MeCabParamのクラスにある UserDic プロパティでユーザー辞書を指定する方法です。
NMeCabは複数のユーザー辞書を使う事が可能なので、UserDic にも複数の辞書が指定できるよう、文字列配列を渡す仕様になっています。
MeCabTagger.Createの引数に param を渡すことで、ユーザー辞書を利用することができるようになります。
1 2 3 4 |
MeCabParam param = new MeCabParam(); param.UserDic = new string[] { "MyUser.Dic" }; var mecab = MeCabTagger.Create(param); |
ちなみに、DicDir というプロパティも持っており、全く別のフォルダにあるMeCabの辞書を使いたい場合、そのフォルダへのパスを指定します。ただし、環境によってはうまく動作しないがあるようで、私の環境では実行時に例外が発生しました。
DicDirを特に指定しない場合、デフォルトの値(dic\ipadic)で動作するようになっています。
App.configによるユーザー辞書参照
App.config でユーザー辞書を参照させる場合、<configSections>タグと、<applicationSettings>タグに次の内容を挿入します。
<configSections>タグについては、次の固定の内容を記述すればOKです。
1 2 3 4 5 |
<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>については、以下のタグを張り付ければ良いのですが、<value>~</value>のところに、ユーザー辞書の名前をカンマ区切りで列記して下さい。
例えば、MyDic1.dic、MyDic2.dic を指定する場合、次のようになります。
1 2 3 4 5 6 7 |
<applicationSettings> <NMeCab.Properties.Settings> <setting name="UserDic" serializeAs="String"> <value>MyDic1.dic,MyDic2.dic</value> </setting> </NMeCab.Properties.Settings> </applicationSettings> |
この<configSections>タグと、<applicationSettings>を App.config に挿入すれば終わりなのですが、おそらく皆さんのプロジェクトごとにApp.conifgの内容が違うと思います。
従って、皆さんの内容に応じて、適切な位置に挿入してください。
皆さんが、App.config を特に何も変更していない場合は、次の位置に挿入してもらえればOKです。
実際の挿入例は次の様になります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<?xml version="1.0" encoding="utf-8" ?> <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="UserDic" serializeAs="String"> <value>MyDic.dic</value> </setting> </NMeCab.Properties.Settings> </applicationSettings> <startup> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2" /> </startup> </configuration> |
まとめ
今回は NMeCabについて、インストール方法と使い方、辞書の登録方法について解説しました。
形態素解析を行うだけなら NMeCabをインストールするだけで事が足りますが、ユーザー辞書を使いたい場合は、本系の MeCabをインストールして、mecab-dict-index.exe を使ってユーザー辞書を作成してあげる必要があります。
また、MeCabParamクラスのUserDicプロパティを使うか、App.config にタグを記述するかの2通りの方法のどちらかで、ユーザー辞書を指定してあげると、NMeCabからユーザー辞書が使えるようになります。
NMeCabを使うと簡単に形態素解析が出来てしまうので、是非ご活用下さい。