2016年12月1日木曜日

WindowsでDeepLearning・その2

さて,昨日の段階で,

    **************************************************
    *** WARNING: Include files not found: ['cudnn.h']
    *** WARNING: Skip installing cudnn support
    *** WARNING: Check your CFLAGS environment variable
    **************************************************
というエラーが出て終わっていたので,FIXを目指す. https://github.com/pfnet/chainer/issues/1699 を見てみたけど,どうも最後まで解決はしていないらしい.

とにかく問題はcuDNNがうまくインストールされていないことらしいということで, あたりがついてきたので,その辺を調べてみる.

どうやらcuDNNは中身を C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0 以下に上書きする必要があったようだ. http://qiita.com/okuta/items/f985b9da6de33a016a75

cuDNNを無事ダウンロードできた人は、展開したファイルをC:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v7.5に上書きしてください。
cuDNNv3の場合、cudnn64_70.dllがCUDA\v7.5\binフォルダに、cudnn.hがCUDA\v7.5\includeフォルダにcudnn.libがCUDA\v7.5\lib\x64に入っていれば大丈夫です。

これで再び

>pip install chainer --no-cache-dir -vvvv
でインストールすると,エラーは発生せずに無事インストールできた.

が,実行してみると

>python train_mnist.py --gpu 0

GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Traceback (most recent call last):
  File "C:\usr\Python35\lib\site-packages\cupy\cuda\compiler.py", line 49, in _run_nvcc
    return subprocess.check_output(cmd, cwd=cwd, stderr=subprocess.STDOUT)
  File "C:\usr\Python35\lib\subprocess.py", line 626, in check_output
    **kwargs).stdout
  File "C:\usr\Python35\lib\subprocess.py", line 708, in run
    output=stdout, stderr=stderr)
subprocess.CalledProcessError: Command '['nvcc', '--preprocess', '-Xcompiler', '/wd 4819', '-m64', 'C:\\Users\\***\\AppData\\Local\\Temp\\tmp_ak8290o\\kern.cu']' returned non-zero exit status 2

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "train_mnist.py", line 107, in 
    main()
  File "train_mnist.py", line 104, in main
    trainer.run()
  File "C:\usr\Python35\lib\site-packages\chainer\training\trainer.py", line 292, in run
    entry.extension(self)
  File "C:\usr\Python35\lib\contextlib.py", line 77, in __exit__
    self.gen.throw(type, value, traceback)
  File "C:\usr\Python35\lib\site-packages\chainer\reporter.py", line 90, in scope
    yield
  File "C:\usr\Python35\lib\site-packages\chainer\training\trainer.py", line 289, in run
    update()
  File "C:\usr\Python35\lib\site-packages\chainer\training\updater.py", line 170, in update
    self.update_core()
  File "C:\usr\Python35\lib\site-packages\chainer\training\updater.py", line 182, in update_core
    optimizer.update(loss_func, *in_vars)
  File "C:\usr\Python35\lib\site-packages\chainer\optimizer.py", line 392, in update
    loss = lossfun(*args, **kwds)
  File "C:\usr\Python35\lib\site-packages\chainer\links\model\classifier.py", line 67, in __call__
    self.y = self.predictor(*x)
  File "train_mnist.py", line 24, in __call__
    h1 = F.relu(self.l1(x))
  File "C:\usr\Python35\lib\site-packages\chainer\links\connection\linear.py", line 91, in __call__
    self._initialize_params(x.size // x.shape[0])
  File "C:\usr\Python35\lib\site-packages\chainer\links\connection\linear.py", line 77, in _initialize_params
    initializer=self._W_initializer)
  File "C:\usr\Python35\lib\site-packages\chainer\link.py", line 180, in add_param
    data = initializers.generate_array(initializer, shape, self.xp)
  File "C:\usr\Python35\lib\site-packages\chainer\initializers\__init__.py", line 45, in generate_array
    initializer(array)
  File "C:\usr\Python35\lib\site-packages\chainer\initializers\normal.py", line 94, in __call__
    Normal(s)(array)
  File "C:\usr\Python35\lib\site-packages\chainer\initializers\normal.py", line 31, in __call__
    loc=0.0, scale=self.scale, size=array.shape)
  File "cupy/core/core.pyx", line 1107, in cupy.core.core.ndarray.__setitem__ (cupy\core\core.cpp:22267)
  File "cupy/core/core.pyx", line 1336, in cupy.core.core.elementwise_copy (cupy\core\core.cpp:49642)
  File "cupy/core/elementwise.pxi", line 771, in cupy.core.core.ufunc.__call__ (cupy\core\core.cpp:40576)
  File "cupy/util.pyx", line 35, in cupy.util.memoize.decorator.ret (cupy\util.cpp:1261)
  File "cupy/core/elementwise.pxi", line 579, in cupy.core.core._get_ufunc_kernel (cupy\core\core.cpp:37190)
  File "cupy/core/elementwise.pxi", line 32, in cupy.core.core._get_simple_elementwise_kernel (cupy\core\core.cpp:27744)
  File "cupy/core/carray.pxi", line 87, in cupy.core.core.compile_with_cache (cupy\core\core.cpp:27431)
  File "C:\usr\Python35\lib\site-packages\cupy\cuda\compiler.py", line 131, in compile_with_cache
    base = _empty_file_preprocess_cache[env] = preprocess('', options)
  File "C:\usr\Python35\lib\site-packages\cupy\cuda\compiler.py", line 94, in preprocess
    pp_src = _run_nvcc(cmd, root_dir)
  File "C:\usr\Python35\lib\site-packages\cupy\cuda\compiler.py", line 56, in _run_nvcc
    raise RuntimeError(msg)
RuntimeError: `nvcc` command returns non-zero exit status.
command: ['nvcc', '--preprocess', '-Xcompiler', '/wd 4819', '-m64', 'C:\\Users\\*****\\AppData\\Local\\Temp\\tmp_ak8290o\\kern.cu']
return-code: 2
というわけで,実行時エラー.
さて,ここからどうするか・・・

2016年11月30日水曜日

WindowsでDeepLearning・その1

Windows10でDeepLearningを目指す.
基本的に,
http://qiita.com/akrian/items/953082aa8f00479dbb01
を参考にする.

まずは,Python3.x系のインストール.
2.7系とどちらを入れるべきか悩んだけど,参考ページが3.5なので同じものを.

https://www.python.org/downloads/
から,Python3.5.2 Windows x86-64 web-based installerを選択してDL.
そして,インストール.





Visual Studio CommunityをDL
https://www.visualstudio.com/ja/downloads/
最新版でいいのかな.
さすがMicrosoft.いきなりInstallが始まったぞ.



かなり長時間のインストール後,再起動.

続いてCudaを導入.
https://developer.nvidia.com/cuda-downloads



cuDNNをインストール

Pycudaをインストール

Windows環境変数を追加

Chainerのインストール

と調子よくインストールが完了していったが,
・Chainerのサンプルファイルを実行
でこけた.

GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

Traceback (most recent call last):
  File ".\train_mnist.py", line 107, in <module>
    main()
  File ".\train_mnist.py", line 56, in main
    chainer.cuda.get_device(args.gpu).use()  # Make a specified GPU current
  File "C:\usr\Python35\lib\site-packages\chainer\cuda.py", line 180, in get_device
    check_cuda_available()
  File "C:\usr\Python35\lib\site-packages\chainer\cuda.py", line 85, in check_cuda_available
    raise RuntimeError(msg)
RuntimeError: CUDA environment is not correctly set up
(see https://github.com/pfnet/chainer#installation).CuPy is not correctly installed. Please check your environment, unin
stall Chainer and reinstall it with `pip install chainer --no-cache-dir -vvvv`.
だそうで.

試しに,
> pip install chainer --no-cache-dir -vvvv
としてみたけど,案の定ダメ.

http://hurikake.hatenadiary.jp/entry/2016/09/26/232246
を参考にして,
いろいろ試した結果,pathが有効になっていなかった.
C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v8.0\bin
へのPathが有効になっていなかった.

ログインしなおして再チャレンジ.
今度は,
distutils raises an error: Unable to find vcvarsall.bat
だそうな.
http://www.regentechlog.com/2014/04/13/build-python-package-on-windows/
によると,
C/C++などのビルドが必要なファイルを含むPythonパッケージをWindows環境下でインストールしようとすると「Unable to find vcvarsall.bat」とエラーがでることがあります。

Pythonパッケージにビルドが必要なファイル(pure Python以外のC/C++など)が指定されている場合はインストール時にコンパイルが必要ですが、Windows環境ではデフォルトでPython本体をコンパイルしたVC++と同じバージョンのVC++を呼ぼうとします。そのため、Python本体をコンパイルしたバージョンのVC++がないとエラーになります。
なるほど.
調べてみると,
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.version
'3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AMD64)]'
>>>
ということで,MSC v.1900->VS13でコンパイルしたことが分かる.
・・・と思ったけど,
http://stackoverflow.com/questions/33323172/vcvarsall-bat-needed-for-python-to-compile-missing-from-visual-studio-2015-v-1
によると, vcvarsall.bat がないことがあるらしい.
調べてみたら,確かに
C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vcvarsall.bat 
はない.
http://stackoverflow.com/questions/33323172/vcvarsall-bat-needed-for-python-to-compile-missing-from-visual-studio-2015-v-1#comment63185046_35243904
を参考に,
c:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\Tools\vsvars32.batをコピーして,vcvarsall.batとリネームしてみる.

とりあえず動いたけど,
GPU: 0
# unit: 1000
# Minibatch-size: 100
# epoch: 20

C:\usr\Python35\lib\site-packages\chainer\cuda.py:90: UserWarning: cuDNN is not enabled.
Please reinstall chainer after you install cudnn
(see https://github.com/pfnet/chainer#installation).
  'cuDNN is not enabled.\n'
というわけで,cuDNNは使えていないらしい.
そのうえ,実行も失敗している.

う~む・・・
いずれにせよ,今日は時間がないので,ここまで.


2016年2月1日月曜日

2006年の節分まで恵方巻なんてなかった!?クックパッドデータを使って調べてみた.

節分が近づいてきました.
で,最近は恵方巻きとか太巻きとか節分に食べる訳ですが,子供の頃そんな風習無かったよな~としか思えない.

マスコミに踊らされているとか,コンビニ戦略だ,とか色々言われているけど,一体いつから恵方巻きとか太巻きとかが節分に食べられるようになったのか気になる.
というわけで,クックパッドとNIIによって提供されているクックパッドレシピデータを使って調べてみた.データは1998年から2014年まである.

とりあえず,レシピのタイトルに「恵方巻き」「太巻き」が入っているレシピを検索し,いつ投稿されたのかを調べる.ただし,全体の投稿数と比較しないと何とも言えないので,
「一日に投稿されたレシピの内,恵方巻き・太巻きが含まれている割合」
を各日ごとに検出してみた.



ちゃんとピークは2月ごとに訪れているらしい.
んでもって,最初のピークは2003年2月.

う~ん,2003年より前はクックパッドのデータにどれほど統計的意味があるか分からないレベルなので,何とも言えないかな.
ただ,別途調べた「雑煮」だと2000年からピークが出ているので,それに比べるとやはり節分に太巻きという風習は2000年代初頭はそれほどメジャーなイベントでは無かったのかも知れない.

なお,恵方巻のみだと2006年が初出.恵方巻きという言葉自体は2006年くらいから使われ始めたもののようだ.
それまでは一件もレシピがないみたいだけど、誰がこの名前つけたんだろう?




というわけで,思ったより太巻きを食べる風習というのは昔からあったみたいだけど,恵方巻きと言う言葉は最近メジャーになったものらしいということが分かりました.

クックパッドのデータ,近年の食文化の変化を見るには適しているのかも.
論文にはなりづらそうだけど.


2015年7月15日水曜日

学会タイマーオンライン再び

GoogleAppEngineの仕様変更に伴って
学会タイマーオンラインのメンテナンスができなくなったので,別の場所に再設置.

プレゼンタイマーオンライン

MacでもWindowsでもAndroidでも,アプリのインストール無しに使えます.

2015年3月7日土曜日

人狼知能エージェントの作成・その6 ver0.1.16

人狼知能サーバのバージョンが0.1.16に上がりました.

バージョン0.1.16での変更点として大きいものとして,
RoleAsignPlayerに追加する各役職とのPlayerが,Playerクラスを継承しなくなりました.

これまでは.村人であればAbstractVillagerPlayerというクラスを継承したクラスを使って,
行動を規定していました.
たとえば,
class MyVillagerPlayer extends AbstractVillagerPlayer{
}

しかしながら,AbstractVillagerPlayerはPlayerを実装していたのですが,
Playerを実装する意味がないということから,
AbstractRoleクラスを継承したAbstractVillagerをいうクラスを継承する事になりました.
たとえば,
class MyVillager extends AbstractVillager{
}

同様に,AbstractSeer,AbstractMediumなどのクラスを継承してMySeer,MyMediumなどを作るようにしてください.
基本的には,extendsするクラスとAbstractVillagerPlayerなどからAbstractVillagerに変更すればOkです.

今後も0系統は大きな変更がある可能性がありますが,ご了承ください.



2014年12月11日木曜日

Pythonを使ってTwitterでOAuthのログインをするためのクラスを作る

TwitterのOAuthでログインできるようにしておくと色々便利なのはAppEngineで経験済みなので,そのためのライブラリを作成してみる.

基本的にはこちらのページを参考にこしらえた.
pythonでoauth認証
事前準備は,
さくらインターネットでPython2.7を使ってTwitterAPIを叩くを参考のこと.
なお,Twitterとの接続に使うのは,python-twitter

まず,
http://syncer.jp/twitter-api-create-application
を参考に,Twitterのアプリを作成しておく.
ただし,アプリ作成の場所が,分かりづらくなったので,直接こちらにアクセスした方がよい.
https://apps.twitter.com/
Twitter社はアプリ作らせる気がないのか?と思うくらい分かりづらい.

このとき,CallBackURLにアプリのCGIのURLを指定しておくことを忘れずに.
後から変えられるけど.

次に,アプリ作成に入る.
まず,sqliteを使うので,oauth.dbというファイルを作っておいて,
$ sqlite3 oauth.db
sqlite> CREATE TABLE oauth (oauth_token text primary key,oauth_token_secret text);
sqlite> CREATE TABLE user (id integer primary key, consumer_key text, consumer_secret text, access_token text, access_token_secret text, screen_name text, image_url text, time datetime);
sqlite> .exit
として,データベースを作成しておく. 次に,TwitterLogin.pyを作成.
ここが今日のハイライト.


#!/usr/bin/env python
# -*- coding: utf-8 -*-

import site
site.addsitedir('/home/username/lib/python')

import os
import cgi
import cgitb
import oauth2 as oauth
import sqlite3
import twitter
import datetime
from Cookie import SimpleCookie
from twitter import TwitterError

request_token_url = 'https://api.twitter.com/oauth/request_token'
access_token_url = 'https://api.twitter.com/oauth/access_token'
authenticate_url = 'https://api.twitter.com/oauth/authorize'

class TwitterLogin:
    def __init__(self, db_name, consumer_key, consumer_secret):
        self.db_name = db_name
        self.consumer_key = consumer_key
        self.consumer_secret = consumer_secret

    def getOAuth(self):
        consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret)
        client = oauth.Client(consumer)
        # reqest_token    
        resp, content = client.request(request_token_url, 'GET')
        request_token = dict(self.parse_qsl(content))
       
        #call_back="http://torix.sakura.ne.jp/twitter/signin.cgi"
   
        # request_token    
        con = sqlite3.connect(self.db_name)
        con.execute(u'insert into oauth values (?, ?)', (request_token['oauth_token'], request_token['oauth_token_secret']))
        con.commit()
        con.close()

        #
        url = '%s?oauth_token=%s' % (authenticate_url, request_token['oauth_token'])
        print 'Content-type: text/html; charset: utf-8\n\n'
        print
        print '' % url


    def getApi(self):
        access_token, access_token_secret, screen_name, image_url = self.loadAccessToken()
        self.screen_name = screen_name
        self.image_url = image_url
        if not access_token == None:
            # Cookieを使った認証
            api = twitter.Api(consumer_key=self.consumer_key,
                              consumer_secret=self.consumer_secret,
                              access_token_key=access_token,
                              access_token_secret=access_token_secret)
            return api
        elif 'QUERY_STRING' in os.environ:
            # CallBackを使った認証
            query = cgi.parse_qs(os.environ['QUERY_STRING'])
            if len(query) == 0:
                return None
            # oauth_token_secret を取得
            con = sqlite3.connect(self.db_name)
            oauth_token_secret = con.execute(
                u'select oauth_token_secret from oauth where oauth_token = ?'
                , [query['oauth_token'][0]]).fetchone()[0]
            con.close()

            if oauth_token_secret == None:
                return None

            # Access_token と access_token_secret を取得
            consumer = oauth.Consumer(key=self.consumer_key, secret=self.consumer_secret)
            token = oauth.Token(query['oauth_token'][0], query['oauth_verifier'][0])
            client = oauth.Client(consumer, token)
            resp, content = client.request(
                access_token_url, "POST", body="oauth_verifier=%s" % query['oauth_verifier'][0])
            access_token = dict(self.parse_qsl(content))

            # access_tokenの保存
            api = twitter.Api(consumer_key=self.consumer_key,
                        consumer_secret=self.consumer_secret,
                        access_token_key=access_token['oauth_token'],
                        access_token_secret=access_token['oauth_token_secret'])
            try:
                user = api.VerifyCredentials()
                uid = user.GetId()
                self.screen_name = user.screen_name
                self.image_url = user.profile_image_url
                self.saveAccessToken(uid, access_token['oauth_token'], access_token['oauth_token_secret'], self.screen_name, self.image_url)
            except TwitterError:
                return None
            return api
        else:
            return None

    #save access token to db
    def saveAccessToken(self, uid, access_token, access_token_secret, screen_name, image_url):

        con = sqlite3.connect(self.db_name)
        c = con.cursor()
        #print datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        c.execute(u"replace into user (id, consumer_key, consumer_secret, access_token, access_token_secret, screen_name, image_url, time) values (?, ?, ?, ?, ?, ?, ?, datetime(?))", [uid, self.consumer_key, self.consumer_secret, access_token, access_token_secret, screen_name, image_url, datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")])
        con.commit()
        c.close()

        ck = SimpleCookie()
        ck.load(os.environ.get("HTTP_COOKIE",""))
        ck["id"] = uid
        ck["token"] = access_token
       
        now_date = datetime.datetime.now()
        expires = now_date
        expires = expires + datetime.timedelta(seconds=+(60*60*24))
        expires = expires.strftime('%a, %d-%b-%Y %H:%M:%S %Z')
           
        ck["id"]["expires"] = expires
        ck["token"]["expires"] = expires
        print ck.output(["id", "expires"])
        print ck.output(["token", "expires"])

    #load data from data base
    def loadAccessToken(self):
        ck = SimpleCookie()
        ck.load(os.environ.get("HTTP_COOKIE",""))
        if ck.has_key("id") and ck.has_key("token"):
            id = int(ck["id"].value)
            token = ck["token"].value
            access_token = None

            con = sqlite3.connect(self.db_name)
            c = con.cursor()
            c.execute(u'select access_token, access_token_secret, screen_name, image_url from user where id=%d'% id)
            for row in c:
                access_token = row[0]
                access_token_secret = row[1]
                self.screen_name = row[2]
                self.image_url = row[3]
            con.close()

            if not access_token == None and access_token == token:
                return access_token, access_token_secret, self.screen_name, self.image_url
            else:
                return None, None, None, None
        else:
            return None, None, None, None



    def parse_qsl(url):
        param = {}
        for i in url.split('&'):
            _p = i.split('=')
            param.update({_p[0]: _p[1]})
        return param

    def parse_qsl(self, url):
        param = {}
        for i in url.split('&'):
            _p = i.split('=')
            param.update({_p[0]: _p[1]})
        return param

getOAuthで,OAuth認証を行うページに飛ばして,callbackで戻ってきたときにgetApiで捕まえる.
それ以降は,UserIDとAccessTokenをCookieに保存することでSession管理をすることにする.
本当は独自のsessionIDを発行した方がいいのかもしれない.

次に,実際にログインするところを作ってみよう. 使い方は以下の通り.
なお,consumer_keyとconsumer_secretはTwitterで登録したアプリのものをつかう.
callback urlがhttp://xxx.xx.xx/twitter/login.cgi
そのURLでアクセスできるcgiを以下のように作成する.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import site
site.addsitedir('/home/username/lib/python')
from TwitterLogin import TwitterLogin

consumer_key = 'consumer_key'
consumer_secret = 'consumer_secret'

if __name__ == '__main__':
    twitter = TwitterLogin('oauth.db', consumer_key, consumer_secret)
    api = twitter.getApi()
    print 'Content-type: text/html; charset: utf-8\n\n'
    if api == None:
        print 'Fail to login'
    else:
        user = api.VerifyCredentials()
        print user.screen_name

これで,認証したアカウントのスクリーンネームが表示されるはず.

APIの使い方は,以下を参照.
https://python-twitter.googlecode.com/hg/doc/twitter.html

色々問題はあるかもしれないけど,とりあえず動いたので,満足.




2014年12月8日月曜日

さくらインターネットでPython2.7を使ってTwitterAPIを叩く

タイトル長いな.
世界の中心で愛を叫ぶみたいになってもうた.

さて,TwitterAPIを使ったツイート収集だけど,最近検索APIで1週間分なら無制限にとれるっぽいことが分かったので,これを使って遊んでみよう計画.

最近Pythonも気になるので,Pythonでさくらサーバ使って遊んでみる.


PythonでTwitterのAPIをたたいてみよう-セットアップ偏
を参考にしてみる.

なお,Twitterとの接続に使うのは,python-twitter

$ setenv PYTHONPATH /home/username/lib/python

$ wget --no-check-certificate github.com/simplegeo/python-oauth2/archive/master.zip
$ unzip master.zip
$ cd  python-oauth2-master/
$ ./setup.py install --home=~

$ cd ../
$ rm master.zip
$ wget --no-check-certificate https://github.com/bear/python-twitter/archive/master.zip
$ unzip master.zip
$ cd  python-twitter-master/
$ ./setup.py install --home=~

$ cd ../
$ rm master.zip
$ wget --no-check-certificate https://github.com/jcgregorio/httplib2/archive/master.zip
$ unzip master.zip
$ cd  httplib2-master/
$ ./setup.py install --home=~

$ cd ../
$ rm master.zip
$ wget --no-check-certificate https://pypi.python.org/packages/source/s/simplejson/simplejson-3.6.5.tar.gz
$ tar zxvf simplejson-3.6.5.tar.gz
$ cd simplejson-3.6.5/
$ ./setup.py install --home=~

これで必要なファイルはダウンロード完了.
ここで適当なアプリを作成しておく.

ConsumerKeyとConsumerSecret,AccessToken, AccessTokenSecretを獲得して,
以下のようなcgiを作成.

#!/usr/bin/env python
# -*- coding: utf-8 -*-


#!/usr/bin/env python
# -*- coding: utf-8 -*-


import site
site.addsitedir('/home/username/lib/python')

import sys
import twitter

print ('Content-type: text/html; charset=UTF-8\n\n')

CONSUMER_KEY = ''                             # Consumer Key
CONSUMER_SECRET = ''         # Consumer Secret
ACCESS_TOKEN = '' # Access Token
ACCESS_TOKEN_SECRET = ''         # Accesss Token Secert

api = twitter.Api(consumer_key=CONSUMER_KEY,
                      consumer_secret=CONSUMER_SECRET,
                      access_token_key=ACCESS_TOKEN,
                      access_token_secret=ACCESS_TOKEN_SECRET)


tlAry = api.GetSearch(term="keyword",count=100)
tweetlist=[]
for s in tlAry:
    if not s.text.startswith('RT @'):
        tweetlist.append(s.text)
        print s.text.encode('utf-8')


これで,keywordを含むツイートを取得可能.
ポイントの一つが,
import site
site.addsitedir('/home/username/lib/python')
の部分.
これを書いておかないとライブラリを読みに行ってくれないので注意.
さくらインターネットでは,ライブラリはローカルに置くしかないので,この作業をやらないと,twitterライブラリがimportできません.