エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

アニメキャラらしさ姓名判断師AIを作る ~漢字の字画に注目した識別器モデリング~

こんにちは、テックブログでは業務と全く関係ないMLをやるのが好きなエンジニアリンググループゼネラルマネジャーの大垣です。

私は普段は就業後は妻とアニメを観ていることが多いんですが、先日"地面師たち"を観てから、我が家ではドラマが一時的なブームとなっています。 最近見ている"全領域異常解決室"では、日本神話の神が転生して人間として暮らしているという、アニメっぽいトンデモ設定でちょっと好きです。 例えば、アメノウズメノミコトは天野さんとして暮らしています。

そういう夢のある話を想像すると、みなさんも日常に潜む神を見つけ出したくなりますよね!ということで、今回は姓名判断師AIを作ります。 私はやっぱりアニメが好きなので、日常の中に潜んでいるアニメらしい名前というのを見つけに行きます!

アニメらしい名前・アニメらしくない名前を判別する姓名判断AI

こちらはエムスリー Advent Calendar 2024 6日目の記事です。昨日はAI・機械学習チームの三浦さんの、KubernetesとPyTorch Lightningによる医療AI開発環境とそのTipsでした!

姓名判断ができるとはどういうことか。問題設定

姓名判断ができるとはどういう問題設定かと考えると、つまり、名前だけを入力としてその人の属性が判断できる、という事になりそうです。 今回はアニメらしい名前の診断を作りたいので、つまり、名前だけを入力としてアニメキャラかどうかが判別できる、という問題が解けている状態と言えそうです。

本当は日本人の全名前を持ってきて、アニメキャラと判別できるか、をやりたいのですが、流石にそのようなデータは公開されておらず、今回は、"衆議院議員"、"プライム上場企業の代表"、"アニメキャラ"の3データセットを使って識別問題を解いてみます。なお、簡単すぎるデータを除くために、アニメキャラのうち、名前のすべてが漢字で構成されているキャラクターのみを対象とします。

特徴1: まずは1-gram/2-gram特徴を突っ込んで、名前の珍しさをモデリング

アニメキャラらしさの仮説として、実在の人間と区別をしやすくする・覚えやすくするために、作者は珍しい名前をつけがちなのでは、ということが考えられます。

そこで、漢字の頻度特徴と名字・名前の頻度特徴を突っ込めば識別精度が高められそうですね。今回集めたデータでは名字と名前が分割されていないものも多かったので、シンプルに1-gram,2-gramのone hot vectorを作り、それぞれ頻度上位100のものが出現したかどうかの200次元の特徴としました。

ç”°    202
一    128
郎    104
è—¤     87
野     81

アニメ・政治家・社長データセット中の名前で使われることの多い漢字TOP5

太郎    28
一郎    24
鈴木    17
佐藤    15
田中    13

アニメ・政治家・社長データセット中の名前で使われることの多い名前・名字TOP5

特徴2: 画数特徴

さて、姓名判断師というからには、字画の情報を見て判定できないとダメですよね。ここで重要になるのが、文字情報基盤整備事業です。なんと、超詳細な漢字の情報ファイルをクリエイティブ・コモンズで配布してくれているのです!

一般的な文章に出てくるほぼすべての漢字について、画数はもちろん、部首や読み、各辞書での登録状況など超詳細なデータが構造化されて記録されてる!

moji.or.jp

この詳細データを元に、

  • 名前の画数の総和
  • 名前の画数の最大
  • 名前の画数の最小
  • 名前の画数の標準偏差
  • 常用または人名漢字率
  • 常用または人名漢字外数
  • 常用漢字率
  • 常用漢字外数

という特徴量を追加しました。

df_orig.assign(**{
    'raw_kanjidata': lambda _df: _df["name"].map(lambda name: kanji_data.merge(pd.DataFrame(list(name), columns=["font"])))
}).assign(**{
    '画数raw': lambda _df: _df["name"].map(lambda name: kanji_data.merge(pd.DataFrame(list(name), columns=["font"]))['総画数(参考)'].tolist())
}).assign(**{
    '画数mean': lambda _df: _df["画数raw"].map(lambda x: sum(x) / len(x)),
    '画数max': lambda _df: _df["画数raw"].map(lambda x: max(x)),
    '画数min': lambda _df: _df["画数raw"].map(lambda x: min(x)),
    '画数std': lambda _df: _df["画数raw"].map(lambda x: pd.Series(x).std()),
    '画数sum': lambda _df: _df["画数raw"].map(lambda x: sum(x)),
}).assign(**{
    '常用人名漢字率': lambda _df: _df["raw_kanjidata"].map(lambda kanjidata: kanjidata["漢字施策"].isin(["常用漢字", "人名用漢字"]).mean()),
    '常用人名漢字外数': lambda _df: _df["raw_kanjidata"].map(lambda kanjidata: (~kanjidata["漢字施策"].isin(["常用漢字", "人名用漢字"])).sum()),
    '常用漢字外数': lambda _df: _df["raw_kanjidata"].map(lambda kanjidata: (kanjidata["漢字施策"] != "常用漢字").sum()),
    '常用漢字率': lambda _df: _df["raw_kanjidata"].map(lambda kanjidata: (kanjidata["漢字施策"] == "常用漢字").mean()),
    '人名用漢字率': lambda _df: _df["raw_kanjidata"].map(lambda kanjidata: (kanjidata["漢字施策"] == "人名用漢字").mean()),
})

結果は?

なんと、名前だけしか入れてないにもかかわらず、AUC=0.7の識別器を作成することが出来てしまいました

意外とできるもんですね。

最もアニメらしさのあるアニメキャラランキングを見てみます

  1. 擬宝珠夏春都 (こちら葛飾区亀有公園前派出所)
  2. 擬宝珠檸檬 (こちら葛飾区亀有公園前派出所)
  3. 日向小次郎 (キャプテン翼)
  4. 泥水次郎長 (銀魂)
  5. 片倉小十郎 (花の慶次 *1 )

なんと、見事にジャンプ作品に独占されてしまいました。漢字の名前に絞っているのである程度古い作品が多くなりがちとかいろんな要素があるのでしょうが、ジャンプはアニメキャラの名前の概念を作っているとも言えるのかもしれませんね。

1位・2位はまさに、通常の名前では使われなさそうな難しい漢字だったり、6文字といった長い名前だったりします。3,4,5位は"郎"の字(4,5位は次郎)が共通してますね。花の慶次や銀魂のように、一定歴史物要素があるため古風な名前がアイコンとして使われがちということなきがします。

では、逆に、本当は衆議院議員なのに、誤ってアニメキャラと判定されてしまった、最もアニメキャラらしい名前の衆議院議員ランキング

  1. 辻清人 (自由民主党)
  2. 坂本竜太郎 (自由民主党)
  3. 臼木秀剛 (国民民主党)
  4. 小泉進次郎 (自由民主党)
  5. 梅村聡 (日本維新の会)

やはり、郎が入ってきましたね。小泉進次郎さんはアニメキャラ上位の次郎を含んでますしね。なんとなく傾向が掴めます。

ではもう少し深堀りして見るために、AI君はどこに着目しているか、1位の辻清人さんを例に見てみましょう。

辻清人さんのアニメキャラらしさを支える特徴

画数特徴が圧倒的上位です。やはりAI君も姓名判断は画数でやるんですねー。minが小さくて(人の字が2画)、stdが大きい(5,11,2画と振れ幅)ということがアニメらしさの特徴になっています。画数のバランスを見ているなんて本当に姓名判断っぽいですね。たしかに考えてみると、"斎藤一"*2みたいな振れ幅の大きい名前はなんか現実離れしてカッコイイですよね。 また、面白い特徴として、常用漢字率というのが上位に来ています。これは辻清人さんの辻が1つ点のつじで、常用漢字ではないからです。たしかにアニメキャラらしさを感じますね。

字画のバランスの話は面白いんでもうちょっと掘ってみると、

画数特徴ごとのアニメキャラかどうかのプロット。赤色がアニメキャラ
これを見てみると、青色(非アニメ)はぎゅっと集まっているのに対して、赤色(アニメ)は全体に散っています。つまり最小画数が多い(難しい漢字ばかり)、分散が大きい(字画がアンバランス)、最小画数が小さい、など、いずれかの方向に尖っているとアニメらしさがでてくるということですね。納得。

ちなみにアニメらしさワーストは 井狩俊樹(capeta)、中野英幸(自由民主党) でした。お二人共確かに字画がバランス整ってますし、最小画数が標準的な4ですね。 加えて、AI君によると、井、中、野という漢字はアニメキャラらしくないみたいです。中野家の五つ子は。。。?

ちなみに実在の人間同士は識別できるの?

せっかく実在の人間も社長と政治家をあつめてきたのだから、これらの2つの属性が鑑定できるのか見てみたいですよね。

結果としてはAUC=0.55と、全く出来てないとは言えないものの、かなり難しいということがわかりました。 これが出来てしまうと、生まれで職業が決まってしまうということなので、できにくいのはよいことですね。

ただ、効いている特徴をつぶさに見ていくと面白いことがわかります。実は予想して用意してたんですが、この識別には1-gramの特徴が最も効きます(むしろ他の特徴をいれると精度が下がる)

政治家と社長を分ける一文字。右が政治家より、左が社長より

さて、政治家に効く文字を観てみると

"子"、"太"、"一"、"郎"、これらは名前に使われる漢字ですね。古風な名前をつける家柄が効くというのはめちゃめちゃ納得ですねー。あとは長男長女が継ぐ傾向の要素も??

問題は"田"、"木"、"藤"、これらは名字に使われる漢字ですよね。これは親が決めるものではないので果たしてなぜ。。。私は大河ドラマ"光る君へ"も観てるので、現代においても藤が政治家に受け継がれているという陰謀論を語れて満足です(いいのか?)(名字の方はそんなに寄与度も高くないし、本当に陰謀論なのであまり真に受けないでくださいw)

We are hiring !!

エムスリーでは、日常のどんな疑問でも技術で解決するようなギークを歓迎してます! 新卒・中途それぞれの採用だけでなく、カジュアル面談やインターンも常時募集しています! *3

エンジニア採用ページはこちら

jobs.m3.com

カジュアル面談もお気軽にどうぞ

jobs.m3.com

インターンも常時募集しています

open.talentio.com

*1: アニメじゃなくて漫画が含まれてるのは利用したデータのためです。正確にはアニメ・漫画キャラを集めてます

*2:よくアニメ化されてる新選組隊士

*3: エムスリーでは当然姓名判断は行っていませんw