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ファイルの類似度検索を行う において説明する。
下図は一連の機能を示したものである。本章で解説するのは、青い四角で囲まれた部分にあたる。
![[構成図]](/dot_net/11/ExcelAnalyzer5.png)
MeCabによる形態素解析
Windows版 MeCabと標準辞書 mecab-ipadic-neologd をインストールしておく。 Pythonスクリプトから MeCabの Taggerオブジェクトの parseメソッドを呼び出し、入力されたテキストを形態素に分解する。
解析結果:項目は品詞、活用、読みなど。詳細については Web上に色々記事が上がっているので参考にされたい。出力はプレーンテキストなので、必要な項目の読み込みや切り出しは文字列の操作により行うこと。
C#コードから Pythonスクリプトを実行する
Processクラスの Startメソッドにより python.exe を非同期に起動する。実行するスクリプトのパス名と引数は、Argumentsプロパティに設定する。Pythonスクリプトの標準出力(Print文による出力)は、StandardOutputプロパティから読み込むことができる。
この出力の完了を待つことによって、Pythonプロセスの完了と同期を取ることができる。
C#アプリケーション機能
![[image1]](/dot_net/11/image1.png)
アプリケーションは、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レコード定義