はじめに
3連休中あまりに暇だったので、動画に付いているタグによってアニメ間の距離はどう見えるかを調べた結果と作ったプログラム群。
今回対象としているアニメ
2010-2014年までのアニメ、823作品
Wikipediaから取得
手順
アニメ一覧の取得(Wikipediaページのparse)
よく考えたらxmlが取得できるのでhtmlなどparseする必要はなかった...
python getDataFromWikipedia.py > animes_2010-2014.txt
検索結果の取得
apiにより取得したJSONをファイルに出力する
制限があるため、1秒間に2回、100件ずつ取得する。
また、検索結果が1700件以上あっても仕様上1700件までしか取得できない。
流れとしては以下の通り
- 取得対象名がタイトル/説明文/タグのいずれかに含まれているものを取得
- 検索結果として得られた動画に付いているタグをJSON形式で100件取得する。
- 100件をファイルに保存する
関係無い動画が取得される可能性はありますが、今回はそれもそのアニメ自体の影響力の強さと考えて特にフィルターをかけたりはしていません。
while read line;do;python getSearchResult.py $line;done < animes_2010-2014.txt
JSON→tsv 変換処理
変換処理によって横列がタグの出現回数, 縦列がコンテンツとするtsvファイルを作成する。
python tagParseJSON.py animes > animes_tag.tsv
変換処理によって832*354,117のデータが得られた
tSNEによる可視化
python mds_plot.py animes_tag.tsv
Hierachical clusteringによる可視化
Dendrogramを描きますが、これに関してはRの方が楽なのでRでやります。
ですがこのままプロットしたところで確認できるようなものにならないのは分かりきっているので、ctcライブラリを使用してDendroscope用のデータを作成します。
ちなみにctcライブラリはFedora 20で上手くインストール出来なかったのでこの部分はDebianを使っています。
出来上がったnewick.txtには以下のように何故かダブルクォーテーションが付いていてエラーを吐いたのでダブルクォーテーションを消します。
"(TIGER:82.6491092539521,(Fate%slZero:16.5373639856817,(Free!:18.3057504854552, (Angel_Beats!:72.6269302031301,(STEINS%scGATE:69.8680393971481, (R-15:31.1784166447384,(WORKING!!:46.0964574970961,(TARI_TARI:23.1396305160703, [中略] 72.6269302031301):18.3057504854552):16.5373639856817):82.6491092539521);"
まとめ
- アニメ間の距離は続編が近い傾向にある。しかし続編間の距離が非常に遠くなったものもあった。
- 動画数が非常に少ないアニメが2~3割あると見られ、それらが正常にプロットされておらず、何らかの閾値を設ける必要がある。
- 説明変数が多すぎて上手くクラスタが構成されない
- 次元縮約を行わない場合に、次元の呪いによる球面集中現象が見られた
そして結果をまとめるのが一番大変だった...
結果については色々と考察したのですが、やはり変数が多すぎることと手順に問題があること(距離の算出とか)から、検索数などでフィルターをかけて距離の算出法を見直せば何か見えてくるかもしれません。
いずれにしろかなりやりがいのあるデータですので今後も進めてまいります。
参考
Mashup Awards 10向け提供APIガイド
20140222 Tokyo.R#36 RでSPADEとviSNEを使って次元削減と可視化
Getting Genetics Done: Hierarchical Clustering in R
"Package ‘ctc’"
python - How do I send a POST request as a JSON? - Stack Overflow
Noel O'Blog: Convert distance matrix to 2D projection with Python
matplotlibで、判例やグラフタイトルに日本語を使用する - Symfoware