Excelファイルから形態素を抽出する(MeCab)

C#.net

Excelファイルから形態素を抽出する(MeCab)

Windows 10 / Visual Stadio Community 2019 / .NET Framework 4.7.2 / Python 3.9.8 / MeCab 0.996
Excelファイルの類似度検索は、Excelファイル(またはシート)の集合から、入力した文章または指定したExclシートと類似の高いものを検索する。これを行うために、事前に Excelファイルからテキストを抽出し、MeCabを利用した形態素解析を行い、形態素のデータセットを作成しておく。本章では、この部分の機能について説明する。
赤枠の検索処理は Excelファイルの類似度検索を行う において説明する。
下図は一連の機能を示したものである。本章で解説するのは、青い四角で囲まれた部分にあたる。
[構成図]

MeCabによる形態素解析

Windows版 MeCabと標準辞書 mecab-ipadic-neologd をインストールしておく。 Pythonスクリプトから MeCabの Taggerオブジェクトの parseメソッドを呼び出し、入力されたテキストを形態素に分解する。
解析結果:項目は品詞、活用、読みなど。詳細については Web上に色々記事が上がっているので参考にされたい。出力はプレーンテキストなので、必要な項目の読み込みや切り出しは文字列の操作により行うこと。

C#コードから Pythonスクリプトを実行する

Processクラスの Startメソッドにより python.exe を非同期に起動する。実行するスクリプトのパス名と引数は、Argumentsプロパティに設定する。Pythonスクリプトの標準出力(Print文による出力)は、StandardOutputプロパティから読み込むことができる。 この出力の完了を待つことによって、Pythonプロセスの完了と同期を取ることができる。

C#アプリケーション機能

[image1]
アプリケーションは、Excelファイルからテキストを抽出すると同じである。形態素解析はオプション機能となっている。(テキストの抽出処理が終わったあと、別個に処理することもできる)
テキストの抽出処理の結果作成された XMLファイルが形態素解析処理の入力となる。下記のテキストは、XMLレコードのうち解析処理に関連するテキスト部分を抜粋したものである。
形態素解析処理は、文章を単語に分割し、固有名詞を含む名詞だけを選び、空白を区切り文字にした文字列にする。Excel文書を特徴づける品詞として、ここでは名詞のみに着目した。動詞も重要な品詞だと考えるが、動詞の活用をどう扱うか悩むところなので、差し当たり除外した。
出力は、Excelファイル名、シート名をインデックスにした辞書レコードのリストとする。このファイルが文書の類似度検索の入力となる。
上記の XMLレコードを解析した結果が次の JSONテキストである。面白いのは "吾輩は猫である" が固有名詞として認識されることである。これは辞書の定義による。
リストをJSONテキストとして出力するには、Pythonの json.dumpを使用する。 Excelのテキストは Shift-JIS(正確にはMS独自拡張の cp932)であるが、これを出力時に UTF-8に変換している。Shift-JISのままだと変換できないコードがあるからである。
JSONテキストを出力する代わりに、pickle.dumpでバイナリデータを出力するという方法もある。中身の確認はできない難点はあるが、こちらの方が速いかもしれない。

ソースコード

Pythonスクリプト

analyze.py 形態素解析により XMLファイルに格納されたテキストから名詞を抽出する

C#プログラム:

アプリケーション「Excelファイルからテキストを抽出する」と同じ
Form1.cs User Interface
DataManager.cs テキスト抽出処理
DataManager2.cs テキスト抽出処理(partial class)
ComObject.cs COMオブジェクトラッパー
OfficeInfo.cs XMLレコード定義