ikarosの作業場

飛行機の設計もできる系のCshaper。「なおこの記事は個人的見解であり、所属する組織の意見とは一切関係がありません」と書かざるを得なくなった悲しみを知れ

C#で日本語形態素解析-プログラム上で日本語を扱おう

更新頻度を上げたいだとか言って結局風邪をひいて更新ができなかったikarosです
まぁいいや、サァいくか

今回は特に書くこともないので形態素解析をやってみたいと思います。

まず形態素解析とは何ぞや?といいますと中学校の国語とか高校での古文でやるような品詞分解をプログラム上でやることと思ってもらって結構です。
原理についてはかなり複雑なので(本一冊書けそうなくらい)省略しますが、要はどっかのお偉いさんがそういうアルゴリズムを作っていて、そのメリットを我々一般ピープルが享受するという乞食しようじゃないかということなのです。

では実際に書いてみましょう。今回はDesktop版の方で書いていきます。

1.NMeCabで形態素解析してみる
NMeCabはPythonで使われているMeCabという形態素解析エンジンをC#用にアレンジしたもの
MeCabそのものはMac系のOSでは標準で用いられているエンジンなのでかなり信頼性が高いです

前置きはこの程度にしてNMeCabをプロジェクトに導入してみましょう

[1]NuGetからNMeCabをダウンロード
Visual Studioのソリューションエクスプローラーから参照設定を右クリック
→NuGetパッケージの管理をクリック

そして右上の検索から「NMeCab」を検索します
f:id:ikarostech:20150510213538p:plainf:id:ikarostech:20150510213516p:plain
同意すれば後は自動でインストールしてくれます

あとは プロジェクト内で「NMeCab」をインクルードすれば下準備は完了です
Windows store app用Visual Studioでは上記の方法ではインストールできませんが、
下記リンクから直接ファイルをダウンロードしそれを参照させればインストールができます
http://sourceforge.jp/projects/nmecab/releases/61078

ではコードを書いていきましょう

//形態素解析されるもとの文章
string text = "私はプログラマーです";

var tagger = MeCabTagger.Create();

//形態素解析を行い結果を記録
string result = mecabtagger.Parse(text);

このコードを実行すると次のような結果が得られるはずです

string result =
"私	名詞,代名詞,一般,*,*,*,私,ワタシ,ワタシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
プログラマー	名詞,一般,*,*,*,*,プログラマー,プログラマー,プログラマー
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
EOS";

なんとなく形態素解析の感触がつかめたでしょうか?

せっかくですのでもう一つ紹介したいと思います
2.Yahoo!デベロッパーネットワークを用いた形態素解析
Yahoo!が提供している形態素解析エンジンです。言語を問わずリクエストを送信すればXMLデータで結果を返してくれます。
精度も高く言語を問わないというのが魅力ですが、難点とすれば使う前に登録を行わなければならない点でしょうか。
登録についての詳細はこちらにあります→ご利用ガイド - Yahoo!デベロッパーネットワーク

さてコードはこんな感じ

public async Task<string> JMorphologicalAnalysis()
{
    const string text = "私はプログラマーです";
    //Yahoo!デベロッパーの機能を用いた解析
    var client = new HttpClient();

    //yahooから発行されるAPIID
    string apiid = "hogehoge";

    //送信先URL
    string postUrl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid=" + apiid + "&sentence=" + WebUtility.UrlEncode(text);

    var response = new HttpResponseMessage();
    response = await client.GetAsync(postUrl);
    string result = await response.Content.ReadAsStringAsync();

    return result;
}

以上!
予備校生にはGWはないのに五月病気味ですが頑張って更新はしていきたいと思います
がんばります

当サイトのソースコード及びその他の情報は個人・商用問わず自由に使っていただいてかかまいませんが、当サイトの情報が元で発生したいかなる結果・不利益については責任を負いかねますのでご了承ください