レベル: 中級 Nathan Harrington, Programmer, IBM
2009年 01月 06日 ソーシャル・ネットワーキングのデータを分析すると、プライベートでの関係やビジネスでの関係について、その内容、つながり、機会などを理解するために役立ちます。この記事ではソーシャル・ネットワーキングの重要なコンポーネントを抽出するためのツールとコードを紹介します。具体的には Twitter API を使ってソーシャル・ネットワーキングのデータをチャート化し、地図上での場所を特定し、そして視覚化します。
この記事では、相互の関係や影響を視覚化するアプリケーションを作成する方法の概念実証を行います。そのために、議論の中で主題としてよく使われるキーワードをグラフ化し、また友人のいる場所を示す地図を作成します。ここで紹介するコードでは Perl、Graphviz、CAIDA (Cooperative Association for Internet Data Analysis) の plot-latlong、Google Chart API を使用し、ソーシャル・ネットワークを分析する上で有用な視覚化を実現します。
ハードウェアとソフトウェアの要件
2000年以降に製造された PC であれば、ここで紹介するコードのコンパイルと実行に十分な処理能力を備えているはずです。この記事の執筆時点では、CAIDA の plot-latlong ツールを使って地図を作成するためには UNIX® ライクなオペレーティング・システムが必要です。それ以外の視覚化に関しては、幅広いプラットフォームで利用可能な curl と Graphviz を使って行います。
ソーシャル・ネットワーキングのデータを処理するために、Perl と XML::Simple、Geo::Coder::Yahoo、そして GD Perl モジュールが必要です。また、feh のような優れた画像ビューアーを使うことをお薦めします。ユーザーの画像を操作して標準的な PNG フォーマットにするために、ImageMagick の「変換」コンポーネントが必要です。これらのプログラムの入手方法は「参考文献」を参照してください。
これらのアプリケーションを Ubuntu などの Debian ベースの Linux® ディストリビューションにインストールするためには、ターミナル・ウィンドウから sudo apt-get install perl feh imagemagick curl graphviz というコマンドを入力します。plot-latlong のダウンロードは手動で行う必要があります。plot-latlong のアーカイブを解凍したら、.mapimages ディレクトリーと .mapinfo ファイルを ${HOME} ディレクトリーにコピーします。
この記事では Linux 用のコードを説明しますが、データの収集と処理のためのコードは Perl をサポートする任意のプラットフォーム (Microsoft® Windows® など) に容易に移植することができます。
Twitter API を使ってソーシャル・ネットワークのデータを抽出する
Twitter の RESTful インターフェース、そしてわかりやすい API ドキュメントは、ソーシャル・ネットワーキングの特性にアクセスするための非常に優れたツールとなります。Twitter API に関する詳細な情報は「参考文献」を参照してください。リスト 1 は buildViz.pl プログラムの最初のセットアップを示しています。
リスト 1. buildViz.pl、パート 1
#!/usr/bin/perl -w
# buildViz.pl create social networking visualizations
use strict;
use XML::Simple;
die "specify searchUser, username, password, mode " unless @ARGV == 4;
my( $search, $user, $pass, $mode ) = @ARGV;
my $cmd = "mkdir xml/; mkdir img/";
system( $cmd ) unless( -d "xml" && -d "img" );
# get user's profile data
$cmd = qq{ curl -u $user:$pass "http://twitter.com/users/show/$user.xml" };
$cmd .= qq{ > xml/$user.xml };
system( $cmd ) unless( -e "xml/$user.xml" );
# get profile image
my $xmlImg = XMLin( "xml/$user.xml" );
my $imgUrl = $xmlImg->{profile_image_url};
$cmd = qq{ curl "$imgUrl" > img/$user.png ; };
$cmd .= qq{ convert -format png img/$user.png img/$user.png };
system( $cmd ) unless( -e "img/$user.png" );
# get users' friends (people that user is following)
$cmd = qq{ curl -u $user:$pass "http://twitter.com/statuses/friends.xml" };
$cmd .= qq{ > xml/$user.friends.xml };
system( $cmd ) unless( -e "xml/$user.friends.xml" );
|
必要なモジュールと Twitter API のためのクレデンシャルを指定した後、ディレクトリーを作成し、指定されたユーザーの XML を取得します。ユーザーが更新を保護していない限り、どの Twitter ユーザーも視覚化できることに注目してください。適切なフォームであれば XML ファイルを 1 度だけ取得すればよいので、ローカルのファイルシステムに存在していない場合にのみ各 XML ファイルを取得します。最新のデータが必要な場合には、これらのファイルを手動で削除する必要があります。
次に、指定されたユーザーの画像が、そのユーザーの友人のリストと共にダウンロードされます。Twitter API のドキュメントに従って、この記事では「友人 (friends)」と「あなたがよく知っている人 (people you are following)」とを区別せずに使います。リスト 2 は指定されたユーザーの友人の友人を取得する動作の続きです。
リスト 2. buildViz.pl、パート 2
my $xmlFriend = XMLin( "xml/$user.friends.xml" );
for my $name ( keys %{ $xmlFriend->{user} } )
{
my $userFr = $xmlFriend->{user}->{$name}->{screen_name};
# get friends' friends
$cmd = qq{ curl -u $user:$pass "http://twitter.com/statuses/friends/};
$cmd .= qq{$userFr.xml?page=1" > xml/$userFr.friends.xml};
system( $cmd ) unless( -e "xml/$userFr.friends.xml" );
# get friends most recent 200 tweets
$cmd = qq{ curl -u $user:$pass "http://twitter.com/statuses/user_timeline/};
$cmd .= qq{$userFr.xml?count=200" > xml/$userFr.user_timeline.xml};
system( $cmd ) unless( -e "xml/$userFr.user_timeline.xml" );
# get friends image (requires imagemagick convert)
my $imgUrl = $xmlFriend->{user}->{$name}->{profile_image_url};
$cmd = qq{ curl "$imgUrl" > img/$userFr.png ; };
$cmd .= qq{ convert -format png img/$userFr.png img/$userFr.png };
system( $cmd ) unless( -e "img/$userFr.png" );
}#for each friend
|
ソーシャル・ネットワーキングのつながりを調べてみると、友人が多くの友人を共有していることに気付くのではないでしょうか。unless ( -e を付けると一意の XML ファイルのみが取得されるため、Twitter サーバーの負担を減らすことができます。
「友人の友人」リストに加え、各友人のタイムラインとその友人のプロフィール画像も取得します。リスト 1 と 2 の内容を buildViz.pl ファイルとして保存し、perl buildViz.pl searchUser yourUserName yourPassword retrieve というコマンドを入力します。この場合の searchUser は、ソーシャル・ネットワーキングのデータを取得する対象となる Twitter ユーザーのユーザー名です。yourUserName と yourPassword は認証のためのクレデンシャルであり、retrieve は XML のダウンロードのみを指定するためのプレースホルダーです。
buildViz.pl プログラムは img サブディレクトリーと xml サブディレクトリーを作成し、そのサブディレクトリーに下記のようなファイルを追加します。
リスト 3. img ディレクトリーと xml ディレクトリーの例
87953 2008-11-26 08:21 xml/agberg.friends.xml
187263 2008-11-26 08:21 xml/agberg.user_timeline.xml
85451 2008-11-26 08:23 xml/alphaworks.friends.xml
50967 2008-11-26 08:23 xml/alphaworks.user_timeline.xml
85854 2008-11-26 08:21 xml/andysc.friends.xml
163570 2008-11-26 08:21 xml/andysc.user_timeline.xml
83236 2008-11-26 08:23 xml/BillHiggins.friends.xml
177740 2008-11-26 08:23 xml/BillHiggins.user_timeline.xml
...
5626 2008-11-26 08:21 img/agberg.png
5753 2008-11-26 08:23 img/alphaworks.png
2080 2008-11-26 08:21 img/andysc.png
4527 2008-11-26 08:23 img/BillHiggins.png
|
Graphviz を使って相互関係を示すデータを作成し、視覚化する
ある特定のユーザーがそのユーザーの友人にどんな影響を及ぼすのかを知るための 1 つの方法として、そのユーザーの友人の数を調べる方法があります。理論的には、友人の数が少ないユーザーの方がソーシャル・ネットワーキングの更新を追跡する時間や質問に答える時間が多いはずです。リスト 4 の内容を buildViz.pl の 53 行目に追加します。
リスト 4. visualizeInfluence サブルーチン
visualizeInfluence() if( $mode eq "influence" );
### begin subroutines
sub visualizeInfluence
{
my %frHash = ();
my $xmlFriend = XMLin( "xml/$user.friends.xml" );
for my $name ( keys %{ $xmlFriend->{user} } )
{
my $userFr = $xmlFriend->{user}->{$name}->{screen_name};
my $xmlSec = XMLin( "xml/$userFr.friends.xml" );
$frHash{ $userFr } = 0;
for my $linkUser( keys %{ $xmlSec->{user} } ){ $frHash{$userFr}++ }
}#for each friend
my $infList = "1 $user\n";
for my $name ( sort {$frHash{$a} <=> $frHash{$b}} keys %frHash )
{
$infList .= "$frHash{$name} $name\n";
last if( ($infList =~ s/\n/\n/g) == 15 ); # exit after fifteen lines
}# for each key sorted
chop($infList); # remove last newline
$cmd = qq{ echo "$infList" | perl twitdot.pl $user img > influence.fdp ; };
$cmd .= qq{ fdp influence.fdp -Tpng -o graphviz_influence.png };
system($cmd);
}#visualizeInfluence
|
友人それぞれの友人リストを数え、「影響を及ぼす可能性のある」友人のうち上位 15 人を $infList 変数に追加します。このカウント値と友人の名前の組み合わせが twitdot.pl プログラムへの入力として渡されます。developerWorks の記事「Explore relationships among Web pages visually」のコードをベースにして、twitdot.pl プログラムは Graphviz の fdg グラフ生成構文を生成します。この方法での視覚化に必要な変更の詳細を知るためには、その記事と「ダウンロード」セクションのコードを調べてください。
次に、fdp グラフ構文ファイルを使って fdp を呼び出し、視覚化を行います。コマンド perl buildViz.pl searchUser yourUserName yourPassword influence を使ってプログラムを実行し、適当な画像ビューアーで出力ファイル (graphviz_influence.png) を表示します。図 1 はこの表示の一例を示しています。
図 1. graphviz_influence.png の例
矢印の線の太さと色は各友人の「影響力の強さ」を示しており、この「影響力の強さ」は各友人が持つ友人の数に基づいています。
Google chart API を使ってキーワード・データを作成し、視覚化する
影響力は評価できましたが、ではその内容についてはどうでしょう。リスト 5 のコードを buildViz.pl の 87 行目に追加し、メッセージの履歴の中で最もよく使われる単語を示すチャートを作成します。
リスト 5. visualizeKeywords サブルーチン
sub visualizeKeywords
{
my %wordHash = ();
my $xmlFriend = XMLin( "xml/$user.friends.xml" );
for my $name ( keys %{ $xmlFriend->{user} } )
{
my $userFr = $xmlFriend->{user}->{$name}->{screen_name};
my $xmlSec = XMLin( "xml/$userFr.user_timeline.xml" );
for my $linkUser( keys %{ $xmlSec->{status} } )
{
my $msgText = $xmlSec->{status}->{$linkUser}->{text};
for my $key( split " ", lc($msgText) ){ $wordHash{$key}++ }
}#for each text update
}#for each friend
my $tStr = "";
my $chlStr = "";
for my $word ( sort {$wordHash{$b} <=> $wordHash{$a}} keys %wordHash )
{
next unless( length($word) > 10 ); # only print 'long' entries
$tStr .= "$wordHash{$word},"; # append url data
$chlStr .= "$word|"; # append url labels
last if( ($tStr =~ s/,/,/g) == 10 ); # exit loop after first ten words
}#for the top words
chop($tStr); chop($chlStr); # remove trailing delimiters
$cmd = qq{ curl "http://chart.apis.google.com/chart?cht=p&chd=t:$tStr};
$cmd .= qq{&chs=1000x300&chl=$chlStr" > chart_keywords.png };
system($cmd);
}#visualizeKeywords |
各友人のタイムラインから得られる各単語は %wordHash 変数の中に記録されます。より重要な単語を評価する上で、グラフ化する単語は最低 10 文字以上で構成されている必要があります。この要件を満たす上位 10 位までの単語とその頻度を URL の中に含め、この URL と Google Chart API を使ってチャートを生成します。この URL のフォーマット、および Google Chart で使用できるオプションについての詳細は、「参考文献」セクションを参照してください。
下記のサブルーチンの呼び出しを buildViz.pl の 54 行目に追加します。
リスト 6. visualizeKeywords ロジックの呼び出し
visualizeKeywords() if( $mode eq "keywords" );
|
コマンドとして perl buildViz.pl searchUser yourUserName yourPassword keywords を使い、キーワードの視覚化を実行します。出力される chart_keywords.png ファイルを画像ビューアーで表示すると、図 2 に示すようになります。
図 2. chart_keywords.png の例
plot-latlong を使って地理的な場所のデータを作成し、視覚化する
誰に影響が及ぶのかをチャート化し、またどんなことが言われているのかをチャート化したので、今度はそうした人達が地球上のどこにいるのかを視覚化することにします。リスト 7 のコードを buildViz.pl の 125 行目に追加します。
リスト 7. visualizeLocations サブルーチン
sub visualizeLocations
{
use Geo::Coder::Yahoo;
my $geocoder = Geo::Coder::Yahoo->new(appid => 'my_app' );
open( LOCOUT, ">locationNames" ) or die "no locationNames out\n";
open( COORDS, ">cityCoords" ) or die "no cityCoords out \n";
# record all friends geographical locations
my $xmlFriend = XMLin( "xml/$user.friends.xml" );
for my $name ( keys %{ $xmlFriend->{user} } )
{
my $userLoc = $xmlFriend->{user}->{$name}->{location};
my $imgName = $xmlFriend->{user}->{$name}->{screen_name};
my $location = $geocoder->geocode( location => "$userLoc" );
for my $coords( @{$location} )
{
my %hashRef = %{ $coords };
print "$hashRef{latitude} $hashRef{longitude} # $userLoc\n";
print COORDS "$hashRef{latitude} $hashRef{longitude} # $userLoc\n";
print LOCOUT "$userLoc ##$imgName.png\n";
}#for coordinates returned
}#for each friend
close( COORDS ); close( LOCOUT );
# draw the map
$cmd = qq{ cat cityCoords | perl plot-latlong -s 5 -c };
$cmd .= qq{ > cityMap.png 2>cityPixels };
system( $cmd );
# Annotate the map with the first 7 friends information
$cmd = qq{ head -n7 locationNames > 7.locationNames ; };
$cmd .= qq{ head -n7 cityPixels > 7.cityPixels ; };
$cmd .= qq{ perl worldCompositeMap.pl 7.cityPixels 7.locationNames };
$cmd .= qq{ cityMap.png worldCityMap_annotated.png };
system($cmd);
}#visualizeLocations
|
この場合も以前 developerWorks で公開されたコードを利用することにし、「Perl、GD、および plot-latlong を使用して、データをプロットした地図を作成する」の中で詳細に説明されている worldCompositeMap.pl プログラムを使います。素晴らしい Geo::Coder::Yahoo モジュールを使用すると、友人のいる場所の座標を比較的容易に cityCoords ファイルに記録することができ、また関連の名前と画像データを locationNames ファイルに記録することができます。
次に、最初の 7 人の友人の場所と ID を worldCompositeMap.pl に渡して描画します。worldCompositeMap.pl プログラムの詳細については、上記の記事へのリンクをたどるか、あるいは「ダウンロード」セクションを参照してください。
リスト 8 に示すサブルーチンの呼び出しを buildViz.pl の 55 行目に追加します。
リスト 8. visualizeLocations ロジックの呼び出し
visualizeLocations() if( $mode eq "locations" );
|
コマンド perl buildViz.pl searchUser yourUserName yourPassword locations を実行して worldCityMap_annotated.png ファイルを作成し、このファイルを画像ビューアーで開くと、図 3 のようになります。
図 3. worldCityMap_annotated.png の例
まとめと、その他の例
ここで紹介したコードとツールを使うとさまざまなものを視覚化できるため、ソーシャル・ネットワークの特性分析が容易になります。これらのツールを使ってキーワードを追跡すれば、キーワードが友人のネットワークに広がっていく様子を視覚化することができます。特定のリンクへのパスを視覚化すると、世界中のさまざまな活動領域にパスが伝わる様子を見ることができます。皆さんの雇用主が行うチャートの作成や分析を補助し、雇用主がソーシャル・ネットワーキングの持つ価値を深くまで理解できるように役立ててください。
ダウンロード | 内容 | ファイル名 | サイズ | ダウンロード形式 |
|---|
| Sample code | os-socialtoolstwitterVisualizations.0.1.zip | | HTTP |
|---|
参考文献 学ぶために
製品や技術を入手するために
議論するために
著者について
記事の評価
|