読者です 読者をやめる 読者になる 読者になる

CORDEA blog

Programming及びFedora21等のLinux OSのことが多めです。

【Python】niconicoのコンテンツ検索apiを用いたアニメ間距離の可視化【R】

Python R

はじめに

3連休中あまりに暇だったので、動画に付いているタグによってアニメ間の距離はどう見えるかを調べた結果と作ったプログラム群。

今回対象としているアニメ

2010-2014年までのアニメ、823作品
Wikipediaから取得

主に使用しているライブラリ等

  • Python
    • scikit-learn
    • matplotlib
  • R
    • ctc
    • amap

やってみて感じたこと

問題点
  • 1700件までしか取得できないapi仕様
  • モノによってノイズが多く入り込む可能性がある
  • アニメによって数の差がかなりある
利点
  • 勢いのあるサービスであり、今後もデータが増える見込みがある
  • サムネイル画像習得による大規模画像解析が可能
  • 使い方次第でビッグデータになり得る


 
 

手順

ソースコードGitHubにあります。

アニメ一覧の取得(Wikipediaページのparse)

よく考えたらxmlが取得できるのでhtmlなどparseする必要はなかった...

python getDataFromWikipedia.py > animes_2010-2014.txt


 

検索結果の取得

apiにより取得したJSONをファイルに出力する
制限があるため、1秒間に2回、100件ずつ取得する。
また、検索結果が1700件以上あっても仕様上1700件までしか取得できない。

流れとしては以下の通り

  1. 取得対象名がタイトル/説明文/タグのいずれかに含まれているものを取得
  2. 検索結果として得られた動画に付いているタグをJSON形式で100件取得する。
  3. 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
手法とパラメーターの探索

http://raw.cordea.jp/niconico/act1/explore_1.png


確認して一番良さげなPCA+t-SNEに絞る。

  1. PCAによる次元縮約
  2. t-SNEによる座標算出
  3. プロット


http://raw.cordea.jp/niconico/act1/explore_3.png



ココらへんのimageは全てこちらにあります。

結果

小さい画像
f:id:CORDEA:20141126221336p:plain


大きい画像
約33*33inchの非常に大きな画像ですのでお気をつけ下さい。


 

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);"

 

Dendroscopeで確認

ラベル一つ一つまで確認できるようなイメージを作成しようとしたところ、Debianでは強制終了し、WindowsではBusy状態で停止したため、適当な大きさで妥協した。

小さい画像

f:id:CORDEA:20141126221246p:plain



大きい画像
こちらも非常に大きな画像ですのでお気をつけ下さい。

 

まとめ

  • アニメ間の距離は続編が近い傾向にある。しかし続編間の距離が非常に遠くなったものもあった。
  • 動画数が非常に少ないアニメが2~3割あると見られ、それらが正常にプロットされておらず、何らかの閾値を設ける必要がある。
  • 説明変数が多すぎて上手くクラスタが構成されない
    • 次元縮約を行わない場合に、次元の呪いによる球面集中現象が見られた

そして結果をまとめるのが一番大変だった...
結果については色々と考察したのですが、やはり変数が多すぎることと手順に問題があること(距離の算出とか)から、検索数などでフィルターをかけて距離の算出法を見直せば何か見えてくるかもしれません。
いずれにしろかなりやりがいのあるデータですので今後も進めてまいります。