Home

neo4jで声優の共演調査

update: 2019-12-24

neo4j

この記事はDiverse Advent Calendar 2019の24日目です。

経緯

Diverseに入社して早1ヶ月過ぎました。自分はサーバチームに配属され、業務でもGraphDBに触れるようになりました。そこで今回はneo4jというGraphDBを使って声優の分析(大袈裟)をしていこうと思います。

また、GraphDBの概要についてはチームメンバーの下記記事で紹介されてますのでご参考にどうぞ。

はじめてのグラフデータベース

データの準備

まずデータが無いと始まらないので、GraphDBに突っ込む声優の出演情報を集める必要があります。

プロパティ

本記事で全てのデータ(プロパティ)を使用するわけではないですが、 各Node、Relationshipは大体下記のプロパティを持たせてます。

声優(Node名:CV)

  • 名前(or姓名別々に)
  • なまえ
  • 性別(用途によりLabelにしても良いかも)
  • 生年月日

出演情報(Relationship名:ACTED_IN)

  • キャラ名
  • 重要度(表示順)

アニメ(Node名:Anime)

  • タイトル
  • 製作会社
  • 監督
  • 放送時期

今年の覇権さらざんまいをピックアップするとNode間の関係性はこんな感じ。

ちなみに、neo4jにはBrowser User Interfaceが備わっており、 そこでクエリを投げて表示された画像をsvgでエキスポートしたものが上記画像です。 画像と書きましたが、ブラウザUI上ではNodeをぬるぬる動かせますのですごく楽しいですw是非触ってみてください。

ソース

どこから情報を取得すればいいか問題。 まず最初に思い浮かぶのは我らがWikipediaかと思いますが、モブの情報が記載されていたりなかったりとまちまちです。 そこで今回はメインキャラしか記載されていない(と思われる)アニメハックを利用させて頂きました。

抽出したデータの内訳はこんな感じ。

  • アニメ:3945本
  • 声優:2265名
  • 出演情報:24799件
  • 期間:1965年夏〜2019年春

半年ほど前に収集してた情報なので直近のアニメは入ってません。また、シリーズモノの1期や2期も別作品としてカウントしています。ご了承ください。。

分析

データが揃ったところでGraphDBで色々やっていきます。

共演作品調査

AさんとBさんの共演作品を知りたいという望みが誰しもあると思います。自分もです。ではやっていきます。 社会現象アニメ鬼滅の刃でも共演されたお二方(花江夏樹さん、松岡禎丞さん)の他の共演作品は?

MATCH (cv1:CV)-[]-(anime)-[]-(cv2:CV)
WHERE cv1.name = "花江 夏樹"
AND cv2.name = "松岡 禎丞"
RETURN *

結果はこちら。

色々共演されてますね。

共演作品調査(ver3人)

もちろん3名の共演作品も検索できます。 なんとなくよく共演してるなーと思っていた、梶 裕貴さん、神谷 浩史さん、小野 大輔さんを調べてみます。

MATCH p1=(anime:Anime)-[r:ACTED_IN]-(cv:CV)
WHERE cv.name = "梶 裕貴"
WITH anime,p1
MATCH p2=(anime)-[r:ACTED_IN]-(cv:CV)
WHERE cv.name = "神谷 浩史"
WITH anime,p1,p2
MATCH p3=(anime)-[r:ACTED_IN]-(cv:CV)
WHERE cv.name = "小野 大輔"
RETURN p1,p2,p3

結果がこちら。

流石です。また、Browser UIの機能性も流石で、任意のNodeを任意の位置に固定して可視性を良くすることもできます。

共演作品数ランキングTop10

neo4jの問い合わせ言語cypherにはordercountlimit等のRDBでお馴染みのものもサポートされてます。 それでは夢喰いメリーで知ってから推し続けている佐倉綾音さんの共演者情報を見てみましょう。

MATCH (c1:CV)-[r1]-(a:Anime)-[r2]-(c2:CV)
WHERE c1.name = "佐倉 綾音"
RETURN c2.name as cv, count(r2) as count
ORDER BY count DESC
LIMIT 10
cv , count
早見 沙織 , 15
内田 真礼 , 15
茅野 愛衣 , 14
日高 里菜 , 13
東山 奈央 , 13
石川 界人 , 11
村川 梨衣 , 11
花澤 香菜 , 11
水瀬 いのり , 11

イメージ通りだったでしょうか? 今回はRelationは不要のため、csv形式での表示となります。Browser UIではcsv形式のエクスポートもサポートされています。

pythonで検索

neo4jには各種Driverが用意されています。ここではpython用のDriverを利用して「タイトルに”みなみけ”が含まれるアニメ」を取得してみます。俗に言うあいまい検索ですね。cypherにはlike句は無いですが=~で可能です。また、変数のバインドも勿論サポートされています。

from neo4j import GraphDatabase
driver = GraphDatabase.driver("bolt://localhost:7687", auth=('neo4j', 'pass'))

with driver.session() as session:
        
    r = session.run(
            """
MATCH (anime:Anime)
WHERE anime.title =~ $title
RETURN anime
""", title='.*みなみけ.*').records()
    print([a['anime']['title'] for a in r]) # >>['みなみけ おかえり', 'みなみけ~おかわり~', 'みなみけ', 'みなみけ ただいま']

データのinsert方法に触れてませんでしたが、同様に本Driverを利用してスクリプトを書いて実行しました。

まとめ

GraphDB(neo4j)の簡単な利用例を紹介しました。実は出演情報を扱うのは鉄板ネタで、neo4jのチュートリアルにもなってますwグラフでは他にもSNSやリコメンドシステム等での利用例もあります。RDBのスキーマ設計がピンとこない場合GraphDBが最適解になったりするかもしれません。是非GraphDBをよろしくお願いします。←誰