C#で形態素解析をしてみる
C#で形態素解析をしてみる
以前スクレイピングのコードを自作してみるにて、C#でスクレイピングを行うコードを紹介しました。
今回は、そのコードを活用し情報を集めるプログラムを作成したので集めた情報を活用するべく、形態素解析を行い単語ごとに区切るプログラムの作成をしました。
スクレイピングもそうなのですが、形態素解析も普通はPythonを使用することが多いと思いますが、せっかくなので今回もC#を使用して作成を行おうと思います。
「形態素解析、ライブラリ」で検索を行うとjanomeやmecabなどがよく出てくると思います。私も以前Pythonで形態素解析のプログラムを作成したときはjanomeを使用しました。ですがそもそもPythonが書きづらく、少しのコードでも時間がかかりました。。。
今回はC#を使用するので、「C#、形態素解析」などで検索し、上位にあったMecabを使用することにしました。
コーディング
私はコーディングにVisualStudioを使用しているので、NuGetからインストールを行いました。
プロジェクトタブからNuGetパッケージ管理を選択し、表示される画面にて、Mecab.DotNetと検索し、インストールします。
これで下準備は完了です。
いよいよコーディングですが、今回形態素解析後に収集するものは名詞のみにしております。 形態素解析解析を行う機能は、引数を対象の文字列、戻り値を分解後にカンマ区切りで接続した文字列としたメソッドを作成しました。この方が複数の文字列を分解するとに楽なので。
private static string ExtractionNoun(string text) { string resultText = ""; var tagger = MeCabTagger.Create(); foreach (var node in tagger.ParseToNodes(text)) { if(0 < node.CharType) { if(node.Feature.Contains("名詞")) { resultText += node.Surface + ","; } } } return resultText.TrimEnd(','); }node.Featureで分解した結果が何詞であるかなどの情報を保有しています。そのためnode.Featureに対して、抽出したい品詞を含むかどうかの処理を入れることで、指定した品詞のみの語句を取り出すことができます。
また、node.Surfaceは分解したときの語句を取り出すことができます。今回は分解した語句をカンマ区切りで文字列結合し、入手しています。後続の処理によってはListなどに追加するなどの変更を入れても良いと思います。
入手した語句の処理
先ほどのメソッドを使うことで語句を分解できますが、この形態素解析には少し問題があります。それは明らかに不要な語句が混ざってしまうのです。
例えば、「○○人」などが多く含まれる文字列を分解すると「人」の語句を抽出してしまいます。つまり「年」「人」「個」などのそれ単体では意味が少ない語句が大量に抽出されてしまいます。
そのため、事前にこのような語句を対象外にするようなクラスを作成し、最終結果に含まれないようにする必要があります。
今回は、NGWordクラスを作成し、CheckNGメソッドを利用することで該当する単語を除外することができるようになっています。ngWordListは除外対象の語句をまとめたリストです。
public bool CheckNG(string str) { bool b = false; if (Regex.IsMatch(str, @"^[\d]+$")) { return true; } foreach (string ngStr in ngWordList) { if (str == ngStr) { b = true; break; } } return b; }
まとめ
今回はC#で形態素解析を行うプログラムを作成しました。前回のスクレイピング用のプログラムと合わせて使用できるプログラムをGitにアップしております。Gitはこちら
まだ分解した後のデータをどう活用するかを決められていませんが、活用できるようなプログラムを作成していきたいと思います。
今回はこの辺で、ではまた!!
コメント
コメントを投稿