2011年05月30日

Twitterのbotを作ってみる【マルコフ連鎖を使ってみる編】

日本語を話すbotなら形態素解析したいよね!ということで、よくある「マルコフ連鎖」を使ったbotを作ってみました。
元データとして自分の今までのツイートのログを使い、形態素解析してマルコフ連鎖で文章を作るようにします。

形態素解析はMeCab+IPA辞書を使用しています。
気を付けたのは以下の点

・あまり突飛な文章にならないようにする→3次のマルコフ連鎖にする
・他人の文章は使用しない→「RT 」「QT 」などで始まる引用文は削除する
・他ユーザ名(@〜)やハッシュタグ「#〜」、URLは削除する
・文章の始まり、終わりは日本語らしいものにする
 (「な人がいたので私の」みたいな明らかな断片にならないよう、主語〜述語の形を取るようにする)

3次のマルコフ連鎖の作り方は、MeCabとPythonでマルコフ連鎖を書いてみる(改)を参考にして、リストを作る単語の数を3つにしてみた。
Twitterにつぶやくため、文章が長すぎないように80文字以上120文字以下にしている。

また、「日本語らしい文」にするたえ
・文章の始まりは非自立名詞、英単語以外の名詞から始まるようにする
・文章の終わりは句点(。)、終助詞、助動詞とし、さらに助動詞でも一部の語を除くようにする
・文章の終わりが「っ」だった場合「た」を追加する
・文章の終わりは句点を追加する
という工夫を加えている。

これでかなり「読めるけどなんかおかしい」文章が生成されるようになった。
URLはこちら

http://twitter.com/Shadow_Tombu
posted by 岩永 at 18:23| Comment(0) | TrackBack(0) | パソコン | このブログの読者になる | 更新情報をチェックする

Twitterのbotを作ってみる【今日の天気をつぶやいてみる編】

今回作成したbotは決まった時間にスケジュールと写真しかつぶやかなかったので、朝の挨拶をつぶやく機能を追加しようと考えました。
どうせなら「おはようございます」という挨拶だけでなく、天気予報も呟いてみようと思います。

天気予報が取得できるAPIがあるようですが、これは有料っぽい。
ならばRSSで取得できないかと探してみると、Yahoo!天気予報livedoor 天気予報が各地の天気予報をRSSで配信しています。
どちらを使うか迷いましたが、「天気 最高気温/最低気温」という質実剛健なパラメータのYahoo!天気予報を使うことにします。

RSSの取得はurllib、取得したRSSの解析はElementTreeを使います。
RSS(XML)のtitleタグに日付が入っているので、今日の日付の文字列で検索。
見つかったところの天気予報部分のdescriptionタグの値を取りだして、文字列を分解して天気、最高気温、最低気温を取得します。

朝の挨拶は「おはようございます。今日もよろしくお願いします。」という定型文なので、あとは取りだしたパラメータを使って「今日の佐賀県の天気予報は○、最高気温はXX℃、最低気温はYY℃だそうです。」という文章を使ってツイートするようにしてみました。
ラベル:Twitter bot Python
posted by 岩永 at 17:35| Comment(0) | TrackBack(0) | パソコン | このブログの読者になる | 更新情報をチェックする

2011年05月06日

Twitterのbotを作ってみる【時刻指定のコマンド実行編】

先日作ったTwitterのbotは
・今日のスケジュールをつぶやく(「本日は19:30から会合の予定です」「本日はキャンプの予定です」)
・明日のスケジュールをつぶやく(「明日は会合の予定です」)
・来週のスケジュールをつぶやく(「来週は○日に会合の予定です」)
・過去の行事の写真を投稿する
というものです。

今日のスケジュールがつぶやけるなら、スケジュールの開始時間になったら「会合なう!」とつぶやくのも面白いかな、と考えて、指定時刻つぶやき機能を実装してみることにしました。
実装に使用したのは実質1コマンド。
Linuxのatコマンドが時刻指定の実行コマンドだったので、それを使用しました。

もともとの「今日のスケジュールをつぶやく」スクリプトで、時刻が指定されていたらその時刻に「○○(行事名)なう!」を引数にしてつぶやきスクリプトを実行するようにしました。
コマンドはこんな感じ。

cmd_str = 'echo "/usr/local/bin/python /(スクリプトのパス)/スクリプト名 %sなう!" |at %s' % (event_str, start_time)
os.system(cmd_str)

event_strとstart_timeは前処理としてつぶやき作成時に切り出してます。
これだけでstart_timeで設定している時刻にスクリプトを実行することができました。
ラベル:Twitter bot
posted by 岩永 at 04:55| Comment(0) | TrackBack(0) | パソコン | このブログの読者になる | 更新情報をチェックする

2011年05月01日

Twitterのbotを作ってみる【ユーザ検索・フォロープログラム作成編】

TwitterのAPIではユーザのプロフィールの検索はできないらしい。
ということでまたGoogle先生にお伺いを立てて、2種類のプロフィール検索APIを見つけた。
Left HandleというところのAPI http://tps.lefthandle.net/
twipro http://twpro.jp/ というAPIがあるようだ。
あまり違いはないみたいなんだけど、検索結果の説明が分かりやすいのと、検索結果をソートできるのでLeftHandleのAPIを使ってみることにする。
これは認証とかいらないのでリクエスト文を作ってGETリクエストを投げるだけ。
難なく検索結果を取得してIDだろうが名前だろうが取ることができた。
ところでこれ、nameとscreen_nameの中身が逆転してない?

さて、検索結果は取得できたので、結果からまたTwitter APIを使ってフォロー処理を行うことにする。
しかしここでつまづいた。
これまで作ったスクリプトはTwitterへの投稿に特化しているので、フォロー処理が401 Not Authorizedで返ってくるのだ。
ググって見つかるプログラムもみんな投稿処理しかしてないから参考にならない。

よく分からない試行錯誤をして、冷静になって考えてみる。
oauthはHTTPリクエストを元に秘密鍵で署名を作成して、公開鍵(を含めたHTTPリクエスト)と秘密鍵を送信して認証を行う。
だから、フォローAPIのHTTPリクエストを作って鍵の作成を行えばよいのだ!
ということで、Twitterへの投稿コメントを受け取ってHTTPリクエストを作成し、認証を行う処理を、HTTPリクエストのURLとパラメータを受け取ってリクエスト文を作成し、認証を行うように修正した。
結果は思った通り、投稿もフォローもできるようになった!


ということで、やりたかったことがほぼ全てできるようになり、Twitter botの稼働を開始することができた。
楽しかったな。

botのURLはこちら
http://twitter.com/#!/oyajibakkai



やり残したこと・改善したいこと
Google Calendarの行事を取得するのに時々APIエラーが出るので、この時の対応
OAuth処理の改善
Primary Calendar以外のカレンダーからのイベントの取得
Twitpicに画像を投稿する際にいったんリサイズ(縮小)する処理の追加
ラベル:Twitter bot
posted by 岩永 at 17:18| Comment(0) | TrackBack(0) | パソコン | このブログの読者になる | 更新情報をチェックする
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。