GAE/jからYahooAPIの形態素解析を利用してみた
(20110108追記)この記事は過去のブログからインポートした物です!
概要
「形態素解析って何?」という方は、今ならウェールズ氏のどや顔も楽しめる、以下を参考にどうぞ。
形態素解析 - Wikipedia
さて、現在、twitterのbotをGAE/j上で作っている訳ですが、賢い応答をさせる為には文章の形態素解析を行う事が必要不可欠です。
しかし、問題はそれをどう行うかです。自分で書くには、言語学の勉強から始めないといけませんし、ライブラリを使おうにもGAE/jにアップするにはサイズが大きすぎます。(もっとも、自力でライブラリを分割された事例もありますが……*1)
何か他の方法は無いかと探しますと、実は有ります。それが、Yahoo!デベロッパーネットワークからWeb APIの形で提供されている、日本語形態素解析です。このサービスは、HTTPでリクエストを受け付け、XML形式で結果を返してくれます。
Yahoo!デベロッパーネットワーク - テキスト解析 - 日本語形態素解析
一方、GAE/jではHTTP又はHTTPSで外部サイトと通信できる、URL Fetch Java APIが提供されています。
The URL Fetch Java API - Google App Engine - Google Code
これらを組み合わせる事で、APIを通して別々のサービスが連携して働く、現代的なシステムが組めそうです。
そういう訳で今回、GAE/jからYahooAPIを呼び出し、返されたXMLを処理して必要な情報を取り出す所までを、実際にやってみました。
尚今回は、XMLの解析にJDOMを利用しました。こちらも、GAE/jで動かす場合にはほんの一手間必要となるので、合わせて記述します。
GAE/jでservletを定期的に実行して、twitterを検索
(20110108追記)この記事は過去のブログからインポートした物です!
cron.xmlによる自動実行と直接実行の禁止
GAE/jを利用して、servletを定期的に実行する方法に関するメモ。
この際、自動実行対象が管理者以外に実行されない様にする事も可能。
詳しくは以下のGoogle公式ドキュメントで。
Java 用の cron を使用したスケジュール タスク - Google App Engine - Google Code
尚、上記公式ドキュメントを見る限り、cronジョブのアップロードには何か特別なコマンドを使う様だが、netBeans6.9.1+GAE pluginの環境*1では、特にそれを意識する必要は無かった。
searchAPIの回数制限とGAE
twitterの検索に関しては、以前の記事*2を参照。
twitterのsearchAPIはアクセス元IPアドレスでRateLimitを判定する。しかしどうやら、GAE/jからこれを実行する場合、全てのユーザが同一IPを使用する事になるらしい。結果として、かなり高い頻度でRateLimitオーバーが起こる*3。
一応、twitter側もこの問題は認識しているようで、アクセス可能回数を問い合わせると、一時間あたり20000回という非常に大きな結果が得られる。それでもやはり、RateLimitオーバーは避けられない。
現在製作中のtwitter botアプリケーションでは、検索結果はそれほど重要視していない為、このまま運用していく事とした。
GAE/j上でtwitter4jを使ってtwitterAPIを利用する
(20110108追記)この記事は過去のブログからインポートした物です!
はじめに
今回は、Google App Engine for Java(以下GAE/j)からtwitterAPIを利用して、tweetの投稿を行おうと思う。ただし、偉大なる先人により、GAE/jからでもtwitterAPIを利用できるライブラリが公開されている為、
Twitter4J - A Java library for the Twitter API
今回はこのライブラリを利用させて頂き、まずはそのサンプルコードをGAEjava上で実行してみる。
尚、今回の内容を進める間に何度か、ローカルのテスト環境で503エラー(SERVICE_UNAVAILABLE)が発生した。これはプロジェクトの作り直しやPCの再起動などで解決してしまったので、原因不明で再現性無しという、なんとも気持ち悪い結果となってしまった。もしも同じ症状になった方がいましたら、僕に変わって原因を調べて下さい。……え?
(10/18追記)この503エラーでは、そもそもGAE公式サンプルのゲストブックすら動かない、かなり不思議な状態になっていました。その辺りも含めて、原因の分かる方がいましたら、コメント欄などにご一報下さい(追記ここまで)