Google Apps Script(以降、GAS)で形態素解析がしたいなって思ったのでやってみました。
形態素解析解析とは?
Wikipediaを調べると、文法的な情報の注記の無い自然言語のテキストデータ(文)から、対象言語の文法や、辞書と呼ばれる単語の品詞等の情報にもとづき、形態素(Morpheme, おおまかにいえば、言語で意味を持つ最小単位)の列に分割し、それぞれの形態素の品詞等を判別する作業である。とのことらしいです。 例えば、MeCabとかは有名な形態素解析エンジンかと思います。 macでMeCabを使おうと思ったら、以下のコマンドを実行するだけで導入ができます。
brew install mecab
ただ、GASだとそうはいきません。そんなコマンドとかライブラリはありません(自分が把握している限りでは)
Yahooの形態素解析のAPIを利用しよう
ということで、すぐに思いついたのは、外部のAPIを叩いて、そちらで解析してもらうもの。無料で簡単だったため、今回はYahoo!デベロッパーネットワークの日本語形態素解析APIを利用させていただきました。
ドキュメントはこちらになります。
Yahooのアプリケーションの作成
YahooのAPIの利用ガイドはこちらに書いてあります。
上記から、アプリケーションの種類がサーバーサイド(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つずつずれるはずなので、ログに出しながら調整をお願いします。
まとめ
このスクリプトを実行することで、文章を渡すことで、それぞれを単語単位で区切ったり、それぞれの品詞を得ることができるようになります。これでより自動化のなにかに使える気がしますね!