【MS Access】VBAで 形態素解析 に挑戦

MS Access
スポンサーリンク

今回は業務の自動化といった主旨から変えて、VBAで形態素解析の実装方法を紹介します。

形態素解析ってなに?

自然言語を解析して、形態素と呼ばれる言葉の最小単位まで分解し、その単語ごとに名詞や品詞などに分類していく作業です。

例えば「私は海に行きます。」という文章に対して、以下のように単語ごとに分割する作業です。

私 / は / 海 / に / 行き / ます /  。

それぞれの単語が形態素です。これらには名詞や品詞、品詞なら更に詳細な区分けまでを判別します。ただ、例えば日本語の場合は、文章を単語ごとにスペースを開けて記述する仕組みでは無いため、その文章を機械的に解析するのは非常に大変です。また、英語の場合は単語ごとにスペースを区切りますが、スペースで分けられても特定の単語が組合わさることで別の意味になる言葉は多くあり、やはり解析は簡単ではありません。

詳しくはWikipediaの記事を参考にしてください。

Wikipedia 形態素解析

文章を分割して解析する意味

世の中には大量の様々な文章がテキストデータとして保存されています。当ブログのようなインターネット上のウェブページや掲示板サイトの投稿、企業内のデータであればコールセンターの対応履歴データや営業報告書データ。

このような大量のテキストデータから単語を抜き出して、特定の傾向や単語毎の関連性を見出だしたり、特定の単語の発生頻度を数えたり、様々な分析が行えます。

例えばコールセンターの対応履歴であれば、データから名詞だけを抜き出して月毎に集計し、どの様な問い合わせが多いのかを分析し、その分析結果を踏まえて、従業員のマニュアルを見直したり、新しい商品やサービスの開発時の改善内容として加味させることができます。

身近な例で言えば、Googleの検索エンジンでも使われていますし、パソコンやスマホで文字を入力する際の漢字変換などでも使われています。

上記の内容も踏まえ、今回はAccess VBAでテキスト化された文章を形態素解析して、Access内のローカルテーブルに解析結果を格納するところまでを実装します。

■実装手順

1.動作環境構築

今回は形態素解析のエンジンとしてMeCab(めかぶ)を利用します。

また、そのMeCabを.NETを介してVBAから呼び出せるようにしてくれた優しい人が居るので、その方の提供してくれた環境をインストールします。

よって、まずは以下のページを参考にインストーラーの取得、及びインストールを行ってください。

VBAやVBScriptで形態素解析を行う方法 Qiita

2.Accessのローカルテーブル作成

解析結果を格納するためのテーブルをAccess内に作成します。※当テーブルではMeCabの出力項目の一部しか格納しませんが、以下のフィールド項目以外にも有益な解析結果が取れるので、ご自身の用途によって調整してください。

テーブル名:
形態素解析

フィールド項目:
1.ID(オートナンバー型) ←別に無くても良いけど、一意でレコードを特定出来ないテーブルは気持ち悪いので。
2.文字列(テキスト型) ←形態素を格納します。
3.品詞種類1(テキスト型) ←品詞種類を格納します。
4.品詞種類2(テキスト型) ←品詞の細かい分類名を格納します。
5.品詞種類3(テキスト型) ←品詞の細かい分類名を格納します。

3.新規プロシージャを作成

新規プロシージャを作製し、以下のコードを貼り付けます。

Sub Morphological_Analysis()

    Dim t As New NmcTagger
    Dim c As NmcNodeCollection
    Dim p As New NmcParam
    Dim i As Long
    Dim strSQL As String
    Dim ArrFeature() As String
    Dim Sentence As String
    Dim TargetSentenceFile As String
    Dim intNo As Integer
    Dim strBuff As String
    
        '解析対象文章のテキストファイルを指定します。
        TargetSentenceFile = "解析対象のテキストファイルのフルパス"
        
        '対象のテキストファイルを開きます。
        intNo = FreeFile()
        Open TargetSentenceFile For Input As #intNo
        
        '辞書ファイルのパスを指定します。※無くても動くが精度向上の為あると良い。
        p.DicDir = "辞書ファイル格納フォルダのパス"
        
        Call t.Create(p)
        
        DoCmd.SetWarnings False
        
        Do Until EOF(intNo)
        
            Line Input #intNo, strBuff
            Sentence = strBuff
            
            Set c = t.Parse(Sentence)
            
            '配列0は全文字列が格納されている為1から開始
            For i = 1 To c.Count - 2
                '解析結果を配列に格納
                ArrFeature = Split(CStr(c.GetItem(i).Feature), ",")
                
                strSQL = "INSERT INTO 形態素解析(文字列,品詞種類1,品詞種類2,品詞種類3) VALUES (" & """" & c.GetItem(i).Surface & """" & "," & _
                    """" & ArrFeature(0) & """" & "," & """" & ArrFeature(1) & """" & "," & """" & ArrFeature(2) & """" & ")"
                
                DoCmd.RunSQL strSQL
            Next
        Loop
        
        DoCmd.SetWarnings True
        
        Close #intNo
        
        MsgBox "形態素解析処理が終了しました。"

End Sub

尚、22行目の辞書ファイルについては後述しますが、もし使わないならコメントアウトしてください。

4.参照設定を追加

項番1でインストールしたMeCabをVBAから参照できるように参照設定に「NMeCabCom」を追加します。

5.解析対象のテキストファイルを用意

テキストファイルの中身は何でも結構ですが、例えば青空文庫なんかはどうでしょうか?

青空文庫

青空文庫から適当なZIPファイルをダウンロードして解凍すると、選択した作品にもよりますが、ある程度の文字数の有るテキストファイルが取得できたかと思います。今回はこれでいきましょう。

6.解析処理の実行

作製したプロシージャを実行して見ましょう。

サンプルコードで指定した解析対象のテキストファイルが適切に配置されていれば正常に動くはずです。

解析処理が完了すると、ローカルテーブルの「形態素解析」テーブリ内にデータが作成されます。後は集計クエリでフィールド「文字列」をgroup化してカウントするなど色々試してみてください。

因みにスペックの低いPCで実行すると結構処理中に落ちるので、ある程度のスペックのPCで検証することをおすすめします。

後、実行してみるとわかりますが、辞書ファイルで補完しないと、人物名を上手く認識出来なかったり、若干解析精度が物足りないです。その為、以下のリンクから辞書ファイルをダウンロードしてMeCabに読み込ませると良いかと思います。

MeCab用 IPA辞書

上記リンク先のページの「IPA辞書」のダウンロード用リンクからダウンロードしてください。

尚、AccessではS-JISでデータを扱う為、辞書ファイルの文字コードがS-JIS以外だとテーブルに格納した解析結果の文字列が文字化けします。この辺りの対処方法は追々どこかで紹介していければと思っています。

↓↓の記事も併せてどうぞ

【RPA】その作業はRPAじゃないと自動化できませんか?
世の中は数年前からRPA(ロボティック・プロセス・オートメーション)が非常に注目を集めています。当ブログではVBScriptやVBAといった「枯れた」技術ばかり取り上げていますが、たまには目新しい話題にも触れておこうと思います。 始め...
タイトルとURLをコピーしました