python/集合知3章

2009/02/04からのアクセス回数 6461

Amazonの欲しいものリスト

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

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

AWSを使って欲しいものリストを取得する

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

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

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

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

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

# -*- 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')

嗜好のクラスタ分析

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

# -*- 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')

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

amazon-UserAuthor.jpg

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

コメント

この記事は、

選択肢 投票
おもしろかった 7  
そうでもない 0  
わかりずらい 0  

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


(Input image string)

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