見出し画像

星屑テレパス構文をざっくり分析したら確かにナユタン星人と近いかもという話

この記事は、東京大学きらら同好会 Advent Calendar 2021 3日目の記事です。昨日はSzkieletorさんの、きらら関連研究をGoogle Scholarで調べた結果ツイートでした。コンテンツ論関係の論文はもちろん、機械学習の話も含まれていて多彩でしたね。明日はめろんAさんのごちうさイラストです。

序論

星屑テレパス(星テレ)』は、大熊らすこ先生が「まんがタイムきらら」で連載されている4コマ漫画です。主人公の小ノ星海果を始めとする面々がある理由から宇宙を目指しながら成長するストーリーで、実際に飛行するロケット模型「モデルロケット」が忠実に描かれています。
第1巻、第2巻が好評発売中です。

星屑テレパス各話には「彗星エンカウント」「緊張イントロダクション」のようなサブタイトルが付いています。このサブタイトルは今のところ「2字の熟語 + カタカナ語」という法則にほぼ従います(例外として、第3話「放課後ロストメモリー」が唯一3文字熟語を使っています)。

このように法則性がある星テレのサブタイトルは一部で「星屑テレパス構文」と呼ばれ、有識者によって様々な星屑テレパス構文が提案されてきました。

また、人気のボカロPであるナユタン星人の楽曲名が星屑テレパス構文っぽいということで「星屑テレパスかナユタン星人かクイズ」が作られたりもしています。

本記事では、単語の意味をベクトルに変換する学習モデルWord2vecを用いて、星屑テレパス構文の分析やナユタン星人との比較を行った結果を報告します。

注意

これからご紹介するWord2vec遊びは、youwhtさんの書かれたQiita記事『「赤の他人」の対義語は「白い恋人」 これを自動生成したい物語』『プリキュアがきらきらしている秘密。「ラ行」の透明感とラーメンの人気から見る、素敵な名前のつけかたをPythonで分析する』などとだいたい同じ手法でできています。技術的新規性は特にないポエムなのでnoteに置いている次第です。
Word2vecの使い方が知りたくて見ている方はyouwhtさんの記事をしっかり読まれることをオススメします。

ソースコード

実験に使用したコードは全てGoogle Colaboratory(Colab)に置いてあります。同じデータを用意すればお手元で実行も可能です。
hoshitele.ipynb

準備

Word2vecは自分で学習させることもできますが、youwhtさんの記事で紹介されている学習済みモデルが手軽なので、それを使います。

zipファイルをダウンロードして、中身をアップロードします。私はGoogle Driveにモデルを格納したフォルダを作って、Colabにマウントしました。

# 日本語wikipedia
modelW_path = '/content/drive/MyDrive/Datasets/latest-ja-word2vec-gensim-model/word2vec.gensim.model'
model = Word2Vec.load(modelW_path)

サブタイトル一覧の準備

2021年12月現在、星テレのサブタイトルは2巻分23種類が判明しています。これにタイトルの「星屑テレパス」自体も加えて24個を分析に使用しました。

「熟語 + カタカナ語」というフォーマットがあるので、両者を分けて2要素の配列としたhoshitele_listを用意します。 ここで、いくつかのタイトルに少し変更を加えました。これは、使用する学習済みモデルに単語がなく分析ができないものを少しでも減らすためです。例えば、「白波コンフェション」の「コンフェション」はモデルの辞書に存在せずエラーとなりますが、「コンフェション→コンフェッション」のように表記を変えるだけで分析可能になります。同様に、同じ単語とみなせる範囲で表記を変えたものが辞書にある場合は変更後を入力としました。

hoshitele_list

前半と後半の類似度

Word2vecでは、2つの単語ベクトルの向きがどのくらい似ているかを示す「コサイン類似度」を計算できます。まずは、前半の熟語と後半のカタカナ語の類似度を確認しつつ、後の分析にも使えるデータセットを準備しましょう。

for index, title in enumerate(hoshitele_list):
  similarity_left_right = model.wv.similarity(title[0], title[1])

ここで、先にも書いたとおり2つの単語のいずれかが辞書にないとエラーになってしまいます。
星屑テレパス構文の場合、起きている現象は2通りに分かれます。

  1. 「再逢ライトソング」のように、難しめの語彙が使われていて本当に辞書にない

  2. 「憧憬ロンリーガール」のように、後半が複合語になっていて適切に分割(e. g. ロンリー/ガール)すれば辞書で対応可能

2の場合に対応するために、日本語形態素解析システムMeCabを導入して分割を試みます。

mecab = MeCab.Tagger('-Owakati')
for index, title in enumerate(hoshitele_list):
  try:
    similarity_left_right = model.wv.similarity(title[0], title[1])
  except KeyError:
    last = mecab.parse(title[1]).split('\n')[0].split(' ')[-2]
    if title[1] == last:
      print(f'"{title[1]}"が辞書になく、分割もできませんでした')
      continue
    print(f'"{title[1]}"の代わりに"{last}"を分析します')
    try:
      similarity_left_right = model.wv.similarity(title[0], last)
    except KeyError as e:
      print(e)

星屑テレパス構文では「ロンリーガール」「スイートメモリー」のように「形容詞 + 名詞」のパターンが多いため、MeCabで分かち書きした中で最後の単語(名詞)だけを使ってWord2vecに放り込みました(ざっくり分析なので許して……)。
それでも辞書にないという場合は仕方ないのでスキップします。

結果

サブタイトル前半と後半の類似度計算結果

左右のコサイン類似度を計算し、高い順にソートした結果を図に示します。24種類のうち計算できたのは21種類でした。類似度の分布は様々で、「星屑テレパス」「星空テレパシー」「熱血ロンリーティーチャー」などは類似度の高い単語でまとめているのに対し、「出陣ウルトラハイパワードリィーム」「約束スイートメモリー」「勝敗チキンエッグ」はあまり関係がないという結果になりました。

※ 上に書いたように、後半が複合語の場合は形容詞を一切考慮していないので、それも反映できたら評価が変わる可能性が大いにあります

星屑テレパス構文同士の類似度

星屑テレパス構文は複合語なので、類似度を計算するにはどうにかして1つのベクトルにして比較しなければなりません。
論文などをしっかり見たわけではないので適当な手法になってしまいますが、星屑テレパス構文の場合は前半と後半で必ず2単語であることから、両者のベクトルを単純につなげて2倍の長さ(使った学習済みモデルは長さ50なので長さ100のベクトルができる)にするようにしました。

vec = np.concatenate([model.wv[title[0]], model.wv[title[1]]])

この長さ100のベクトル同士でコサイン類似度を計算すれば、星屑テレパス構文っぽい表現が各サブタイトルにどれくらい似ているかが求まることになります。

※ youwhtさんのプリキュア分析記事では、似たワードを判定するのに単語同士の類似度の平均が使われました。ただ、星テレサブタイトルの場合は、前節で述べたように構成単語のバリエーションがあることから、「あるサブタイトルに近くても、他の大半のサブタイトルとの類似度は低い」という状態になりがちです。また、50次元・100次元のようなベクトルではコサイン類似度に次元の呪いが生じ、ほとんどの類似度は0付近に集中してしまいます。 こうした理由から、全体の平均や中央値を計算するのではなく、各サブタイトルとの類似度を降順にソートする形式で結果を報告します。

結果

「星屑テレパス」と近いサブタイトル

まずは、「星屑テレパス」と近いサブタイトルを見てみましょう。第12話「星空テレパシー」がかなり近いように感じますが、「星屑テレパス」自体を除いた1位は「白波コンフェション」でした。
「コンフェション = 告白」ということで、心に関する単語繋がりで近く判定されたのでしょうか……?

殺戮オランウータン

星テレサブタイトルではない文字列も入力できます。「殺戮オランウータン」の場合は類似度が最大でも0.33と、本物のサブタイトル同士ほどには高くなりませんでした。

主成分分析

Word2vecの結果を主成分分析にかけると、2Dの散布図にしてなんとなく単語群の分布を眺めたりできます。

主成分分析のプロット

第1巻範囲を水色、第2巻範囲をオレンジ色で塗ってみました。星テレは第1巻と第2巻でお話のメインがかなり変わってくるのですが、分布を眺める限りはサブタイトルの語感が明確に分かれるわけではなさそうです。

左下あたりに「決戦~」「勝敗~」「出陣~」のような勝負事関連のタイトルが集まっているのは面白いですね。上の方で少し離れている「彗星エンカウント」「惑星グラビティ」は宇宙関係の単語ですが、間の「爆薬メカニック」は宇宙関係なのか……?

右下にもなんとなく固まりがあるように見えますが、すべてに当てはまる共通用はすぐには思い浮かびません。強いて言えば、「放課後」「寄り道」「ティーチャー」あたりは学校関係の単語ですね。どちらかといえば日常シーン的な回が右下に集まっている感じもします。

※ コサイン類似度とデータ間のユークリッド距離は異なる指標(前者は、ベクトルの大きさを考慮しない)です。そのため、コサイン類似度が高い組み合わせが主成分分析のプロットでも近い距離にいるとは限りません。

星屑テレパスかナユタン星人か

クイズにもなっているのでやはりナユタン星人楽曲のタイトルとの類似度も気になります。ナユタン星人の曲名の中から、星屑テレパス構文のフォーマットになっているものをいくつか抜き出して試してみましょう。

nayutan_list = [
  [ '彗星', 'ハネムーン' ],
  [ '月光', 'ミュージック' ],
  [ '太陽系', 'ディスコ' ], # 原題: 太陽系デスコ
  [ '明星', 'ギャラクティカ' ],
  [ '光線', 'チューニング' ],
  [ 'エイリアン', 'エイリアン' ],
]

結果(類似度)

彗星ハネムーン

まあこれは納得の結果というか、「彗星」が入っているので「彗星エンカウント」と近い判定になるのは当然でした。

月光ミュージック

「白波コンフェッション」が類似度1位でした。言われてみれば月光と白波って情景的に合う気がします(Word2vec的には情景を表すカテゴリということで高類似度になった?)。

太陽系デスコ、明星ギャラクティカ、光線チューニング、エイリアンエイリアン

残りは一気に載せます。やはり宇宙・星関係の単語がある曲名が多いので類似度は高くなりがちです。「光線チューニング」はものづくり繋がりで「爆薬メカニック」と類似度0.61でした。
「エイリアンエイリアン」は別に星屑テレパス構文ではないですが、有名曲なので……。

結果(主成分分析)

主成分分析のプロット(ナユタン星人楽曲を含む)

最後に、星テレのサブタイトルでの主成分分析結果にナユタン星人の曲名(緑色)も重ねたプロットを示します。

分布的にがっつり被っているので、クラスタリングでも見分けられなそうですね。全く知らない人が見たら、確かにどちらなのか答えにくいかもしれません。

まあ、それぞれの作者やファンなら問題なく分類できると思いますが……

……え?

最後に

本当はWord2vecの結果を使って星屑テレパス構文っぽい表現を生成するとか目論んでいたのですが、よく考えると単純に類似度だけで生成したらサブタイトルをちょっとだけ変えただけのなにか(「彗星エンカウント」→「水星エンカウント」、「金星エンカウント」、……)ができそうな気がしてきてやめました。

星屑テレパスかナユタン星人かクイズは割と広まっていたのでありがたくネタにさせていただきました。字面だけ見ると本当に近いんですね。


この記事が気に入ったらサポートをしてみませんか?