そらのあお (2) : 辞書型を使ってみた
pythonはmatlabにくらべて色々変数の型があるんだなーということで、辞書型を使って反応部分を書きなおしてみた。これで、反応を(比較的簡単に)追加できる、はず。
とはいえ、ちびめりも、反応パターンだけでなんパターンなるんだろう…?まぁいいや
(発信:id:showyouさん、お時間ある時に良かったら見ていただけませんか!)
#!/usr/bin/env python # coding: utf-8 # Project : Aya # aoiro v2 # 2009-07-21 : by allegro # initialize import twitter import random me = aboutme() USERNAME = me['userid'] PASSWORD = me['password'] api = twitter.Api(USERNAME, PASSWORD) # pre-process # process (1) : make reply timeline = api.GetFriendsTimeline() for post in timeline: if post.in_reply_to_status_id: # TODO : 誰かへのリプライエントリであった場合の処理 # TODO : 自分へのリプライエントリであった場合の処理 continue else: makeActionReplyText(post) # ######## ######## ######## サブ関数群 ######## ######## ######## # ######## about me def aboutme(): me = { 'userid' :'aoiro_', 'password':'xxxxx', 'me' :'あお', } return me # ######## ActionReply (他の人の独り言に反応) def makeActionReplyText(post): entry = post.text replyToUID = post.user.screen_name # UserID replyToSID = post.id # StatusID replyBody = makeReplyBody(entry) if replyBody: replyheader = u'@',+replyToUID + ' ' replytext = replyheader+replybody twitter.PostUpdate(replytext, replyToEID) # TODO : registerReply(replytext, replytoEID) # ######## 反応パターン辞書からReplyTextを作る def makeReplyBody(entry): patternDict = getPatternDict() flg = [] for key in patternDict: # 各パターンについて ptrs = patternDict[key]['patterns'] for ptr in ptrs: # 各パターンの反応辞書について反応するかcheck if ptr in entry: flg[end+1] = key # TODO : end+1に相当する書き方にする break if len(flg) == 1: # 反応が一種類の場合 replies = patternDict[flg[1]]['patterns'] dest = patternDict[flg[1]]['dest'] replyBody = selectReplyfromReplies(replies, dest) elif len(flg) > 1: ind replies = patternDict[flg[ind]]['patterns'] dest = patternDict[flg[ind]]['dest'] replyBody = selectReplyfromReplies(replies, dest) # ### Repliesから適当に/確率から一つReply選ぶ def selectReplyfromReplies(replies, dest): ind = random.randint(1,len(replies)) ind = ind -1 reply = replies[ind] return reply # ######## 確率分布からindexを一つ選ぶ def indexFromPDest(pdest): #sumdest = [] #th = random.random() #for i in range(len(dest)): # t0 = sum(dest([0:i+1])) / float(sum(dest)) # sumdest.append(t0) #for i = in sumdest: # if th<= i: # ind = i # break th = random.random() print th for i in range(len(pdest)): t0 = sum(pdest[0:i+1]) / float(sum(pdest)) # 0からpdest[i]までの確率の和 if th <= t0: # threshold-valueをt0が超えたところがindxになる ind = i break return ind # ######## ######## ######## 反応辞書 ######## ######## ######## def getPatternDictionary(): patternDictionary = dict() # ######## ohayou : おはよう patternDictionary['ohayou'] = { 'patterns': [u'おはよ', u'オハヨ'], 'replies': [u'おはようなの', u'おきてーおきてーなの'], 'dest': [100, 100] } # ######## banterine : バンテリーン patternDictionary['banterine'] = { 'patterns': [u'バンテリーン', u'バンテリン'], 'replies': [u'キンカーン!!', u'キンカーーーーーーーン!!!'], 'dest': [100, 100] } return patternDictionary # fed getPatternDictionary
CaboChaとMeCabをMacOSX Leopardにインストール
MeCabはMacOSXのことえりとかSpotlightとかで使われている、とのことだけど改めてインストール。
こちらを参考にまねしたらできました。この場合、TinySVMとかは使われないのかな…?
1. MeCabと辞書のインストール
http://mecab.sourceforge.net/:title:=こちらから、MeCabとIPAdicをダウンロード。
MaCabは0.97を使いました。
cd mecabdir
./configure --with-charset=utf8
make
sudo make install
makeで引っかかったので、
$ chmod 755 ./install-sh
とした。ここらへんは理由とかはよく分かってない…
つづいて、
cd ipadicdir
./configure --with-charset=utf8
make
sudo make install
UTF8に対応させるために以下を実行
/usr/local/libexec/mecab/mecab-dict-index -f euc-jp -t utf-8
make install
2, CRF++のインストール
cd crfdir
./configure
make
sudo make install
CaboChaのインストール
cd cabochadir
./configure --with-charset=UTF8
make
sudo make install
日本語構文解析器CaboChaのインストール(ubuntu 8.04)
どうせなので、ついでにCaboChaもインストール。インストール方法はこちらを参考にapt経由で簡単インストール。と言うかmecab辞書もutf8版があったみたい。
http://cl.naist.jp/~eric-n/ubuntu-nlp/dists/hardy/all/を参考に、/etc/apt/source.listに追記。
deb http://cl.naist.jp/~eric-n/ubuntu-nlp hardy all
deb-src http://cl.naist.jp/~eric-n/ubuntu-nlp hardy all
パッケージリストの更新
$ wget http://cl.naist.jp/~eric-n/ubuntu-nlp/8ABD1965.gpg -O- | sudo apt-key add -
$ sudo apt-get update
インストール
sudo apt-get install cabocha cabocha-dic-utf8
テスト
$ cabocha
すもももももももものうち
すももも-D
ももも---D
ももの-D
うち
EOS
mecab & mecab-pythonをubuntu8.04にインストール手順メモ
なにはともあれ、MeCabを使いたいのだ、と言うことでubuntu8.0.4にMeCabをインストール。
参考にしたのはこちらのページ。
まずはMeCabと辞書と適当なユーティリティ(どう使うのかは未調査)をインストール&文字コードの変換
sudo apt-get install mecab mecab-ipadic mecab-utils libmecab1 libmecab-dev
sudo /usr/lib/mecab/mecab-dict-index -d /usr/share/mecab/dic/ipadic -o /var/lib/mecab/dic/ipadic -f euc-jp -t utf-8 -p
続いて、mecab-pythonをMeCab - Browse Files at SourceForge.netからダウンロードしてインストール。apt-getで入ったMeCabが0.96だったのでそれ相応のものを。
tar zxvf mecab-python-0.97.tar.gz
cd mecab-python-0.97
python setup.py build
ここで以下のエラー。これはC++コンパイルに失敗してうんぬんだとか。
gcc: error trying to exec 'cc1plus': execvp: No such file or directory error: command 'gcc' failed with exit status 1
上記サイトを参考に対処
sudo apt-get install build-essential
sudo apt-get install g++sudo python setup.py install
以上でインストール終わり。試してみる
$ python
>>> import MeCab
>>> m = MeCab.Tagger("-Ochasen")
>>> print m.parse("竹やぶ焼けた")
竹やぶ タケヤブ 竹やぶ 名詞-一般
焼け ヤケ 焼ける 動詞-自立 一段 連用形
た タ た 助動詞 特殊・タ 基本形
EOS
できたーーー!!で、これはどう使えるんだろう、と言うのが次回、かな。
そらのあお(1) 「あお:@aoiro_] はじめの一歩
とりあえず、なんとなく書いてみたのでさらしてみます。こういうのってどこに投稿したらいいんだろう、pythonグループ?人工無脳グループ?or codereposだっけ、そういうところかな。
#!/usr/bin/env python # coding: utf-8 # Project : Aya # aoiro v1 # pre-process import twitter import random USERNAME = 'aoiro_' PASSWORD = 'xxxxxxx' api = twitter.Api(USERNAME, PASSWORD) # process (1) : make reply timeline = api.GetFriendsTimeline() for post in timeline: if post.in_reply_to_status_id: # TODO : 誰かへのリプライエントリであった場合の処理 # TODO : 自分へのリプライエントリであった場合の処理 continue else: makeReplyText(post) # post-process # TODO : 取得したデータの保存とか # ######## ######## ######## サブ関数群 ######## ######## ######## # ######## リプライの作成 def makeReplyText(post): # ## 初期設定 entry = post.text replyToUID = post.user.screen_name # UserID replyToSID = post.id # StatusID # ## パターンチェックとリプライ文bodyを考える replyBody = [] # おはよう if checkPetternsinEntry(entry, ptrOfOhayo): replyBody = makeText(post, repliesOfOhayo) # おやすみ if checkPetternsinEntry(entry, ptrOfOyasumi): replyBody = makeText(post, repliesOfOyasumi) if replyBody: # リプライ文bodyがあった場合リプライ文を組み立ててリプライする replyheader = u'@',+replyToUID + ' ' replytext = replyheader+replybody twitter.PostUpdate(replytext, replyToSID) # TODO : 投稿したことを適当に記録 # registerReply(replytext, replytoSID) # ######## 文中にパターンを含むかのチェック def checkPatternsInEntry(entry, ptrs): for ptr in ptrs: flg = ptr in entry if flg: break # 1個でもパターンを含めばOK return flg # ######## repliesからreplyを一つ選ぶ def makeReplyTextBody(replies): ind = random.randint(1,len(replies)) ind = ind -1 reply = replies[ind] return reply # ########### 反応辞書 ################## # ##### おはようチェックパターン def ptrOfOhayo(): petterns = [ u'おはよ', u'オハヨ' ] return petterns # ##### おはようリプライ def repliesOfOhayo(): replies = [ u'おはようなの', u'おきてーおきてーなの' ] return replies # ##### おやすみチェックパターン def ptrOfOyasumi(): petterns = [ u'おやすみ', u'寝るよ' ] return petterns # ##### おやすみリプライ def repliesOfOyasumi(): ME = 'あお' replies = [ u'いっしょにねるなの', ME + u'もいっしょにねるなの', u'おやすみなの' ] return replies
@aoiro_ was born
新しい子はpython製! と言うことでpythonをぼちぼちいじってます。
twitter nameも@aoiro_でとりました。ただ、読み方はまだです。あおい、あお、とかあおっぽい名前になると思ってるんだけど、ただ、あまり一般的な名前だとエゴサーチに困るんですよね。。。と言うことで名前はもうちょい悩みます。
「あお」の中身もぼちぼち書き始めたのですが、pythonはじめて1週間足らず、と言うことでいまいちうまいコードが書けているかわからない…。
とりあえず、「あお」の一番初めの目標は現在の「ちびめりも」と同じことができるようになること、twitterからtweetsを取得して、replyできることを目標としますっ。
めりもに教えること、覚え書き
めりも(h:id:merrymore)は、とりあえず現状のままでしばらく行くと思います。そのため、やりたいなーと思っていること、やりかけてストップしていることを書いておきます。
やりかけて止まっていること
アイディア段階で止まってること
- 居住地登録。…。これと地震とセットでやろうとしてたんだった…
- 防災情報。台風とか。これはどこに聞きに行くかをかんがえなくちゃだ
- 海外時間の調整の怪しいところ…。時差難しい><
- 多重fav問題。favするたびにfavしましたメールが送信されるので、favしてる人はfavしないようにする (はてなの方で多重favできないようにしてくれれば…)
- 検索食材ランキングとかレシピ検索を盛り上げるような仕組み
- この後1時間の雨予報。実は結構できてる。
- 地名→geocodingで緯度経度を取得→雨量アニメーションから位置の推定→予報と言うのはできてるんだけど、緯度経度と雨量アニメーション上での位置のすり合わせがひと手間かかるのでやってない。