そらのあお (2) : 辞書型を使ってみた

pythonmatlabにくらべて色々変数の型があるんだなーということで、辞書型を使って反応部分を書きなおしてみた。これで、反応を(比較的簡単に)追加できる、はず。
とはいえ、ちびめりも、反応パターンだけでなんパターンなるんだろう…?まぁいいや
(発信: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にインストール

MeCabMacOSXことえりとか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
すもももももももものうち
すももも-D
ももも---D
ももの-D
うち

できた!おしまい。

日本語構文解析器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

できてる!pythonバインディングはまた。と言うか何ができてどう使うのか、を次は調べる…

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-pythonMeCab - 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で緯度経度を取得→雨量アニメーションから位置の推定→予報と言うのはできてるんだけど、緯度経度と雨量アニメーション上での位置のすり合わせがひと手間かかるのでやってない。