「ふわふわ」と「もふもふ」の違いは数値化可能か?

自然言語処理

今日ツイッターをしていると以下のようなツイートを発見しました。

Cotarou on Twitter
“【「ふわふわ」と「もふもふ」の違いは数値化できる】 すごい挑戦的な副題だ…音の周波数に関する主張なのかな?気になるから要チェック » 五感を探るオノマトペ ―「ふわふわ」と「もふもふ」の違いは数値化できる― / 坂本 真樹 著 鈴木 宏昭 コーディネーター | 共立出版 ”

「ふわふわ」と「もふもふ」の違いは数値化可能か?
うーむ、素晴らしい問いですね!!思わず「いいね」連打しそうになりました(笑)

「ふわふわ」と「もふもふ」は感覚的には凄く似ている気がするのですが、少し考えてみると違う印象も受けます。例えば「ふわふわ」は布団とか非生物に使われる印象が強いですが、「もふもふ」は「この子犬、もふもふしてるねー!可愛い!」というように、愛らしい生物(やキャラクター)などに使われるイメージです。こうした意味の微妙な違いを数値化することは可能なのでしょうか??

オノマトペの面白さ

「オノマトペ」とは日本語特有の表現で、例えば「ポツポツと雨が降る」「しんしんと雪が降る」「優しさにほっこりした」と言ったように、物事の状態や動きなどを音で象徴的に表した語のことです。オノマトペは、

  • 理解に日本語特有の感性が必要(外国人には簡単には理解できない)
  • オノマトペの意味は時代と共に変化し、新種のオノマトペも現れる
  • オノマトペは「文字」が重要な要素だが、それだけではない

というように奥が深く、言語処理の研究としても面白いテーマだと思っています。以下、上について、少し順番に説明していきます。

理解に日本語特有の感性が必要

オノマトペの理解には、日本人の長年の蓄積による「感性」が求められます。例えば日本人にとって「しんしん(と雪がふる)」という文章から、日本人は雪が降っている情景だけでなく、ぴんと張り詰めた冬の空気感まで感じ取ることができるのではないでしょうか。あ、「ぴん(と張り詰めた)」もオノマトペですね(笑)

オノマトペの意味は時代と共に変化し、新種のオノマトペも現れる

調べた限り、オノマトペの起源ははるか昔に遡ることができます。例えば紫式部の源氏物語には、「ほのぼのと明けゆく朝ぼらけ」というオノマトペが使われています。ここから類推できる通り、オノマトペはその起源も深く、それゆえにバリエーションも非常に多いのが特徴です。

さらには「オノマトペの意味が時代とともに変化する」という、それだけでも1つの研究テーマとなりそうな重要な特徴があったりします。例えば先ほどの例では、「ほのぼのと」が「ほのかに明るみが感じられるさま」として描かれていますが、現在では「ほのぼのとした家族」というように、「人情の温かみ」で使われることが殆どです。

新種のオノマトペが頻繁に現れることも提起しておきたい特徴です。例えば「ほっこりする」は比較的歴史の浅いオノマトペに思われますが、例えこのオノマトペを初めてみた人であっても、「ほっとする」と「にっこり」から、なんとなく温かく「安心できる雰囲気」を類推することができるのではないでしょうか。

オノマトペは文字が重要な要素だが、それだけではない

上の例で、例えば「ほっこり」=「ほっ(とする)」+「(にっ)こり」からもわかる通り、文字列の近さがオノマトペの理解において重要な手がかりであることは恐らく間違いありません。ではそれで十分かといえば、明らかにそうではないケースも多くて、例えば「こっくり」「がっくり」「ざっくり」は文字列で見ると似ているけれども、意味は全く異なってくるわけです。ここにオノマトペの類推が単純でなく、難しい理由をはっきりと見ることができます。

最初に話したいわゆる「日本人の感性」とは、日本人が長い期間をかけて形成した「常識」や「過去の経験」に裏打ちされている知識、ともいえそうです。つまり、過去に膨大なオノマトペとその文脈から、正しいオノマトペの用法について(無意識的に)学習を行なっているのでは、と考えられます。

オノマトペを数値化する(レーベンシュタイン距離)

さて、それではオノマトペを数値化する方法を検討してみましょう。
まずは直感的に、オノマトペの文字列の近さを素直に計算する方法を考えます。これには便利な手法があって、レーベンシュタイン距離というものを考えましょう(名前は仰々しいですが非常に簡単なアルゴリズムです)。レーベンシュタイン距離とは、二つの文字列がどの程度異なっているかを示す距離の一種で、1文字の挿入・削除・置換によって、一方の文字列をもう一方の文字列に変形するのに必要な手順の最小回数として定義されます。

例として「チョコレート」を「チョコアイス」にするには、
1. チョコレートの「レ」を「ア」に置換
2. チョコレートの「ー」を「イ」に置換
3. チョコレートの「ト」を「ス」に置換
の3ステップ必要ですから、この場合レーベンシュタイン距離=3となります(実際には、文字列の長さで正規化して距離を測定することが多い)。

この方法で、オノマトペの差を数値化できないか、実験してみましょう。

データを集める

その前に、オノマトペのデータがなければ何も出来ない・・・ということで(笑)まずはオノマトペのデータを見つけます。こちらのサイトで、日本語のオノマトペが700件ほど掲載されているので利用させてもらうことにします。Pythonであれば、これをPandasのread_clipboard()などでDataFrameに読み込めば準備完了です(1分以内に出来ます!)。

「ふわふわ」と類似度の高いオノマトペを抽出する

上の例では、「ふわふわ」と類似度の高いオノマトペを、類似度が高い順に取り出してきます。ここで、
類似度=1 – 文字列の長さで正規化したレーベンシュタイン距離
として定義しています。実装としてLevenshteinパッケージをpip installして使ってしまうのが早いです。結果は以下のようになります。

うーむ、見るからに上手く行っていない印象です。
オノマトペは文字列の長さがそこまで長くないために、レーベンシュタイン距離では尺度が粗すぎる(上位殆どが0.5に集中している)のが理由の1つ。そして先ほどの話に戻りますが、「オノマトペは文字が重要な要素だがそれだけでは不足」というのがもう一つの理由として考えられます。

オノマトペを数値化する(単語の分散表現を用いる)

さて、次に少し作戦を変えてみましょう。「オノマトペ」は表層の「文字」は重要な手がかりですが、それだけでは上手く行かないことがわかりました。従って、我々が日本語のコンテクスト(文脈)でオノマトペを吸収していったのと同じように、機械でも文脈情報を生かしてオノマトペを学習させることを考えます。つまり、このブログでも何度か紹介している「単語の分散表現」を使用してみることにします。

さらに今回は、オノマトペの意味を捉える上で単語の表層の文字情報もわかっているので、FastTextを使用してみることにしましょう。FastTextの詳細な説明は別のブログ記事で改めて紹介しようと思いますが、Word2Vecと同じくニューラルネットワークベースのlog-bilinearモデルによるものです。FastTextとWord2Vecの大きな違いは、FastTextは単語の分散表現を作る際にサブワードと呼ばれる単語内の語を考慮する点にあります。

ちなみにlog-bilinearとは日本語で対数双線型モデルと訳されますが、ポイントは以下のようにニューラルネットワークでありながらバイアス項や活性化関数等がなく、ターゲットの単語ベクトルと文脈ベクトルの内積で表されるシンプルなモデルである、という点です。Word2VecとFastTextとの違いを以下のスライドにまとめたので、もしご興味があれば、ご確認ください。FastTextとWord2Vecの違いを数式でまとめています。

FastTextのトレーニング

さて、次にFastTextのトレーニングを行います。この部分は手元にソースコードがなく、省略させてください(汗)

少し技術的な話ですが、FastTextには学習結果生成されるモデルとして2種類存在します。

  • 単語だけでなくサブワード単位でのベクトルも含む.binファイル
    →こちらはFastText特有のフォーマットで保存されており、サブワード単位で分散表現を求めることができます。
  • 単語ベクトルだけをテキスト化した.vecファイル
    →こちらは、Gensimのkeyedvectorsファイルで読み込んで使用できるので楽ですが、Word2Vecと同じく単語単位での分散表現しか使用することができません。

FastTextは日本語のWikipediaで学習して配布されているモデルもあるのですが、自分が確認した限り.binファイルは提供されていませんでした。
今回は未知語でのオノマトペの評価を行ってみたかったので、学習コーパスとして日本語Wikipedia全ページを用いて自前でトレーニングを行いました。概ねデフォルトのパラメータを使用し、隠れ層のサイズ=300としています。

日本語ウィキペディアの全ページを対象とすると途方も無い時間がかかりそうですが、FastTextはトレーニングが非常に早いため、CPUで数時間以内に完了させることができます(8 Core CPU, 16G RAM の場合)

学習後のモデルを使用して、以下のようにオノマトペの分散表現を求めます。

結果は以下のようになりました。

ふんわり、ふわりなど比較的いい感じで似たオノマトペが抽出できているのが分かります。一方で、「ぽっくり」や「ぽろり」などが比較的類似度が高く、精度は今ひとつにも思えます。

なお「もふもふ」でも結果を見てみましたが論外でした(笑)

原因として考えられるのは、Wikipediaに出現するオノマトペは頻度が少ないため、学習が上手くいっていない可能性が考えられます。TwitterやブログなどSNSの方が相性が良いかもしれません。

おまけ

http://projector.tensorflow.org/で可視化してみた。
単純に面白い。

 

コメント

タイトルとURLをコピーしました