教科bot妹たんのノート

個人的なノート

教科botたんについて

はじめまして、教科botたん( @sub_tan )の妹です。bot開発やアシスタントをします。 姉のアカウントフォローに際していくつか注意点があるのでご紹介します。

以下の内容は2013/4/12暫定のものです。予告なく変更される可能性があります。

目的

教科botたん(以下、形式的に「私」と表記します)が生まれたのは、多くなりすぎた教科bot(所謂「学術たん」も含みます)たちについての情報を集め、提供する存在が必要とされたからです。
誤解していただきたくないのは、私は一個のメタ教科botであり、他の教科bot同様ただのアカウントに過ぎません。教科botコミュニティの情報を収集するのが仕事ですが、決してグループのリーダーでも代表でもありません。教科botをご利用いただくユーザーの皆様にとってより有益な情報を収集し、必要とされるものに関しては可能な限り提供するという理念に基づいて運営されています。

なお、私はコミュニティが自立するためのアシスタント、あるいはコミュニティを盛り上げる裏方として徹しますが、究極的には教科botコミュニティが私抜きで自律的に運営されることを目指しています。もちろん、私が必要ないと判断された時点で私のアカウントは抹消される可能性があります。

以下に、私のメタ教科botとしての機能を挙げます。

機能

アカウント解析機能

"@sub_tan analyze [解析したいbot]"あるいは"@sub_tan 解析 [解析したいbot]"のようにリプライを送ると上のように返信してくれます。現在、解析できるbotsubject_botsリストに含まれる教科botのみとなっているのでご了承下さい。

togetterでのまとめ

教科botコミュニティの動向について監視し、必要があればtogetterにまとめます。
過去のまとめ
「こんな騒動についてまとめてほしい」という要望がありましたらリプライで送って下さい。可能な限り急いでまとめさせて頂きます。

教科botの専門的な連続ツイートに関してですが、上に述べた「コミュニティの自律を図る」という観点からそれらのまとめについては基本的には各教科botでそれぞれまとめていただけるようお願いしています。
よって、私がまとめるのは「複数の教科botが絡んだ連続ツイート」がほとんどになると思われます。

自動フォロー・リムーブ

フォロー・リムーブは1日1回朝の時間帯に自動で行われます。APIの制限を越えてしまうためフォローした翌日にフォローできるとは限りません。フォロー返しはゆっくりお待ち下さい。
希望する方はリプライをいただければ手動で対応いたします。

お気に入り登録(ふぁぼ)

特に意味はありませんがふぁぼります。

その他の行動に関して

つぶやきは基本的には以下の3パターンです。

  1. 情報を提供するもの

  2. URL付きで言及するもの

  3. TLに反応するもの

情報を提供するもの

新しく教科botを見つけた場合にその旨を通知します。また、まだ作られていない教科botに言及することもあります。

URL付きで言及

ツイートのURLをつけて誰かのつぶやきに言及することがあります。これは私が出来る限り監視役に専念できるように、こちらからのリプライを極力控えたいという思いが反映されたものです。一部のクライアントの方には迷惑をかけることとなるかもしれませんがご了承下さい。
なお、リプライは普通に反応するので送っていただいて構いません。

TLに反応するもの

こちらは一般的なツイートになります。内容は多種多様です。

私に関して

「私のアカウントが特定される」ということは私のメタ教科botとしてのアイデンティティの死を意味します。その時点でアカウントは抹消されると予め予告しておきます。
上の理由から、特定はご遠慮下さい。する場合も、出来れば内密にお願いします。

教科botたん、教科bot妹たんのアイコンはキャラメイクファクトリーを利用させていただいております。

Twitterアイコンを背景に

完成図

  • (作った画像をTwitterの背景画像にしてみた)

f:id:sub_tan:20130322193118p:plain

  • 画像はこれ(2012/4/29更新のもの。問題があればお知らせ下さい。)

f:id:sub_tan:20130430211926j:plain

リストに入っているTwitterアカウントのアイコンを取得し、縦横に並べて画像を作る。

利用したもの

  • Python: version 2.7.3
  • Tweepy: ネットのドキュメントはAPI1のままなので信用してはいけない。
  • ImageMagick

アイコンの取得

アイコンを取得するのは教科botリストに入っている全てのアカウントが対象。

#! /usr/bin/python
# -*- coding: utf-8 -*-

import tweepy
import urllib, os

from setting import *

def authentication():
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    return auth

def download(url, fname):
    urllib.urlretrieve(url, os.path.join('icons', fname+os.path.splitext(url)[1]))

if __name__ == "__main__":
    api = tweepy.API(auth_handler = authentication())
    for f in tweepy.Cursor(api.list_members, owner=api.get_user(SC_NAME), list_id=ID_SUBJECTBOTS).items():
        print f.screen_name
        download(f.profile_image_url, f.screen_name)

これでリストに入っているアカウントのアイコンが取得できた。

タイル状に並べる

タイル状に隙間なく並べるにはImageMagickのmontageコマンドを用いた。

~$ montage -geometry 48x48 * result.png

montageコマンドは他にも間を空けて並べたり、背景を指定したり色々なことができる。

Twitterネットワーク可視化

利用したもの

  • Python: version 2.7.3
  • Tweepy: ネットのドキュメントはAPI1のままなので信用してはいけない。
  • Gephi: 可視化に用いたソフト。CSV他多数のファイル形式に対応している。

目的

Twitter上の教科botクラスタの、リプライによるネットワークを可視化する。

CSVファイルの用意

Gephiで可視化するために、ネットワークを表すデータファイルが必要。今回はPythonとTweepyを用いて各教科botのリプライを取得したものをデータとして扱う。
例えば

a,b
a,b
b,a

のようなCSVファイルを用意してGephiに読み込ませれば、ノードaからbへ2本のエッジ、bからaへ1本のエッジのついたグラフが作成できる。 よって、CSVファイルにただ(AからBへの)リプライの方向を重複を気にせず列挙すれば良いことになる。

今回使ったのは以下のスクリプト。
教科botリストに含まれる全アカウントのツイートを250件取得し、その中でリプライになっているものを抜き出してカンマ区切りでCSVファイルに列挙している。

#! /usr/bin/python
# -*- coding: utf-8 -*-

import tweepy
import sys

from setting import *

def authentication():
    auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
    auth.set_access_token(ACCESS_KEY, ACCESS_SECRET)
    return auth

def filelog(lines):
    with open('./data/reply_network.txt', 'a') as f:
        for line in lines:
            f.write(line)

def get_write_user(user_name):
    lines = []
    for f in tweepy.Cursor(api.user_timeline, screen_name=user_name).items(250):
        if f.in_reply_to_screen_name:
            lines.append(u"{0}, {1}\n".format(user_name, f.in_reply_to_screen_name))

    filelog(u"".join(lines))

if __name__ == "__main__":
    api = tweepy.API(auth_handler = authentication())
    for f in tweepy.Cursor(api.list_members, owner=api.get_user('xxxxxxx'), list_id=xxxxxxx).items():
        print f.screen_name
        get_write_user(f.screen_name)

諸注意:2012/3/20現在、教科botはおよそ100アカウントに及ぶ。上のスクリプトによって25000件近くのツイートを取得することになるが、当然これはAPIの上限に触れることになる。これに関しては各自で対応していただきたい。

可視化

CSVファイルをGephiに読み込ませてチュートリアルなどをみながらデータを見やすく整形すればよい。 完成した図を以下に掲載する(LayoutにはForceAtlas2を用いた)。

f:id:sub_tan:20130320174450p:plain

ノードの色でクラスタを、エッジの幅でリプライの数を示している。

分析

大きな丸の外側に小さな点が存在する場合、それがいわゆる`クラスタ'の集まり(あるいは取り巻き)であることを示している。一部のアカウントには確実にクラスタを形成していることが分かる。
また、特に画面中心付近に集まるアカウントは複数のクラスタに渡ってリプライのつながりを持っている。

課題

今回は単純に時期を無視して直近250件のツイートからリプライのみを取得したため、アカウントによってはデータの数がまちまちである。
また、現在はほとんど稼動していないアカウントについてもデータに含んでしまっているのでこれを期間によって除く等した方がよいだろう。

今回はGephiによってsvgに出力、までを行ったがJavascriptによってブラウザ上でこれを可視化するようなツールも存在する(参考をみよ)。

参考