はじめに
MATLAB上でとあるExcelファイルを処理しようと思って探していたら、こんなビデオにたどり着きました。
Getting Started: Excel Add-ins Using MATLAB Compiler
Excelの関数(アドイン)をMATLABで作成できるようです。直接的に探していた内容ではないのですが、マクロが苦手な私に朗報だったので早速試してみました。
環境
MATLAB R2020a
Text Analytics Toolbox
MATLAB Compiler
試したこと
下図のように、Excelの中で使えるmySummarizeという関数を作成しました。(表示されているテキストデータの出典:青空文庫 陽気な客[1])
上記の関数をExcel内で実行することで、こんなワードクラウドが表示されます。
mySummarize内の処理
後からのセクションで詳しく説明しますが、内部処理はMATLABで記載し、その後ひと手間を加えてExcel関数にしています。今回は返り値がなく、単純に表示をさせる関数を作成してみました。返り値がある関数も作成できるようです。
【mySummarize関数の処理フロー】
①データ型のチェック、および、array配列への変換
Excelのセル1つだけを選択するとchar型、2つ以上を選択するとcell型だったので、それぞれarrayに変換させています。それ以外の型は追いきれなかったので、とりあえず'Unsupported data type'としています。
②トークン化
tokenizedDocument関数を使用しています。
③句読点の削除、および、ストップワードの削除
erasePunctuation関数とremoveStopWords関数を使用。
④文書のサマリー取得
extractSummary関数を使用。MATLAB R2020aから新しく出たの機能のようです。
⑤ワードクラウドの表示
wordcloud関数を使用。
それでは、この後のセクションで、どのようにExcel上の関数を作成したのか、手順をご紹介します。
Excel関数を作成する方法
1.MATLAB上で関数を記載
いつもの要領でMATLAB関数を作成します。このMATLAB関数の名前が、Excel上の関数名になるようです。
function mySummarize(str)
%MYSUMMARIZE この関数の概要をここに記述
if isa(str,'cell')
str = cell2table(str);
str = table2array(str);
elseif isa(str,'char')
str = cellstr(str);
str = cell2table(str);
str = table2array(str);
else
error('Unsopported data type');
end
document = tokenizedDocument(str);
document = erasePunctuation(document);
document = removeStopWords(document);
summary = extractSummary(document);
figure;
wordcloud(summary);
end
2.ライブラリコンパイラアプリを使ってExcelアドインを作成
こちらのページの手順を参考に、Excelアドインを作成します。
実際に試してみた学びとして、
・MATLAB Runtimeが必要
・Microsoft Visual Studioが必要
筆者は2017を入れていますが、それ以外のバージョンでもOKだと思います。
・Microsoft Visual Studio 2017 for Use with Intel Compilersなるものが必要
バージョンは2017でなくてもOKだと思いますが、筆者は2017を入れていたのでこのように記載しています。こちらのインストラクションを参考にしました。
・エクセルのマクロのセキュリティ設定を下げる必要がある
・Excelが立ち上がっている状態でコンパイルを試みるとエラーになった
などなどがありましたが、こちらのエラーと解決策のページに色々とトラブルシューティングが載っているので、ご参考にされると良いかと思います。
どこでエラーになっているのかは「ログファイル」を選択することで確認できます。
3.作成された.xlaファイルをドラッグ&ドロップ
まず、解析したいエクセルファイルを開きます。
次に、ターゲットフォルダーの場所にfor_redistribution_files_onlyというフォルダが作成されると思いますので、その中の.xlaファイルを、最初に開いたエクセルファイル上にドラッグ&ドロップします。
セキュリティ警告のようなボタンが出ましたがOKを押します。これで、mySummarizeという名前のExcel関数を使えるようになります。
応用編
Google翻訳にアクセスするアプリ
以前の自分の記事を応用してmyGoogleTranslate関数を作成。
function str = myGoogleTranslate(text)
%MYGOOGLETRANSLATE この関数の概要をここに記述
baseurl = 'https://script.google.com/macros/s/AKfycbweJFfBqKUs5gGNnkV2xwTZtZPptI6ebEhcCU2_JvOmHwM2TCk/exec';
source = 'ja';
target = 'en';
url = [baseurl '?text=' text '&source=' source '&target=' target];
options = weboptions('Timeout',15); % 任意で設定
str = webread(url, options);
end
結果はこちら。
webを経由するやつも作れるんですね。これは意外と便利かもしれない!
終わりに
結構長いことMATLABを使用していましたが、こんな機能あったのかと驚きでした。今回の機能に対応していない関数のリストがありましたが、こう見ると、結構なんでもコンパイルできそうに見えます。
ExcelとMATLABのいいとこどりができたら良いですね。
参考文献
[1] 山本周五郎 著 「陽気な客」https://www.aozora.gr.jp/cards/001869/card57784.html