spaCyとGiNZAで造語の意外性を測ってみた【2022】

新月一2022-08-23DeepLearningspaCy GiNZA 自然言語処理

TIP

ふたつの言葉の類似度を測り、より類似度が低いものを組み合わせたほうがインパクトのある造語を作れるのではないか? その疑問を解消するために、spaCyとGiNZAを使って造語の意外性を測定します。目的としてはコンビ名や芸名の意外性を数値化するところにあります。

初めに

サービス名やコンビ名を考える上で、人の記憶に残ることはとても重要です。元からあるものを使った芸名(「千鳥」や「かまいたち」)などもわかりやすく人に覚えてもらいやすい名前ですが、「霜降り明星」のようにふたつの言葉の組み合わせの名前もあります。今回類似度を測ってみるのはそういう名前についてです。

spaCyやGiNZAの基本的な使い方についての説明は他の記事に任せて、本筋はいろんな造語の類似度を見てみることにあります。

基本事項

spacy

spacyはpythonの自然言語処理ライブラリで、大量のテキスト処理が可能になります。

GINZA

GiNZAは日本語の自然言語処理を行うためのライブラリでspaCyからロードして使用します。

参考URL

spacy公式 https://spacy.io/

GINZA公式 https://megagonlabs.github.io/ginza/

ソースコード

spaCyのインポートとGiNZAの呼び出し

import spacy
nlp = spacy.load('ja_ginza')

類似度の計算

類似度を計算します。これからの計算については大体同じフォーマットを使います。 まずは、どれぐらいの類似度で類似しているかとみなすかを決めるために基本的な単語について見ていきます。

doc1 = nlp("猫")
doc2 = nlp("犬")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.7271090257272178

猫と犬の類似度は0.72です。

doc1 = nlp("猫")
doc2 = nlp("馬")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.2634999072704032

猫と馬の類似度は0.26です。0.5より大きいとやや類似していると判断していいのでしょうか。

続いて、お笑い芸人のコンビ名「霜降り明星」について類似性を見ていくことにします。

doc1 = nlp("霜降り")
doc2 = nlp("明星")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.055763904745042545

類似度は0.05とかなり低く、意外性のある単語同士を組み合わせていると考えられます。 かなり人の記憶に残りやすい言葉なのではないでしょうか。

一方、霜降りといえば肉ですから、霜降り肉の類似度について見てみます。

doc1 = nlp("霜降り")
doc2 = nlp("肉")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.6289282091828581

類似度は0.62なので、類似度は高めと言えます。 計測値に信頼性がある気がしてきますよね。

さて、続いて「ミルクボーイ」について見ていきます。

doc1 = nlp("ミルク")
doc2 = nlp("ボーイ")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.17434440401719067

類似度は0.17とやや低めです。では、類似している言葉なら類似度が高くなるのかを確かめてみましょう。

doc1 = nlp("ミルク")
doc2 = nlp("牛乳")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.7243853345783422

0.72とやはり高めになっているので、信頼しても良さそうです。

最後に、この記事を書こうと思ったきっかけである「ふとっちょカウボーイ」について見ていきます。 なぜ今? って感じですが、ふと思い出したんです。

まずは、類似度が高そうな言葉について見ていきましょう。

doc1 = nlp("力士")
doc2 = nlp("相撲取り")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.9999998225503048

力士と相撲取りは同じ意味です。類似度も0.99とかなり高いですね。予想通りの数値です。 一方、ふとっちょ相撲取りではどうでしょう。

doc1 = nlp("ふとっちょ")
doc2 = nlp("相撲取り")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.2542745195661943

0.25とそんなに低くはありません。 それでは思いつきの発端であるふとっちょとカウボーイの類似度を見てみましょう。

doc1 = nlp("ふとっちょ")
doc2 = nlp("カウボーイ")

# doc1とdoc2の類似度を取得
similarity = doc1.similarity(doc2)
print(similarity)
0.0653740438998622

0.06! かなり低いです。 やはり頭に残りやすい組み合わせの言葉だったからふと思い出すことがあったのでしょうか?

まとめ

  • spaCyとGiNZAで言葉の類似度を計算できた。
  • 霜降り明星やふとっちょカウボーイは類似度が0.1以下の意外性のある名前
  • 長く売れてるかには関係しないが、意外性のある名前だと記憶には残る

皆さんもペンネームやラジオネームで意外性のある言葉を作りたかったら、言葉の類似度を測定してみるのはいかがでしょうか。 それではまた次回に。

Thank you for reading!

Last Updated 2023-04-16 06:01:13