最新 RSS

horiday blog

2009/01/31

[perl] flickr API の flickr.tags.getClusters

職場で flickr API の flickr.tags.getClusters を使ってタグから関連する別のタグを得たいのでサンプルを作って欲しいと言われました.

flickr API は使ったことがなかったので,API Keyを作ってさっそく試してみました.

Flickr のサンプルは沢山あるだろうと思っていたのですが,手頃なサンプルがなくてFlickr and Perlが一番まともな感じでした.

問題の flickr.tags.getClusters はサンプルコードを Web 検索で見つけられなかったので,自分で適当に作ってしまいました.flickr.tags.getClusters で得られる結果を xpath でゴリゴリできるかと思っていたのですが,やり方がわからなかったので,結果の $response をそのままゴリゴリしました.このやり方は絶対間違っていそう...

下記のコードを実行すると,無事タグのクラスタが得られました.

% perl get-tagclust.pl schubert
tag: schubert
$VAR1 = {
  '1' => {
    'musica' => 1,
    'music' => 1,
    'piano' => 1
  },
  '0' => {
    'wien' => 1,
    'austria' => 1,
    'vienna' => 1
  },
  '2' => {
    'mozart' => 1,
    'haydn' => 1,
    'beethoven' => 1
  }
};

結果を見るとおそらく共起頻度の高いものをクラスタリングしているのでしょうね.

#!/usr/bin/env perl
# get-tagclust.pl
# usage:
#   get-tagclust.pl <tag>
use strict;
use Data::Dumper;
use Flickr::API;
local $Data::Dumper::Indent = 1;

my $tag = shift @ARGV || "cows";
my %tagclust = get_flickrtagclust($tag);

print "tag: $tag\n";
print Dumper \%tagclust;

sub get_flickrtagclust {
 my $tag = shift;
 my $api_key = 'xxx';
 my $api_secret = xxx'';
 
 my $api = new Flickr::API(
			    { 
			     'key' => $api_key,
		     'secret' => $api_secret,
			    });
  my $response = $api->execute_method('flickr.tags.getClusters',
			      {
				       'key' => $api_key,
				       'tag' => $tag,
			      });
  my @tmp = @{$response->{tree}{children}[1]{children}};
  my $count = 0;
  my %clust;
  foreach my $i (@tmp) {
    my @list = ();
    if ($i->{name} eq "cluster") {
      foreach my $j (@{$i->{children}}) {
	if ($j->{children}[0]->{content}) {
	  push @list, $j->{children}[0]->{content};
	}
      }
    }
    if (@list > 0) {
      foreach (@list) {
	$clust{$count}{$_}++;
      }
      $count++;
    }
  }

  return %clust;
}

関連リンク