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

進撃の巨人を読んだことない人がデータだけでキャラを推測してみる

テキストマイニング

はじめに

最近超人気の漫画として私のTwitter TLを賑わす作品、その名も「進撃の巨人」。
これだけ人気なんだからきっと面白いに違いないのですが、
なんか絵が怖そうだし、人がバンバン死んでてグロいっぽいという噂を聞くので、
なんとか漫画を読まずに、それでいて進撃の巨人のキャラについては知りたい、
そう願う潜在的進撃の巨人ファンも全国に70万人くらいいらっしゃると思います。

そこで、データから進撃の巨人にどんなキャラが登場するか推測してみましょう。
扱うデータとして、pixivのタグ情報を利用します。
商品レビューコメントなどとは違い、ファンの創作活動がダイレクトに反映されるサービスなので、
そこに付与されるタグ情報は、ファンの熱(過ぎる)いメッセージが込められているに違いありません。

今回、以下のような縛りを入れています。
1.勿論原作は見ない
2.pixivのタグ情報は参照するけど、絵は見ない
逆に、以下のような情報は取り入れています(取り入れているというか、意図せず入っちゃった感じです)
1.原作1話だけ無料で読めたので昔読んだ記憶がある(エレンが主人公、巨人が壁の外にいて人類と戦争してるというのは知っている)
2.twitterなどで進撃の巨人についてツイートされた場合は普通に見ていた
進撃の巨人で検索した結果を眺めたりはしないが、普段フォローしてる人がツイートした場合、それをわざわざミュートしたりはしない。めんどいので…)
3.分析結果をツイートした結果、フォロワーさんから得られたフィードバック
(この記事のようにまとめる意図が最初は無かったので、FBはミュートすることなく見ていました。
ので、分析途中で何件かは答えを知ってしまうことがありました)

この条件の下、
1.主要キャラクタ名
2.主要キャラクタの特徴(特に性別)
3.各キャラクタの関係(カップリング。受け攻め)
を抽出してみたいと思います。

ちなみに、私はアニメ・マンガ・ゲームを殆ど見ない人であり(20歳超えてから見たアニメはまどかマギカくらい)、
また、BLとか同人界とか全く知らないど素人です。コミケという存在は知っているけど行ったことはありません。
そういう門外漢がデータだけでどこまで行けるか、どのような失敗するかを試してみたいと思います。

pixivからタグ情報を取得する準備

まずは進撃の巨人タグを次のようなプログラムで取得してみましょう。
今回データを取得したのは7/28の20時くらいです。

# -*- coding: utf-8 -*-
import urllib
import sys
import time

def main():
  keyword = sys.argv[1]
  file_name = sys.argv[2]
  page_max = int(sys.argv[3])
  if len(sys.argv) == 5:
    phpsessid = sys.argv[4]
  else:
    phpsessid = ''
  with open(file_name, 'w') as wfp:
    for p in range(page_max):
      a = urllib.urlopen("http://spapi.pixiv.net/iphone/search.php?s_mode=s_tag&p=" + str(p) + "&word=" + keyword + "&PHPSESSID=" + phpsessid)
      time.sleep(1)
      for line in a:
        line = line.split(',')
        if keyword in line[13]:
          wfp.write(line[12].replace('\"', '') +"\t"+ line[13].replace('\"', '') + "\n")

if __name__=="__main__":
  if len(sys.argv) < 4:
    print "error occurred. please, 3 or more arguments. arguments is 1.tag-keyword 2.output-file-name 3. get-page-max 4.phpsessid"
    sys.exit()
  main()

ついでに単語頻度をカウントするプログラムも用意しましょう

#coding:utf-8
import sys
import collections

def main():
  read_file = sys.argv[1]
  cnt = collections.Counter()
  with open(read_file) as fp:
    for line in fp:
      tag = line.split('\t')[1]
      for word in tag.split():
        cnt[word] += 1
  
  print "count,word"
  
  for word, count in sorted(cnt.items(), key = lambda x:x[1], reverse = True): #登録された単語を頻度降順で表示
    print str(count) + "," + word
    #print word + "\t" + str(count)

if __name__=="__main__":
  if len(sys.argv) < 2:
    print "error occurred. please, 2 or more arguments"
    sys.exit()
  main()

これで準備OKです。

タグ頻度のランキングを作る

取得したタグを名寄せ*1してから頻度カウントしてトップ30を並べた結果が次です。
(26060は全タグのべ数です)

この内容からさらにキャラクタ名を抽出していきます。
それには人物に紐付きそうなタグと共起*2しているタグを取得することによって実現したいと思います。
キャラクタ名を抽出してタグ頻度順にトップ15*3を出した結果が次です。

大抵は「エレン・イェーガー」のようにフルネームと紐付けられたので、
「『●●・△△』って表記ならまず人物名であろう」という妥当と思われる仮定に沿っているので問題無いと思います。
一点、「ユミル」がフルネームを抽出できなかったのでちょっと心配です。
とはいえ、後続の分析でも人物名っぽいという結果になったので、ここではユミルという登場人物がいるものとして進めます。

頻出カップリングトップ10

次に頻出カップリング抽出を行います。
実はカップリング抽出をやろうとは思ってなかったというか、「そもそもカップリングって何?」って状態だったのですが、
「エレン リヴァイ リヴァエレ」みたいなタグが頻出してて、
「はて、これは一体?」と悩んでいたところ、婦女子の方から
「それはカップリングであり、左側が攻め、右側が受けであり、その例で言うとリヴァイ攻めエレン受けだ」
と教えて頂きました。
ちなみにあとで出てきますが、エレンもリヴァイも男性同士なので、そのカップリングとは一体…。
という感じですが、まぁその疑問は一旦脇に置き、人気カップリングを抽出してみましょう。結果は以下の通り。

リヴァイを含むカップリングの合計が全体の6割以上を叩きだしています。
リヴァイ兵長、相当の人気者のようですね。色んな意味で。

各キャラクタの特徴を掴む(性別判定)

次に各主要キャラクタの特徴を掴んでみましょう。
対象キャラは先ほどの頻出トップ10のキャラクタです。
特徴と言っても色々あるので、ここではシンプルに各キャラの性別を判定しましょう。
このキャラクタの名前ごと(フルネームではなく、「エレン・イェーガー」なら「エレン」というようにもっとも書かれやすい名前に置き換えて検索しています)
にタグを収集した結果からトップ30を切り出したのが次です。
(キャラ名の右の数値は、そのキャラと共起したタグの総種類数です)


大抵こういうデータの取り方をすると、対象名に紐付く特徴が共起するのですが、
pixivタグの場合は一枚の絵に描かれたキャラクタ名やカップリングが主にタグ付けされるため、
対象名の特徴というよりも「このキャラはあのキャラと一緒に描かれている」というのが上位にくるようですね。
正直全てのキャラの特徴がすっかり把握できるとは言えない状況です。
もっと下位(上記表に入っていない30位未満)の方で特徴語といえるものがいくつか付与されている場合もあるので、そこから出来る限り推測していきましょう。

リヴァイ

頻出タグ:[兵長、人類最強、最強サンド、最強彼氏、調査兵団幹部チーム]
とあることから、恐らく作中最強ランクのキャラなのでしょう。
そして兵長や幹部ということから、
エレンの上司か師匠か、あるいは目標とする人にあたる人物でしょうか?
男性に紐付く形容詞が多いのでまず男性でしょう。

エレン

頻出タグ:[幼馴染3人組、ショタ、女体化]
エレンは幼馴染が二人いるようですね。
そしてショタ+女体化というのがあるので、結構中性的な外見をしている男性なんでしょうか
(エレンの外見は一度見た気もするけど完全に忘れている)。

ミカサ

頻出タグ:[幼馴染3人組、進撃の百合、女の子、最強サンド、女子力(物理)、腹筋系アイドル、おっぱいのついたイケメン]
エレンの幼馴染の一人で、女の子とか百合という語が見られることから、まず女性キャラで間違いないようですね。
面白かったのが、女性キャラに紐付きそうな「可愛い」とか「綺麗」とかそういうタグはほぼなく、
むしろ筋肉系の評価がなされているので、多分女性だけどムキムキキャラなのでしょう。

アルミン

頻出タグ:[幼馴染3人組、性別:アルミン、女装、女体化、男の娘]
というわけで、「エレン、ミカサ、アルミン」の3人は幼馴染のようですね。
で、どうも性別は男性のようなのですが、女体化タグが多く、エレン以上に女性的な外見をしているのではないかと。


(あれ、女性系キャラが男性的な形容詞多くて、男性系キャラに女性的な形容詞付与されてるのが多い気がするぞ…)
という感じでタグを見て性別を判定していきます。
女性キャラは「百合」というタグが付けられていることが多いようなので、
百合タグの数でだいたい性別を当てられそうです。
…と思っていたら。

うーむ、腐女子界、奥が深い(腐った方々ありがとうございました)…。

データを時系列で眺めてみる

6/21〜7/28の各キャラの各日付ごとのタグ数です。

リヴァイ、エレンが圧倒的ですね…。
次に、もっと長期のタグ数推移を見ることによって、
作品の認知度のようなものがいつぐらいから向上してきたのかを見てみたいと思います。
進撃の巨人」タグの時系列推移を見たかったのですが、
どうも1万件以上遡ってタグ取得するのは出来ない(?)っぽいので、
遡りやすい「アルミン」タグの2013/1/1〜2013/07/28までの時系列推移を見てみます。

4月半ばから急上昇していますね。
これだけ明確に変化があったということは、強い外部要因(作品内の展開が変わったとかではなく)
があったと考えるのが妥当でしょう。
漫画の認知度が急激に上がるショックというと、アニメ化などを考えるのが妥当でしょうか。
また、日付を細かく見てみると、どうも日曜日に投稿数が跳ね上がるようです。
私は「もしかしてアニメが日曜にやっているからなのかな?」と考えたのですが、どうやら次のような理由があるようです。


なるほど、当たり前ですが絵を描くのにしっかり時間取らないといけませんし、
一般の方でしっかり時間取れるのって大抵土日ですよね。
また、pixivのランキングの仕組みも初めて知りました。
SNSだとこういうランキングなども意識して投稿されるというのは考慮に入れないといけませんね。

ちょっぴり統計解析してみる

頻度だけで分かることはこれくらいかなと思われるので、そろそろ統計学の手法を用いたいと思います。
階層型クラスタリングという手法を用いることによって、
どのタグとどのタグがどれくらい近いクラスタにいるかを把握したいと思います。
なんとなく近い位置に存在するタグが近しい関係にあると解釈して下さい。

次に共起ネットワークというものを見てみましょう。関連深いタグ同士でグラフを形成したものです。
ちなみにフルネームを取得する時にも使いました。

所々文字化けしているのは中国語のようです。中国の方にも人気なのでしょうか。
最後に、「進撃の巨人」をキーワードとしてリアルタイムでタグを取得してタグクラウドを作成して見た結果です。
これだけリアルタイムでデータ取得したため、この画像を作成するのに使ったのは8/4の18時頃のデータです。


所々東方や銀魂が入っているのはこういうことらしいです。

データからは全く分からなかったこと

「エレン右」など、○○右とか左とかいうタグが頻出していました。
これが何を意味するのか全く分からなくて頭を抱えていたのですが、

ということらしいです。

!!!!!!訳分かんねーよ!!!!!!!

結果

1.主要キャラクタ名

  • リヴァイ兵長
  • エレン・イェーガー
  • ミカサ・アッカーマン
  • アルミン・アルレルト
  • ハンジ・ゾエ
  • ジャン・キルシュタイン
  • クリスタ・レンズ
  • ベルトルト・フーバー
  • アニ・レオンハート
  • エルヴィン・スミス
  • ユミル
  • サシャ・ブラウス
  • ライナー・ブラウン
  • マルコ・ボット
  • ペトラ・ラル

2.主要キャラクタの特徴(特に性別)
男性:リヴァイ、エレン、アルミン、ジャン、ベルトルト、エルヴィン
女性:ミカサ、クリスタ、アニ
不明:ハンジ

3.各キャラクタの関係(カップリング)

  1. リヴァエレ
  2. リヴァハン
  3. ユミクリ
  4. エルリ
  5. エレリ
  6. ミカエレ
  7. ベルユミ
  8. エレミカ
  9. リヴァペト
  10. アルアニ


さて、性別は何人正解でしょうか(そもそもこれらは本当にキャラなのかという時点で不明なのですが)。
割と真面目にハンジの性別が不明のままとなりました。
ハンジは男性に付与される「女体化」タグも、女性に付与される「百合」タグも共存し、
また、女性キャラとも男性キャラとも共起しているようです。
心残りです…。

終わりに

このような分析をしてTwitterに投げたところ、沢山の方からのフィードバックを得られました。
諸々の助言ありがとうございました。
皆さんが進撃の巨人を大変愛していることが伝わってきたのと、答え合わせしたいというのもあって、
ようやくスプラッタな描写が待ち構えているのではという恐怖を乗り越えて、
進撃の巨人を読んでみようという気になりました。
Amazonで1〜10巻まとめてぽちっとな。


あと、なぜ今回進撃の巨人について分析することになったかというと*4
諸悪の根源はぜろゆ氏であり、進撃の腐人で検索すると面白いからやれと唆されたからです。



終わってしまえばすべては良い思い出です。
いい機会なので進撃の巨人を読んでみたいと思います。
はー、やっと、ついに分析しきれなかったハンジの性別が明かされる…!!

追記

ふぉろわーさんからしんげきのきょじんのさくしゃさんのこうしきぶろぐじょーほーをおしえていただきました。
http://blog.livedoor.jp/isayamahazime/archives/4388712.html

うおおおおおおおいいいいい!!!!!作者ッ!!!!最初から無理ゲーだったんじゃねぇか!!!!!!!!

*1: 指している内容は同じだけれど表記が違うものを、一つの表記に揃える処理です。例えば、「エレン」、「エレン・イェーガー」、「イェーガー」というタグがあれば、それを各々別の語として扱うではなく、全て「エレン・イェーガー」として扱うというものです。本来名寄せは結構難しい処理ですが、pixivでは「エレン・イェーガー」のようにフルネームっぽいものが簡単に取れるので結構楽でした

*2: 同時に出現する、程度の意味だと考えて下さい

*3:※タグ数はあくまで人気度合いを測るパラメタであって、イコール人気度合いというわけではありません。ここがテキストマイニングで難しい所ですが、単純に「頻度が高い=人気ではない」ではないということは常に意識しなければなりません。頻度が高い→描かれた枚数が多い→描き手が多い傾向にある→人気とタグ頻度は何らかの相関があるのでは?くらいのことは仮定できるかもしれませんが、あくまで仮定ですし、また、相関があるのは恐らく妥当な推論でしょうが、相関の強さについては全く分からないということに注意が必要です

*4: 本当の話をすると、テキストマイニングの練習としてやっています。こういう遊びを時々やると、仕事で「今まで全く扱ってこなかった商品分野だけど、Webのテキスト情報から最近のトレンドを把握してこい」とか無茶振りされても期待に応えられるようになるかもしれないので、トレーニングとして行うと良いですね。解答なんて用意されていない仕事のデータとは違って、後で答え合わせも出来るので気が楽です