#freeze
[[python/集合知3章]]
#contents

2009/02/04からのアクセス回数 &counter;

** Amazonの欲しいものリスト [#pa498705]
Amazonの欲しいものリストを使うと特定の人の欲しいものリストを
取得することができます。

[[Amazonのサイト>http://www.amazon.co.jp]]に入り、「欲しいものリスト」
をクリックすると欲しいものリストサーチが入力ボックスがあります。
ここに、例えばaと入力すると、名前にAが付く人の一覧がでます。
人の名前をクリックするとその人の欲しいものリストが表示される仕組みに
なっています。

** AWSを使って欲しいものリストを取得する [#tcc73476]
Amazonが提供するAWSを使って、欲しいものリストを取得する方法を説明します。

AWSでは、ユーザ名またはメールアドレスでユーザを検索する機能を提供しています。

これと指定されたユーザの欲しいものリストを出力する機能を組み合わせて、
ユーザの欲しいものリストを作成します。

以下のtest2.pyがAmazonの欲しいものリストを取得するプログラムです。

処理におよそ30分ほどかかります。&ref(amazon.txt); をダウンロードして
お使い下さい。

#pre{{
# -*- coding: utf-8 -*-
import japanese
import urllib2
import re

from BeautifulSoup import BeautifulSoup

awsKey = '1DDNRNZZETYB32XAG2G2'
awsURL = 'http://webservices.amazon.co.jp/onca/xml?Service=AWSECommerceService'
searchURL = awsURL + '&Operation=ListSearch&ListType=WishList&ResponseGroup=ListMinimum'
lookupURL = awsURL + '&Operation=ListLookup&ListType=WishList&ResponseGroup=ListFull,Small'

itemowners = {}
users = []

alpha='abcdefghijklmnopqrstuvwxyz'

for i in range(len(alpha)):
    for uPage in range(1,4):   
        url = searchURL + '&AWSAccessKeyId=' + awsKey + '&Name=' + alpha[i] + '&ListPage=' + str(uPage)
        c=urllib2.urlopen(url)
        soup=BeautifulSoup(c.read())
        listIds=soup('listid')
        for listId in listIds:
            iPage = 1
            nPage = 1
            while iPage <= nPage:
                id=listId.contents[0]
                users.append(id)
                url2= lookupURL + '&AWSAccessKeyId=' + awsKey + '&ListId=' + id + '&ListPage=' + str(iPage)
                iPage += 1
                c=urllib2.urlopen(url2)
                soup2=BeautifulSoup(c.read())
                if iPage == 1:
                    totalPages = soup2('totalpages')
                    nPage = int(totalPages[0].contents[0])
                #titles=soup2('title')
                titles=soup2('author')
                for title in titles:
                    goods=title.contents[0]
                    itemowners.setdefault(goods,[])
                    itemowners[goods].append(id)

out=file('amazon.txt', 'w')
out.write('Item')
for user in users: out.write('\t' + user)
out.write('\n')
for item,owners in itemowners.items():
    if len(set(owners)) > 2:
        out.write(item)
        for user in users:
            if user in owners: out.write('\t1')
            else: out.write('\t0')
        out.write('\n')
}}

** 嗜好のクラスタ分析 [#dbf3b830]
得られた著者とユーザの欲しいものリストのデータに対して、tanimoto係数を距離として
クラスタ分析をします。

#pre{{
# -*- coding: utf-8 -*-
import japanese
import clusters

wants,people,data=clusters.readfile('amazon.txt')
clust=clusters.hcluster(data, distance=clusters.tanamoto)
clusters.drawdendrogram(clust, wants, png='amazon.png')
}}

分析結果は、以下の通りです。

&ref(amazon-UserAuthor.jpg);

- 恩田 睦、東野 圭吾は、ともに直木賞作家
- 勝間 和代、マーク 富岡、茂木健一郎、本田 直之、大前 健一

のグループもうまくまとまっている感じがします。

** コメント [#tbf261fc]
この記事は、

#vote(おもしろかった[5],そうでもない[0],わかりずらい[0])

皆様のご意見、ご希望をお待ちしております。

#comment_kcaptcha

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
SmartDoc