機械学習で分類問題を手軽に解くのに、GoogleスプレッドシートのアドオンであるSmart Autofill(スマート・オートフィル)がありますが、日本語を扱うために工夫が必要だったので、そのメモです。
Smart Autofillを利用する
Smart Autofillは、GoogleのPrediction APIを手軽に利用できるGoogleスプレッドシートのアドオンです。
スプレッドシートデータから学習した結果を使い、歯抜けになっている空白セルに入るべき値を予測して埋めてくれます。
Smart Autofillの入門ガイドには、多言語で入力されたテキストが、英語、スペイン語、フランス語のいずれであるかを自動補完するサンプルがあるのですが、これと同じことを日本語でも行うには、形態素解析をしておく必要がありました。
日本語を扱うための形態素解析
スプレッドシート上で形態素解析(分かち書き)を行うには、いくつか方法がありそうでしたが、てっとり早くYahooデベロッパーネットワークの日本語形態素解析APIを使用しました。
YahooAPIの分かち書きは便利です。抽出した単語を品詞ごとにフィルタリングできます。利用制限も1日あたり50000リクエストまでいけるので、何かお試しするには十分です。
スプレッドシートのメニューから、スクリプトエディタを開き、以下のソースを入力します。
function myFunction(text)
{
var appid = "自分のアプリケーションID";
var filter = "1%7C2%7C3%7C4%7C5%7C6%7C7%7C8%7C9%7C10"; // 名詞やら動詞やらを指定しています
var url = "http://jlp.yahooapis.jp/MAService/V1/parse?appid="+appid+"&results=ma&sentence="+text+"&filter="+filter;
var namespace = XmlService.getNamespace("urn:yahoo:jp:jlp");
// APIを呼ぶ
var xml = UrlFetchApp.fetch(url);
// XMLをパース
var document = XmlService.parse(xml.getContentText());
var entries = document.getRootElement();
var ma_result = entries.getChild("ma_result", namespace);
var word_list = ma_result.getChild("word_list", namespace);
var word = word_list.getChildren("word", namespace);
var ret = "";
for (var i = 0; i < word.length; i++) {
// スペース区切りで抽出
ret += word[i].getAllContent()[0].asElement().getText() + " ";
}
return ret;
}
スクリプトを保存したら、セル内で以下のように関数が使えるようになります。
=myFunction(A1)
filterパラメータには、フィルタリングしたい品詞を設定できます。フィルタリングが不要の場合は、パラメータを設定しなければOKです。
今回は、引越し侍で収集しているお客様からの口コミ文章をカテゴライズすることが目的だったので、日本語文章内の句読点や助詞などは不要かなと思って省く設定にしてみました。
filterに指定可能な品詞番号
品詞番号 | 品詞名 |
---|---|
1 | 形容詞 |
2 | 形容動詞 |
3 | 感動詞 |
4 | 副詞 |
5 | 連体詞 |
6 | 接続詞 |
7 | 接頭辞 |
8 | 接尾辞 |
9 | 名詞 |
10 | 動詞 |
11 | 助詞 |
12 | 助動詞 |
13 | 特殊(句読点、カッコ、記号など) |
まとめ
はじめ何も考えずに、そのままの日本語文章をSmart Autofillしてみたところ、うまくカテゴライズしてくれなかったのですが、よくよく考えたら、そりゃ分かち書きが必要だよねと思い、形態素解析したデータに対して実行してみたところ、いい感じでカテゴライズしてくれるようになりました。
実際に運用するには、Prediction APIを使ってプログラミングするほうが良いと思いますが、まずはどれくらいのクオリティで自動補完してくれるかのテストには、お手軽に試せるSmart Autofillはとても便利でした。