Hatena::Grouppython

easy_install makimoto

2008-10-20

Twitter で「にゃー」とポストされたら自動的に「にゃー」とポストし返すスクリプト

23:56 | Twitter で「にゃー」とポストされたら自動的に「にゃー」とポストし返すスクリプト - easy_install makimoto を含むブックマーク はてなブックマーク - Twitter で「にゃー」とポストされたら自動的に「にゃー」とポストし返すスクリプト - easy_install makimoto

ふと思い付いてしまい、むしゃくしゃして書いてしまいました。

Twitter で「にゃー」というポストを逃してしまって悔しい思いをしないように、以下のようなスクリプトを常にサーバ上に走らせておけば、幸せになれるかも知れません。

twitter-python

sudo easy_install python-twitter

インストールできます。

#!/usr/bin/env python
# vim:fileencoding=utf8

from time import sleep
from re import compile
from twitter import Api

me = Api('twitter_id','twitter_passwd')

norm = compile('\s+')

maxsid = 0
while True:
  for i in reversed(me.GetFriendsTimeline()):
    if maxsid >= i.id:
      continue
    maxsid = i.id
    text = norm.sub(' ', i.text)
    if text == 'にゃー':
      me.PostUpdate(text)
  sleep(600)

Twitter API を使っているので、漏れが出る可能性があります。よって、API を叩かずにスクレイピングしてポストを得る戦略が正しいと思うのですが、まあ、そこまで真剣にやる必要はない気がします。

追記

自分が鳴き続けたって気持ち悪いだけなので、@nyaa_nya というボットを作りました。

2008-10-01

dict と defaultdict

07:25 |  dict と defaultdict - easy_install makimoto を含むブックマーク はてなブックマーク -  dict と defaultdict - easy_install makimoto

恥しながらつい最近、collections.defaultdict を知りました。*1

Python 2.5 で追加された型なので、 2.4 以前では使えないという問題がありますが、いちいち、 adict.get(hoge,0) などとしなくてもデフォルト値を持っているので凄く便利です。

しかし、defaultdict は 組み込みの dict 型と比較して遅いというコメント *2 があったので、実際どれくらい遅いのか検討していみようと思いまう。

実験設定

単純な単語頻度を数える問題にします。

最近、あたしったーなるケッタイな代物を作る機会があり、「あたし彼女」の形態素分かち書きのデータを作ってたので、せっかくなんでこれの単語頻度を数えます。

まず、こんなコードをでっち上げます。

#!/usr/bin/env python
# vim:fileencoding=utf8
from time import clock
from collections import defaultdict

def timer(func,*args):
  start = clock()
  func(*args)
  return clock() - start

def use_dict_if(aList):
  for i in xrange(3000):
    aDict = {}
    for j in aList:
      if j in aDict: aDict[j] += 1
      else: aDict[j] = 1

def use_dict_get(aList):
  for i in xrange(3000):
    aDict = {}
    for j in aList:
      aDict[j] = aDict.get(j,0) + 1

def use_defaultdict(aList):
  for i in xrange(3000):
    aDDict = defaultdict(int)
    for j in aList:
      aDDict[j] += 1

''' Reading atashi-kanojo terms into aList '''
aList = []
for i in open('atashi.wakati'):
  aList.extend(i.split())

print 'use_dict_if:', timer(use_dict_if, aList)
print 'use_dict_get:', timer(use_dict_get, aList)
print 'use_defaultdict:', timer(use_defaultdict, aList)

ご覧の通り、これは以下の3つの条件で「あたし彼女」の単語頻度のディクショナリを3000回構築する時間を計測します。

  • dict 型で if hoge in adict を使う場合 (use_dict_if)
  • adict.get(hoge,0) を使う場合 (use_dict_get)
  • defaultdict を使う場合の3つの条件 (use_defaultdict)

実験結果

では早速コードを走らせてみた結果を見てみましょう。

% python timer.py
use_dict_if: 65.79
use_dict_get: 82.31
use_defaultdict: 60.38

ということで、use_defaultdict 、 use_dict_if 、 use_dict_get の順に処理時間がかかるという結果になりました。

あまりきっちりとした実験環境で試したわけではないので、厳密なことは言えませんが、 aDict.get を使用した場合が明らかに遅いのと比較して、if 文を使った場合と、 collections.defaultdict 型を使用した場合とに大きな差は見られないばかりか、若干 defaultdict の方が速いみたいです。

結論

collections.defaultdict は便利だし効率面でも悪くないみたいなので、 (互換性さえ気にならなければ) どんどん使った方が良い、かも。

xvutrfakjkyxvutrfakjky2011/03/15 14:27iUAH5v <a href="http://daazhhsfvyhl.com/">daazhhsfvyhl</a>, [url=http://dslpvgsikwlm.com/]dslpvgsikwlm[/url], [link=http://qerztfxgsjtj.com/]qerztfxgsjtj[/link], http://oezkhpczwkmb.com/

RajuRaju2012/09/21 18:04Thanks for sharing. What a pealsure to read!

qtxlrnnnqefqtxlrnnnqef2012/09/22 14:07TjSjAF <a href="http://vqqgppfnxxqx.com/">vqqgppfnxxqx</a>

wvmfszmewvmfszme2012/09/22 22:01ZCtcOh , [url=http://rkekdwkpagfe.com/]rkekdwkpagfe[/url], [link=http://aqmkdsebfwyv.com/]aqmkdsebfwyv[/link], http://dwkxwultapig.com/

yfjbskcdjyfjbskcdj2012/09/23 06:07pGKotR <a href="http://xookddutvebh.com/">xookddutvebh</a>

iknsadmyziknsadmyz2012/09/24 21:19jFjKpa , [url=http://gbtnejistkbk.com/]gbtnejistkbk[/url], [link=http://vtehwttfeijv.com/]vtehwttfeijv[/link], http://cnlvqslyomqw.com/

2008-09-26

あたし彼女ぱい

02:56 |  あたし彼女ぱい - easy_install makimoto を含むブックマーク はてなブックマーク -  あたし彼女ぱい - easy_install makimoto

あたし彼女」なる携帯小説が流行しているようです。冒頭から色々ツッコみたくなるような作品で、ざっと読んでみたい気がないでもありません。

ですが、携帯サイトの常で、一々次のページへのリンクを辿らなければならないので面倒です。無駄に行間が広いのも気に喰いません。

ということで、プレーンテキストとして「あたし彼女」を読み安く再構成するコードを書きました。名前を考えるのが面倒なので、atashi-kanojo.py という名前で CodeRepos に上げてあります。

BeautifulSoup *1でひたすら本文をスクレイプして、余計な改行を削除して出力するシンプルな代物です。

実はクリティカルバグが残ってて、Shift_JIS に含まれない絵文字などが本文中に含まれるページでは文字コードの認識に失敗して文字化けしています。更に、無理矢理 Shift_JIS で処理しようとしたら illegal multibyte sequence で怒られてしまうので、ちょっと困ってます。真面目に文字コード外の文字を消す方法が妥当なのかしらん。

*1:'easy_install BeautifulSoup' でインストールできる。

JeslynJeslyn2011/12/21 13:54Last one to utlizie this is a rotten egg!

zceyatalshmzceyatalshm2011/12/21 18:23sgAHnO <a href="http://vcbveztwsjst.com/">vcbveztwsjst</a>

fwkqwkmlztufwkqwkmlztu2011/12/22 23:17U5ihPY , [url=http://tgvmqlgztodi.com/]tgvmqlgztodi[/url], [link=http://evgcphnupmzh.com/]evgcphnupmzh[/link], http://ylhhgseupifb.com/

zuwecjkzuwecjk2011/12/24 03:57V9DbeT , [url=http://xmlciacktrei.com/]xmlciacktrei[/url], [link=http://ztjmjimghimp.com/]ztjmjimghimp[/link], http://aclidkjsiipz.com/

2008-09-25

ごあいさつ

02:45 |  ごあいさつ - easy_install makimoto を含むブックマーク はてなブックマーク -  ごあいさつ - easy_install makimoto

id:makimoto です。

普段は自然言語処理とか日本語処理とか呼ばれる技術を飯の種にしてて、最近は Python が主力兵器になりつつあります。

てなわけで、 python グループでは自然言語処理ネタなどを中心に書いていけたら良いなと思ってます。

ksbhoyiksbhoyi2011/03/14 15:44LXQjxt <a href="http://fmkslqxblrzl.com/">fmkslqxblrzl</a>, [url=http://etmjpuvdondq.com/]etmjpuvdondq[/url], [link=http://bfsrhabhaodq.com/]bfsrhabhaodq[/link], http://iplsyzomzxlw.com/

AuthAuth2012/09/21 20:20Just cause it's simple doesn't mean it's not super hpefull.

lwvrgcyellwvrgcyel2012/09/22 14:17j7FMCf <a href="http://qquwziyueejg.com/">qquwziyueejg</a>

rowyskrowysk2012/09/22 22:12MtiVkj , [url=http://nzfbmcbrgfia.com/]nzfbmcbrgfia[/url], [link=http://reohrpvjmifj.com/]reohrpvjmifj[/link], http://zyuthxealfeo.com/

ycjwkbhamxxycjwkbhamxx2012/09/23 06:18dRLttp <a href="http://rcewnwffcgur.com/">rcewnwffcgur</a>