ポンコツエンジニアのごじゃっぺ開発日記。

いろいろポンコツだけど、気にするな。プログラム&ロボット大好きなポンコツが日々の記録を残していきます。 自動で収入を得られるサービスやシステムを作ることが目標!!

【GAS】Google Apps Scriptで形態素解析をしてみよう!

Google Apps Script(以降、GAS)で形態素解析がしたいなって思ったのでやってみました。

形態素解析解析とは?

Wikipediaを調べると、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。とのことらしいです。 例えば、MeCabとかは有名な形態素解析エンジンかと思います。 macでMeCabを使おうと思ったら、以下のコマンドを実行するだけで導入ができます。

brew install mecab

ただ、GASだとそうはいきません。そんなコマンドとかライブラリはありません(自分が把握している限りでは)

Yahooの形態素解析のAPIを利用しよう

ということで、すぐに思いついたのは、外部のAPIを叩いて、そちらで解析してもらうもの。無料で簡単だったため、今回はYahoo!デベロッパーネットワーク日本語形態素解析APIを利用させていただきました。

ドキュメントはこちらになります。

developer.yahoo.co.jp

Yahooのアプリケーションの作成

YahooのAPIの利用ガイドはこちらに書いてあります。

developer.yahoo.co.jp

上記から、アプリケーションの種類がサーバーサイド(Yahoo! ID連携 v1)という形式で作成をします。作成できたら、アプリケーションIDというものが発行されるので、メモしておきましょう。下のスクリプト上で入力します。

実装してみる

さて、実装なのですが、このAPIの困ったところが、レスポンスの形式がXMLということ。JSONではないため、JavaScriptライクなGASだとなかなか扱いが難しいのです(個人的な感想)

function yahooTextSegmentation(text)
{
  var myAppid = '<アプリケーションIDをここにいれる>';
  var myUrl = "http://jlp.yahooapis.jp/MAService/V1/parse?appid="+myAppid+"&results=ma,uniq&sentence="+text;
  
  var myXml = UrlFetchApp.fetch(myUrl);
  var myDoc = XmlService.parse(myXml.getContentText());
  
  var namespace = XmlService.getNamespace("urn:yahoo:jp:jlp");
  var root = myDoc.getRootElement();
  var maResult = root.getChild("uniq_result", namespace);
  var wordList = maResult.getChild("word_list", namespace);
  var wordArray = wordList.getChildren("word", namespace);
  var surface = wordArray[1].getChild("surface", namespace);
  var array = [];
  for (var i=0; i < wordArray.length; i++) {
    array[i] = {
      'word':wordArray[i].getAllContent()[1].asElement().getText(),
      'reading':wordArray[i].getAllContent()[2].asElement().getText(),
      'pos':wordArray[i].getAllContent()[3].asElement().getText()
    };
  }
  
  return array;
}

var myAppid = '<アプリケーションIDをここにいれる>'; のところに、上でメモしたIDを入力しましょう。 また、このスクリプトの例では、リクエストパラメータのresultを解析結果の種類を "uniq": 出現頻度情報を uniq_result に返します。 と設定しているため、それ用のスクリプトになっています。uniqではなくmaだけにする場合は、項目が1つずつずれるはずなので、ログに出しながら調整をお願いします。

まとめ

このスクリプトを実行することで、文章を渡すことで、それぞれを単語単位で区切ったり、それぞれの品詞を得ることができるようになります。これでより自動化のなにかに使える気がしますね!