開発合宿してきた & 声優統計メンバーy_benjoからのWikipediaのリンク構造に対するメッセージをお読みください
というわけで毎年恒例二泊三日の開発合宿を@inut,@syou6162,@twittoru,@wakuteka,@yag_aysとやってきた.
開発合宿してきます - 糞ネット弁慶
現実逃避のために開発合宿してきた - 糞ネット弁慶
合宿そのもの
- 卓球して
- 酒飲んで
- 温泉に入って
- アノテーションして
- 漫画を読んで
という感じだった.
寝て起きたら@twittoruがコード修正しててくれたり,相手のマシンにsshしてscreen -xやってペアプロやってる人がいたりして良かった.わっせわっせと集まって色々喋りながらそれぞれのテーマに取り組むと「それ***でできるよ」とか「それ今やりました」みたいなやり取りが生まれ続けるので効率というか相互作用が良い.
二日目は丸一日文字列がアニメタイトルかそうでないかだけを判別し続けた.人力アノテーションとかそもそもやったことが無く,NLP業界の人だと「アノテーションすることによって見えてくるものがある」みたいな事をよく言っていたのである意味そういう体験ができた.
今回の目標
- これまで散々言ってきた声優統計に取り組みたい.既存研究としてはこのあたり.
- Wikipediaのリンク構造から声優の共演関係を抽出
- その後リンク予測で今後の共演関係を予測
- ついでに声優のブレイク予測もできると嬉しい
というのがあった.
そのために必要なデータ
- 声優名一覧
- アニメタイトル一覧
- その間のリンク関係
これらを取得するためにWikipediaのダンプデータ,具体的には
- latest-pagelinks.sql.gz
- ページAからページB(かつページBのnamespace,ページの属性)のデータ
- latest-page.sql.gz
- ページ別のタイトルだったりidのデータ
- latest-templatelinks.sql.gz
- ページがどのテンプレートを使っているかのデータ
を用いた.ダンプデータはIndex of /jawiki/latest/,データの詳細はWikipediaのダウンロードできるデータファイル一覧 | mwSoft,データ格納はyuu's dev: [Wikipedia] WikipediaのデータをMySQLに読み込む.
結果を簡単に載せる
GitHub - TrainingCamp2012/seiyu_prediction: link prediction of SEIYU
y_benjo@SuperBENZA:~/workspace/seiyu_prediction/scripts% ruby link_prediction.rb ../data/seiyu_women_co_graph_node_pair.txt 野水伊織 3
とか実行すると
[ ["桑島法子", 7.802556199311605], ["小林由美子", 6.338778421092439], ["久川綾", 5.95515311359369], ["小林ゆう", 5.4789553489571405] ]
といった感じで返ってくる.
流れ
結論から言うとWikipediaの本文を見ずに作業するのは非常につらい.整形されていない.
- 声優名一覧を取得する
- templatelinkから色々やろうとするが挫折.kkobayashiさん手法で2chスレタイでフィルタリングする.
- Wikipediaから声優名一覧を取ってくるPerlスクリプトv2 (3) 2chを使ったスクリーニング案 - XXXannex
- アニメタイトル一覧取得
これが厄介だった.
Wikipediaからいかにしてアニメに関するページを取得するか?
以下の議論は2012年2月16日にダンプされたデータに基づいている.
アプローチ
アプローチとしてはpagelinkを使って
声優 ---> page
となるような,声優からリンクが貼られているようなページを一括取得し,その後,pageの集合がアニメに属しているかを判別しようとした.
この際使えそうだと考えたのは次の情報である.namespaceの詳細はHelp:名前空間 - Wikipedia参照.
- ページにおけるnamespace = 10
- ここにはそのページで用いられているテンプレートが記載されている
- ページにおけるnamespace = 14
- ここにはそのページのカテゴリ情報が付与されている
- ページにおけるnamespace = 100
- ここにはPortalと呼ばれる区分が付与されている
しかしこれらの方法ではうまく動作しない.
問題点
- ページにおけるnamespace = 10
- 統一されていない.また関係のないページにも付与されている.
- 例えば"ウィキプロジェクト_アニメ"なるテンプレートはTBSテレビなる項目でも用いられている事になっている
- ページにおけるnamespace = 14
- 統一されていない.例えば"2007年のテレビアニメ"といった年代別カテゴリ情報は全番組に正しく付与されていない
- このタグ付けには非常にムラがある?
- というより目視で確認したところ付与されているがpagelink内にデータとして保持していないものもある
- また"アニメ"というカテゴリ情報がTBSテレビや声優事務所の項目に付与されている
- 統一されていない.例えば"2007年のテレビアニメ"といった年代別カテゴリ情報は全番組に正しく付与されていない
- ページにおけるnamespace = 100
- これも同様である
また,namespaceを用いない方法としてCategory:2008年のテレビアニメ - Wikipediaこのような年代別アニメ一覧のページからアニメタイトルを取得する,という方法も考えられたが,しかし,pagelinkにはこのカテゴリページは存在するのだがアニメ作品へのリンクが完全に存在しない.よってこの方法を用いてもアニメタイトルを取得する事は難しい.
根源的な問題
そもそも根源的な問題として,wikipedia特有のリダイレクト構造,同一ページに複数作品を列挙するという問題がある.
例えば,次のようなリンク構造を考える.
小見川千明 ---> ひだまりスケッチ×☆☆☆ ---> (リダイレクト) ---> ひだまりスケッチ_(アニメ) 阿澄佳奈 -------------------------------------------------------/
このような親子関係を辿らないまま,声優から貼られたページをアニメタイトルとみなすとひだまりスケッチ×☆☆☆には小見川千明と原田ひとみしか出演していない事になってしまう.リダイレクトを扱った上で差分を取らねばならない.だるい.
また,「同一作品はなるべくまとめる」といった構造によって次のような不幸が生じる.
広橋涼 ---> らき☆すた 平野綾 --->
らき☆すたはドラマCDとテレビアニメにおいてキャスティングが大きく変わっている(http://ja.wikipedia.org/wiki/%E3%82%89%E3%81%8D%E2%98%86%E3%81%99%E3%81%9F).しかし,声優側からリンクを辿っただけではそれがアニメで出演したのかドラマCDなのか,アニメでも2期から参加したのか,という情報が完全に欠落してしまう.
では,「声優側から辿るのではなく,アニメページ候補を先に見つけた上でそこからリンクを辿り声優を探すほうが良いのではないか?」というのも考えられる.しかしこれもwikipedia特有の構造から上手くいかない.次のようなリンク構造を考える.
機動戦士ガンダム00 ---> 機動戦士ガンダム00の登場人物 ---> 宮野真守
カテゴリ一覧ページからアニメタイトルとして"機動戦士ガンダム00"を取得したとする(機動戦士ガンダム00 - Wikipedia).しかし,その1近傍には声優名が存在せず,そのもう1ページ先,"機動戦士ガンダム00の登場人物"から先を探索しないと声優名が取得できない.
結論
wikipediaからアニメのタイトルを効率的に取得する方法が欲しい.
誰かスマートな方法をください.
あとそもそもリンク予測が共演予測に適しているのかというのはある
- 声優 - アニメの二部グラフを声優間をつないでナイーブに普通のグラフとして扱うのは正しいのか
- 声優リストは2chにスレが立ってる人だから若手が多い
- 出演作品によっては共演のついての重みが変わってきたりとか
タイムスケールを考慮する際の疑問点
- タイムスケールを考慮してlink predictionをする,みたいな問題設定になるとt-1ステップ目のネットワーク状態がtステップ目に引き継がれる仮定は正しいのか
- 言ってみれば共演関係は時間スケールで蓄積される
- もしかすると時間軸を絡めたpredictionの元論文は各時間ステップで全ノードは繋がり直すのかどうか,という話になる.
- 例えばここ(Evolution of Node Behavior in Link Prediction(AAAI 2011)読んだ - 糞ネット弁慶)の論文で使っているfacebookのデータはwallへの書き込み関係なので恐らくt-1ステップ目までの累計書き込み数を引き継いだりはせず,次の時間ステップにユーザ間で書き込みが行われるか,を予測する問題になるだろう