Home > 4月, 2008

2008.04.28

Google Search REST API を Python から使う

Google Search REST API は,利用中止になっていた SOAP Search API を正式に置き換えるもので,外部のウェブアプリケーションから,Google の検索エンジンを利用するためのRESTインタフェースです.上に貼ったリンクの説明が詳しいですが,

  • ライセンスキー不要
  • クエリ数に関する制限がない
  • 以前よりも簡単に使える
  • Web検索,イメージ検索,ニュース検索,ビデオ検索,ローカル(地図)検索,ブログ検索,ブック検索が利用可能
  • 有効,かつ正確なHTTP Refererヘッダを送信する必要がある
  • 一つのAPI呼び出しで,最大8件までしか検索結果を得られない
  • 検索結果は最大でも32件までしか得られない.
  • 利用規約が厳しい

という特徴があります.サービスの基本的な使い方は,クエリを引数として埋め込んだ検索サービスのURLにアクセスし,返ってくるJSONオブジェクトを解析するというものです.私の名前(Naoaki Okazaki)で検索サービスを呼び出す例です.

面白そうなので,早速Pythonから呼び出すコードを書いてみました.動かすためには,jsonlibをインストールする必要があります.モジュールとしてはsearch関数のみをエクスポーズしています.コマンドラインから動かす場合は,引数をクエリとして,RESTのレスポンスのすべてを表示し,さらに,その中から検索ヒット件数を抜き出しています.

#!/bin/env python

import urllib
import urllib2
import jsonlib  # http://pypi.python.org/pypi/jsonlib/

# CHANGE the referer URL below FOR YOUR OWN.
REFERER = 'http://www.change-this.org/'

BASEURLS = {
    'web': 'http://ajax.googleapis.com/ajax/services/search/web',
    'local': 'http://ajax.googleapis.com/ajax/services/search/local',
    'video': 'http://ajax.googleapis.com/ajax/services/search/video',
    'blog': 'http://ajax.googleapis.com/ajax/services/search/blogs',
    'news': 'http://ajax.googleapis.com/ajax/services/search/news',
    'book': 'http://ajax.googleapis.com/ajax/services/search/books',
    'image': 'http://ajax.googleapis.com/ajax/services/search/images',
}

def search(query, referer=REFERER, type='web', **kwargs):
    # Find the URL for the specific type of Google AJAX Search API.
    baseurl = BASEURLS.get(type)
    if baseurl is None:
        raise TypeError

    # Add the necessary arguments.
    kwargs.update({
        'v': 1.0,
        'q': query,
    })

    # Build the URL.
    url = '?'.join((baseurl, urllib.urlencode(kwargs)))

    # Add a referer HTTP header to the request.
    req = urllib2.Request(url)
    req.add_header('Referer', referer)
    f = urllib2.urlopen(req)

    # Translate the JSON response to a Python object.
    return jsonlib.read(f.read())

if __name__ == '__main__':
    import sys
    query = sys.argv[1]

    res = search(query, hl='en')
    # Show the full response from the service.
    print res
    # Show the Google count for the query.
    print res['responseData']['cursor']['estimatedResultCount']

上のサンプルプログラムを使うときは,

  • REFERERのアドレスを自分のものに置き換えること
  • Googleが出している利用規約を守る

ことに注意してください.

search関数のオプショナル引数は,Googleのサービス側にパラメータとして素通りさせています.各サービスに対して,どのような引数が使えるのか(例えば言語を設定するhlなど)は,リファレンスマニュアルを参照してください.

    RESTインタフェースは,今回初めて使いましたが,SOAPと比べるとかなりお手軽ですね.JavaScriptで扱うのが簡単なのは当たり前ですが,Pythonから使う場合でも,JSONライブラリがあればすぐに出来ます.Pythonでは,すでにSOAPのライブラリよりもJSONライブラリの方が充実している感じになっています.やっぱりXMLはコンピュータが交換するフォーマットとして,まだシンプルさが欠けていたのかも知れませんね.

    2008.04.26

    libLBFGS 1.4 released

    libLBFGS (L-BFGS library) のバージョン1.4をリリースしました.変更点は以下の通りです.

    • OWL-QNルーチンのバグ修正
    • 直線探索アルゴリズムとしてMore&Thuenteの方法と,backtracking法を選べるようにした
    • configureスクリプトの追加
    • SSE2への透過的な対応
    • gccでのSSE/SSE2対応

    OWL-QNルーチンのバグは,直線探索(line search)を行うときに,目的関数の勾配を適切に修正していなかった問題です.前々から,最大エントロピー法やロジスティック回帰モデルのL1正則化をlibLBFGSでやると,学習の早い段階にエラーが発生してしまう現象が発生していました.今回のリリースにより,目的関数の最小化がきちんと進むことを確認しています.なお,OWL-QNを無効にしている場合(つまり, lbfgs_parameter_t::orthantwise_c を0に設定している場合;デフォルト)は,このバグの影響を受けません.

    オリジナルのL-BFGSのソースコードでは,直線探索法として, MoreとThuenteのアルゴリズムが実装されています.これに対し,L-BFGSのいくつかの実装では,backtracking法が用いられているようです.backtracking法は,ステップ幅1.0を初期値とし,ステップ幅を半分ずつ短くしていく方法です.このアルゴリズムは実装が簡単なのですが,ステップ幅を見つけるまでに,目的関数の評価を何回か繰り返すことがあります.CRFや最大エントロピー法では,目的関数,すなわち確率モデルの対数尤度の計算に時間がかかるので,backtracking法は学習時間という観点で,やや不利になります.

    これに対し, MoreとThuenteのアルゴリズムは,目的関数の現在の探索点における値と勾配を用い,二次関数や三次関数で適切に補間を行うことで,効率よく勾配ステップを見つけるというものです.L-BFGS法自体は,理解してしまえば実装が簡単なのですが,MoreとThuenteのアルゴリズムは場合分けがやや複雑で,バグを出さないように実装するのは大変だと思います.今回のリリースでは,L-BFGS法の勉強のために,backtracking法とMoreとThuenteのアルゴリズムを切り替えられるようにしてみました.

    ぼちぼちとlibLBFGSを利用するソフトウェアが出てきたので,autoconf/automakeでconfigureスクリプトを作り,簡単にビルドできるようにしました.make install をすると,ヘッダとライブラリ一式がインストールされます.単に別のソフトウェアから利用したいだけであれば,lbfgs.c, lbfgs.h, arithmetic_ansi.h だけを取り出して,一緒にビルドしてもOKです.

    また,SSE/SSE2ルーチンの使い方が分からないというメールが寄せられたので, ./configure –enable-sse2 でSSE2ルーチンを有効にするようにしました(詳しくはREADME参照).このようにしてビルドされたlibLBFGSは,常にSSE2を利用するようになります.ただし,libLBFGSは,現在のCPUにおいてSSE2が利用できるかどうかチェックしないので,SSE2が利用できないCPUで不用意に動かすと,クラッシュしてしまうと思います. SSE2で得られる速度向上は10%弱なので,特別な理由がなければ,SSE2ルーチンは使わなくて良いと思います.ちなみに,SSE2ではなくSSEを使うと,すべての浮動小数点演算をdouble(64 bit)からfloat(32 bit)に変更しなければなりません.この場合,libLBFGSの演算精度のパラメータ(lbfgs_parameter_t::xtol)を調整する必要があり,エキスパートでないとSSEルーチンは使いこなせないと思います.

    今までのlibLBFGSでは,SSE/SSE2を利用するときに,変数の数を8の倍数にする必要がありましたが,このバージョンでは,その制約が撤廃されました.また,SSE/SSE2では,変数の配列のアドレスを16でアライメントしなければならないので,そのための関数lbfgs_malloc/lbfgs_freeを追加しました.

    2008.04.25

    NOW 69

    NOW 69 を購入.購入前から知っていた曲の数は,Disc 1で10/22,Disc 2で 15/20 .Disc 1で50%を割り込んでしまったけど,忙しかったから仕方がないか.

    Disc 1の1曲目は,ポストAmy Winehouseと注目されているDuffyの「Mercy」.歌はAmyの方がやっぱり上手いと思うけど.8曲目の「Work」は,先にリリースされていたオリジナル・アルバムでのバージョンは全然ダメなアレンジで,このFreemasonsのリミックスで生まれ変わって売れたらしい.14曲目のKylie Minogueの「Wow」は,いかにもKylieらしいノリのよい曲.

    Disc 2の1曲目を飾る「Chasing Pavements」 を歌うAdeleは,Disc 1のDuffyと並んで,「New Amy」と呼ばれているらしい.6曲目の「Goodbye Mr A」は,「Worried About Ray」でメジャーになったHoosiersの曲.9曲目,Scouting for Girlsの「Elvis Ain’t Dead」は,タイトルを知らないとこの歌詞がサビで何回も発せられているのに気づきません.15曲目は,最近お気に入りのAmy MacDonaldの「This Is The Life」.16曲目は,今年のBrits Awardで女性ソロ歌手部門の賞を取ったKate Nashの「Pumpkin Soup」.PVは「猫が雑」.

    2008.04.23

    Game – Perfume

    秋葉原Tower Recordで限定版を購入.邦楽を買うのはYUIの「CAN’T BUY MY LOVE」以来,一年振り.

    文句なしに良いと言えるアルバムです.メロディをきちんと作っているし,曲の展開なども,聴いていておもしろいです.アレンジがややありがちなので,もう少し頑張って洋楽に近づけて欲しいところ.ただ,軽めの声質と歌唱力のバランスを考えれば,このくらいが丁度よいのかもしれません.歌詞は,ちょっと年齢層が低いけど,他のアイドルの歌のように恥ずかしくなるものではないので,聴けます.ヴォーカルにピッチシフトを積極的に使っているので,歌唱力は謎です.ダンスも上手いと言われているけど,アイドルにしては上手い程度かなぁ.好きな曲は,01「ポリリズム」,05「チョコレイト・ディスコ」,06「マカロニ」.

    結成して8年,すぐに売れそうな路線に行くのではなく,よく辛抱強くやってきたものだなぁと感心します.これからもアーティストとして頑張ってほしいと思います.