SlothLibの使い方(NLP)

SlothLibの機能のうち、SlothLib.NLP名前空間の機能を 利用する方法について解説します。ここでは特に、形態素解析器であるMeCabの使い方と、その結果から目的とする品詞の語だけを取り出す方法、さらに文字列の全角・半角を変換する方法などを解説します。

NLP名前空間などの参照

実践解説/入門」を参考にして新しいプロジェクトを作成し、dllを参照します。

ここでは、SlothLib.NLP.Base.dll と SlothLib.NLP.JapaneseMorphologicalAnalyzer.dll と SlothLib.NLP.Filter.dll を参照します。

SlothLib.NLP.Base.dll にはNLPの基本となるクラスが、SlothLib.NLP.JapaneseMorphologicalAnalyzer.dll にはChaSenやMeCabといった日本語形態素解析器を利用するためのクラスが、SlothLib.NLP.Filter.dll には形態素クラスから文字列への変換や、文字列から文字列への変換を行うフィルタのクラスが含まれています。

SlothLibからMeCabを利用するためには、事前にMeCabをインストールしておく必要があります。 インストール方法については「外部プログラム/MeCab」を参照してください。

文章をMeCabで解析し、目的の品詞の語だけを取り出して出力するアプリケーションの作成

コンポーネントの設置

  1. まず、TextBox を2つ、Button を1つフォームに貼り付けます。TextBox は文字列の入力と出力に、Button は処理を開始するために使います。
    1.png
    TextBox で複数行の入力・表示をするためにTextBoxのMultilineプロパティをtrueに変更して下さい。
    2.png

ボタンを押した時の処理の設定

今回は入力したテキストを形態素解析し、名詞と動詞だけを取り出してその原形を1行ずつ出力することにします。また、出力する際には英数字を半角に、半角カタカナを全角に変換する処理も行います。

  1. ボタンを押した時の処理を書くには、まずフォームデザイナでボタンをダブルクリックします。
    4.png
  2. イベントハンドラが自動的に作られるので、ここに処理を記述します。全体のコードの中身は次のようになります。
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    using SlothLib.NLP;
    
    namespace NLPTutorial
    {
        public partial class FormNLPTest : Form
        {
            public FormNLPTest()
            {
                InitializeComponent();
            }
    
            private void button1_Click(object sender, EventArgs e)
            {
                //MeCabクラスのインスタンスを作成
                MeCab meCab = new MeCab();
                //textBox1に入力されたテキストをMeCabで形態素解析
                MeCabResult meCabResult = meCab.DoAnalyze(textBox1.Text);
    
                //形態素解析した結果に適用するフィルタを作成
                PosFilter posFilter = new PosFilter("名詞|動詞"); //名詞と動詞のみを取り出す
                RemainOriginalFilter remainOriginalFilter = new RemainOriginalFilter(); //原形だけを残す
                //英数字を半角に、半角カナを全角にする
                AlphaDigitToNarrowHalfKanaToWideFilter halfWideFilter = new AlphaDigitToNarrowHalfKanaToWideFilter();
    
                //作成したフィルタを適用していく
                IMorpheme[] morphemes = posFilter.DoFilter(meCabResult.Morphemes);
                string[] strings = remainOriginalFilter.DoFilter(morphemes);
                strings = halfWideFilter.DoFilter(strings);
    
                //結果をtextBox2に出力
                StringBuilder stringBuilder = new StringBuilder();
                foreach (string str in strings)
                {
                    stringBuilder.AppendLine(str);
                }
                textBox2.Text = stringBuilder.ToString();
            }
        }
    }

コードの説明

  1. まず、MeCabクラスのインスタンスを作成します。
    MeCab meCab = new MeCab();
  2. MeCabクラスのインスタンスのDoAnalyzeメソッドを実行すると、MeCabResultという結果クラスが返ってきます。
    MeCabResult meCabResult = meCab.DoAnalyze(textBox1.Text);
    ここでは、textBox1という名前のTextBoxに入力された文字列を形態素解析しています。
  3. 次に、目的の結果を得るためのフィルタを作成します。
    PosFilter posFilter = new PosFilter("名詞|動詞");
    RemainOriginalFilter remainOriginalFilter = new RemainOriginalFilter();
    AlphaDigitToNarrowHalfKanaToWideFilter halfWideFilter = new AlphaDigitToNarrowHalfKanaToWideFilter();
    PosFilterは、目的に合致する形態素だけを取り出すフィルタです。ここでは名詞または動詞を取り出すように設定しています。RemainOriginalFilterは、形態素クラスの配列を、形態素の原形を格納した文字列配列に変換するフィルタです。AlphaDigitToNarrowHalfKanaToWideFilterは文字列を与えると、英数字を半角に、半角カタカナを大文字に変換するフィルタです。
  4. フィルタを作成したら、順に適用していきます。フィルタを適用するには、作成したフィルタのDoFilterメソッドを実行します。まずはPosFilterを適用します。
    IMorpheme[] morphemes = posFilter.DoFilter(meCabResult.Morphemes);
    PosFilterには形態素クラスの配列を引数として与えます。先ほど得られた形態素解析の結果クラス(MeCabResultクラス)のMorphemesプロパティで形態素クラスの配列を得ることができるので、これを引数として与えます。結果としては形態素クラスの大本であるIMorphemeというインターフェースの配列が返ってきます。
  5. 次に、RemainOriginalFilterを適用します。
    string[] strings = remainOriginalFilter.DoFilter(morphemes);
    RemainOriginalFilterは、IMorphemeの配列を与えると、stringの配列を返すフィルタです。この文字列配列には各形態素の原形が入っています。SlothLibにはこの他にも、形態素の出現形(表層形)を文字列配列にして取り出すフィルタなども用意されています。
  6. 最後に、AlphaDigitToNarrowHalfKanaToWideFilterを適用します。
    strings = halfWideFilter.DoFilter(strings);
    このフィルタは文字通り、英数字を半角に、半角カタカナを全角にするフィルタです。引数、返す値ともに文字列配列です。
  7. ここまで目的の結果が得られたので、最後にTextBoxに表示します。
    StringBuilder stringBuilder = new StringBuilder();
    foreach (string str in strings)
    {
        stringBuilder.AppendLine(str);
    }
    textBox2.Text = stringBuilder.ToString();
    ここでは、得られた文字列配列を一行ずつTextBoxに出力しています。

実行例

  1. 実際に実行した例は次のようになります。
    5.png

添付ファイル: file5.png 461件 [詳細] file4.png 430件 [詳細] file3.png 439件 [詳細] file2.png 440件 [詳細] file1.png 439件 [詳細]