しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

NMeCab と NuGet を使って手軽に形態素解析を試した

Azure Search で久しぶりに形態素解析周りが気になったので MeCab でも使うかと思って調べると、今は C# で実装された NMeCab というライブラリがあるんですね。

よくあるラッパーじゃないので使い勝手が良いですし、パフォーマンスも中々良好です。

残念ながら公式ではないですが、NuGet にパッケージが登録されているので、こっちからサクッとインストールすることも可能です。実際に NuGet を使ってインストールしました。

インストールすると dic ディレクトリが追加されます。中に IPADIC が入ってます。当然ながら形態素解析をする上で必要な辞書なので、実行時にはコピーする必要があるので注意。*1

f:id:shiba-yan:20150307200008p:plain

NMeCab のサンプルコードは色々と見つかるので、とりあえず一番シンプルな使い方を試します。

static void Main(string[] args)
{
    var mecab = MeCabTagger.Create();

    var node = mecab.ParseToNode("ASP.NET とメイドさんが大好きなプログラマーのブログ");

    while (node != null)
    {
        Console.WriteLine(node.Surface + "\t" + node.Feature);

        node = node.Next;
    }
}

MeCabTagger を作成して Parse するだけです。シンプルですね。

このブログの説明文を形態素解析にかけます。実行結果は以下のようになりました。

f:id:shiba-yan:20150307195735p:plain

ASP.NET が辞書に含まれていないので ASP と . と NET に分解されてしまいましたが、製品名は仕方ないかなと思いました。それ以外は問題なく形態素に分解できました。

この NMeCab ですが、依存するライブラリも特にないため、本体と辞書だけあれば Raspberry Pi 上の Mono 環境でも問題なく動作します。

f:id:shiba-yan:20150307201557p:plain

辞書が読み込めないエラーになった場合は、パス区切り文字としてバックスラッシュがハードコーディングされているのが原因なので、App.config で設定しなおしてあげれば動きます。

<?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="DicDir" serializeAs="String">
        <value>./dic/ipadic</value>
      </setting>
      <setting name="UserDic" serializeAs="String">
        <value />
      </setting>
    </NMeCab.Properties.Settings>
  </applicationSettings>
</configuration>

バックスラッシュをスラッシュに変えるだけで問題なく動くようになります。Twitter bot などを Raspberry Pi の crontab を使って定期的に実行したり出来そうです。

*1:特に Websites とかにデプロイする場合など