この記事は、アイドルマスター Advent Calendar 2020 の16日目の記事です。

アイドルマスター Advent Calendar 2020
https://adventar.org/calendars/4976

昨日(12月15日)は、
ばんじゅん????さんの、手首の上でアイドルを踊らせる記事でした。

アイドルを手首の上で踊らせるためのwatchfaceの解析
https://note.com/banjun/n/n2c9cb83504cb

すごいです♪

さて、12月16日は小日向美穂さんのお誕生日です、おめでとうございます!

今まで、以下のような活動にて担当アイドル「小日向美穂」のデータサイエンスについて、
いろいろと検討を行ってきました。

「何つながりなのかな?」を探る自然言語処理
https://takemikami.com/2019/02/21/765PRO-LIVE-THEATER.html

データサイエンスアイドル「小日向美穂」と考える「つながり」
YouTube: https://www.youtube.com/watch?v=8oB-JudUejE&t=364
slideshare: https://www.slideshare.net/takemikami/ss-154046027

データサイエンスアイドル小日向美穂の実装をデータエンジニアリング視点で整理する
https://takemikami.com/2019/12/16/dataengineering-miho.html

そして、実装しました。

小日向美穂 - Data Science Idol -
http://app.takemikami.com/dskohi/

※HerokuのFreeDynoで動かしているのもあり、アクセス開始時に少し時間がかかります.

↓ こんな感じです ↓

何つながりなのかな?

出てくるワードに納得感があるようにするためには、
まだまだチューニングが必要かなと思いますが。

この仕組みで、出てくるワードからのインスピレーションで
ショートストーリー書いたりしても面白いかも知れないな、と思っています。

実装において起きた問題

このエントリで言うことは、以上なのですが、
実装において起きた問題についてだけ言及しておきます。
# 数理的なロジック、処理で利用するデータも、過去のエントリで書いた通りなので

HerokuのFreeDynoを使っていたこともあって、
単語の分散表現から類似単語を抽出する処理で、メモリ不足になったと言うことです。

以下のブログでも書かれているように、
メモリが少ない環境で、gensimのword2vecを使うと問題になることがあります。

低メモリ(RAM)環境で、gensimのword2vecモデルを使うテクニック(備忘録) | かもブログ https://kamo.hatenablog.jp/entry/2020/04/05/173810

そして、今回の仕組みでは、
すべてのベクトルをメモリ上に展開する most_similar() メソッドを使っているので、
上記のブログで紹介されている対応方法は使えません。

結論から書くと、
分散表現のファイルをいくつかに分割して、
順に読み出して類似度を計算させることでメモリ不足を回避しました。

以下の論文にあるような、
各データ(今回の仕組みではワード)の類似度から、
類似度でまとめた木構造のインデックスを作る方法も調べたのですが。

類似度の階層関係に基づく木構造索引を用いた効率的な類似検索
https://db-event.jpn.org/deim2013/proceedings/pdf/a9-1.pdf

# NECの顔認証「NeoFace」のために考えられた手法のようです。
# 顔認証 | NEC
# https://jpn.nec.com/biometrics/face/index.html

次のような理由から、今回は力業で対応しました。

  • そこまでデータが大きくない
  • 閾値以上の類似度を持つデータの抽出でなく、近傍データの抽出がしたい

以上です。