プロローグ
みなさんこんにちは。
今日は、ボクが考えた事件解決の助けとなる画期的な発明を紹介したいと思います。
それは…事件が起きる前の容疑者たちの会話を集めて、犯人と被害者を予測するシステムです!
AIについてはまだよくわからないけど、少年探偵団に不可能はありません!
目的
- 事件が起きる前に犯人と被害者を予測する
条件
- 対象とする事件は殺人事件
- ストーリー開始から事件が起きる前までの会話から犯人と被害者を予測する
システム概要
- 言語はPython
- 機械学習に使うライブラリはkeras
- 形態素解析エンジンはjanome
実装の流れ
システム作成の手順を簡単に説明します。
-
データ収集
コナンの単行本からひたすらデータを収集します。
事件が起きるまでの会話を全部拾うのはきつかったので、吹き出し10個分を学習データとして利用することにしました。
また、会話に登場する人物名が判定に影響を与えないように、全ての人物名を「田中」に変換しました。 -
形態素解析
収集したデータは日本語の文章となりますが、このままでは学習データとして使えないためデータ処理を行っていきます。
文章を単語区切りにすることで、このあと登場するベクトル化を可能にします。
例えば「すもももももももものうち」を「すもも/も/もも/も/もも/の/うち」のように区切ります。 -
ベクトル化
janomeのdoc2vecを利用して文章をベクトルデータに変換します。
文章データを数値で表現することで、学習データとして利用できるようになりました。 -
学習
出来上がったベクトルデータに「犯人/被害者/一般人」のラベル付けを行い、学習を行います。
結果
学習データに対しては100%近い精度となりましたが、新規データへの精度はほとんど出ませんでした。
- 敗因:学習データが圧倒的に足りなかったです(28個)
- 単行本の内容を手打ちでデータ化するのは思ったより大変な作業でした
- 投稿日がせまってたので妥協しました
- 漫画読むの優先した
よく言われますが、機械学習で一番大変なのは学習データを集めることです。
こんなことがしたい!と思ったときにすぐにデータが手に入ることは稀だと思うので、普段からデータにアンテナを張っておくことが大切だと思いました。
おまけ
いろんなキャラクターのセリフを判定してみた結果です。
左から順に[一般人 被害者 犯人]の確率です。
- 吾輩は猫である
- [0.506109 0.47779834 0.01609264]
- オッス!オラ悟空
- [0.7559725 0.22846058 0.01556693]
- 僕ドラえもん
- [0.6403506 0.3441662 0.01548317]
- 東中出身、涼宮ハルヒ。ただの人間には興味ありません。この中に宇宙人、未来人、異世界人、超能力者がいたら、あたしのところに来なさい。以上。
- [0.2473547 0.69323796 0.05940729]
- 僕は新世界の神となる!
- [0.28107646 0.70111287 0.01781074]
- あきらめたらそこで試合終了ですよ
- [0.63113874 0.34889922 0.01996207]
- 何の成果も!!得られませんでした!!
- [0.46731383 0.48855832 0.04412784]
- たった一つの真実見抜く、見た目は子ども、頭脳は大人、その名は名探偵コナン!
- [0.50221133 0.47582945 0.02195918]
ほとんど一般人か被害者の確率にかたよってしまいました。
犯人の確率は高くても6%と低いですね、もしかしたら派手なセリフは犯人ではないと学習しているのかもしれません。
被害者の確率が最も高かったのはキラの「僕は新世界の神となる!」でしたね。
結論
夜神ライトは死ぬ