ソーシャル・ネットワーキングをオープンソースのツールで視覚化する

Graphviz、Google Chart API、そして CAIDA の plot-latlong ツールを使ってソーシャル・ネットワークの特性を分析する

ソーシャル・ネットワーキングのデータを分析すると、プライベートでの関係やビジネスでの関係について、その内容、つながり、機会などを理解するために役立ちます。この記事ではソーシャル・ネットワーキングの重要なコンポーネントを抽出するためのツールとコードを紹介します。具体的には 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 ユーザーのユーザー名です。yourUserNameyourPassword は認証のためのクレデンシャルであり、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 の例
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 の例
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 の例
worldCityMap_annotated.png の例

まとめと、その他の例

ここで紹介したコードとツールを使うとさまざまなものを視覚化できるため、ソーシャル・ネットワークの特性分析が容易になります。これらのツールを使ってキーワードを追跡すれば、キーワードが友人のネットワークに広がっていく様子を視覚化することができます。特定のリンクへのパスを視覚化すると、世界中のさまざまな活動領域にパスが伝わる様子を見ることができます。皆さんの雇用主が行うチャートの作成や分析を補助し、雇用主がソーシャル・ネットワーキングの持つ価値を深くまで理解できるように役立ててください。


ダウンロード

内容ファイル名サイズ
Sample codeos-socialtoolstwitterVisualizations.0.1.zip---

参考文献

学ぶために

製品や技術を入手するために

  • UNIX や Linux のユーザーで Perl モジュールのインストールに慣れていない場合には、Andreas J. Konig による CPAN モジュールをインストールすると他のモジュールのインストールを自動化することができます。
  • 下記の Perl モジュールとすべての依存関係を CPAN から入手して追加する必要があります。
  • グラフ視覚化ソフトウェア Graphviz は AT&T Research で開発されました。
  • Tom Gilbert による画像ビューアー、feh をダウンロードしてください。
  • 最高の画像操作ソフトウェアが必要な場合には、Gimp を入手してください。
  • CAIDA (Cooperative Association for Internet Data Analysis) は他の素晴らしいツールと共に plot-latlong プログラムを作成し、ホストしています。
  • ImageMagick はビットマップ画像の作成、編集、合成のためのソフトウェア・スイートです。
  • curl は URL 構文を使ってファイルを転送するためのコマンドライン・ツールです。
  • 皆さんの次期オープンソース開発プロジェクトを IBM ソフトウェアの試用版を使って革新してください。ダウンロードまたは DVD で入手することができます。
  • IBM 製品の試用版をダウンロードし、DB2® や Lotus®、Rational®、Tivoli®、WebSphere® などが提供するアプリケーション開発ツールやミドルウェア製品をお試しください。
  • Perl.orgPerl をダウンロードするか、あるいは Perl に関する詳細資料を読んでください。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Open source
ArticleID=368228
ArticleTitle=ソーシャル・ネットワーキングをオープンソースのツールで視覚化する
publish-date=01062009