日本語の「嬉しい」と英語の「happy」の違いを考えるみたいな話
この記事でやること
基本感情は言語によらず任意の意味空間でガウス分布するものと仮定します。英語と日本語でそれぞれ学習したfasttextのモデル内で基本感情のベクトル表現を考え、6つの基本感情の分布間距離(バタチャリヤ距離)でつくる構造を比べることで、英語の感情語と日本語の感情語の違いに思いを馳せます。
モチベーション
あなたの「嬉しい」と私の「嬉しい」って、わりと意味が違うだろうと思うんですよね。いや、もちろん何について「嬉しい」と感じるかが異なるからには違うにきまっているわけですが、もっとこう、「嬉しい」という語を使うときに抱いているクオリアのレベルで、同じ「嬉しい」で形容される状況であっても私たちはしばしば質的に異なる感情を抱いているのではないかと思うのです。
私たちの感じる感情がはたしてヒトに普遍的なものかというのは壮大な問いです。一方では文化や言語によらず普遍的な感情もあるだろうと主張して数種類の「基本感情」を提案した研究があり、他方ではやっぱり違う部分は違うやろという社会構築主義的な視点にたち、感情の個人差や社会文化レベルでの差異に注目した研究もあります。そのへんはまあそういう、議論の尽きない領域なのですが、そもそも感情のもつ意味あいが個人や言語間で異なるとして、その違いをどうやって評価するのかという疑問が生じるわけです。
文化人類学とかの研究だと、写真や音声を使って、集団によって感情の認知のしかたに違いがあるかを調べるのでしょうが、そうじゃなくてもっとこう〈感情をあらわす語の意味あいの違い〉みたいなものをわかりやすく比較できないかなーと。
おことわり
この記事を書いた人はべつにこの記事に関連することが専門ではないので、以下の内容はすべて個人のふわっとした理解によるものです。あまり真に受けないでください。
また、2019年3月とかに書いた記事らしいのでたぶんいろいろと古いのと、この当時のfasttextの日本語モデルは一部のベクトルがおかしい「壊れた」モデルだったことが知られている(このことは記事を書いた後になって知った)ため、意味のある実験なのかよくわかりません。
ふわっとした話
ここでは、言語間の〈感情をあらわす語の意味あいの違い〉を比較することを目的とします。
そのためにまず〈感情をあらわす語の意味あい〉を適当な単語埋め込みのベクトル空間内でとらえることを考えます。語の意味あいというのは、とどのつまりほかの語との関係性です。そこで、感情語どうしの類似度(距離)を考えることで、ベクトル空間内における〈感情をあらわす語の意味あい〉を定量化します。ようするに距離行列をつくります。
距離行列で言語内における〈感情をあらわす語の意味あい〉を定量化できますが、ふつうにベクトル間の距離を使って得られる距離行列では、基底となるベクトルが異なるため、言語間での比較をおこなうことができません。そこで、いくつかの基本感情を言語によらず任意の意味空間でガウス分布するものと仮定し、基本感情の分布間距離でつくる距離行列を考えることにします。
私のふわっとした理解によれば、任意の単語埋め込み(同じパラメータで作成されたモデルだとします)間での語の翻訳とは、こっちの単語埋め込みからあちらの単語埋め込みへの写像を考えることで、ベクトルの一次変換に相当します。ヘリンガー距離やバタチャリヤ距離といった分布間距離では、距離構造は任意の一次変換をほどこしても変化しない特性があるため、基本感情の分布間距離でつくる距離構造を考えれば、言語間で比較をおこなってもよいことになります。
具体的な話
使用するモデル
facebookresearchが公開しているfasttextの学習済みモデルを使います。今回はEnglishとJapaneseの学習済みモデルにしました。両方とも同じパラメータで学習した300次元のモデルで、語彙は2,000,000あります。
サイズが大きすぎて我が家の雑魚マシンでは扱えないので、それぞれのモデルの先頭から150,000語(語彙は出現頻度の降順で並んでいる)だけ使っていくことにします。
基本感情
Ekmanの提案する6つの基本感情(”anger”, “fear”, “disgust”, “joy”, “sadness”, “surprise”)を採用し、英語と日本語それぞれの言語内で基本感情の分布間距離を求めます。
といっても、どの語彙がどの基本感情に由来するものなのかは当然わからないので、なんとなく基本感情をあらわしているのではと考えられる語を適当に決めて、それぞれの語の近傍ベクトルを50個ずつ求めたものをそれぞれの基本感情のサンプルということにしました。
以下が適当に決めた語です。
anger | fear | disgust | joy | sadness | surprise | |
---|---|---|---|---|---|---|
英語 | ^angry$ | ^fearing$ | ^disgusted$ | ^joyful$ | ^sad$ | ^surprised$ |
日本語 | ^怒っ$ | ^怖い$ | ^嫌$ | ^嬉しい$ | ^悲しい$ | ^驚い$ |
以下は近傍ベクトルをUMAPで2次元に落としてプロットしたものです。6つの基本感情に対応する語の近傍ベクトルを50個ずつ取っていますが、英語でも日本語でも重複する語彙があるため260個前後しかプロットされていません。色は重複を除いたあとであらためてk-meansでクラスタリングしてつけたものです。
最近傍探索
この記事を書いた人はRユーザーで、{rflann}を使いました(2019年3月現在すでにCRANから削除されているので注意)。Rで最近傍探索する場合、{RcppAnnoy}もあるよ。
バタチャリヤ距離
bio3d::bhattacharyya()
でバタチャリヤ係数を計算して-log()
しました。雰囲気で使ったので使い方が間違っているかもしれないですが、深く考えないでおきます。
可視化
距離行列を直で貼っても何だかわからないと思われるので、グラフを描くことにしました。
雰囲気としてはこんな感じです。距離行列でバタチャリヤ距離を使っているのにMDSしていいのか(バタチャリヤ距離で張っている空間を2次元のユークリッド空間で近似してはたして意味があるのか)よくわからないですが、深く考えないでおきます。
g <- make_full_graph(n = 6)
V(g)$name <- emotions[[i]]$rownames
ggraph(g, layout = "igraph", algorithm = "mds", dist = distances[[1]][[2]], dim = 2) +
geom_edge_link() +
geom_node_point() +
geom_node_label(aes(label = name), repel = TRUE) +
theme_light()
結果
こんな感じになります。
バタチャリヤ距離での距離構造
英語
日本語
ユークリッド距離での距離構造
参考までに、それぞれの基本感情のサンプルについてkmeans(centers = 1)
にぶち込んで出したcenterを「基本感情ベクトル」として、基本感情ベクトル間のユークリッド距離を求めてつくった距離構造のグラフも貼っておきます。
英語
日本語
思いを馳せる
思っていた以上に対応がなくてちょっと何を書けばいいか思いつかないです。
いちおうデンドログラムも描いたのですが、fearの意味あいがだいぶ違うかなーくらいの感想しかないですね。ただこれは分布間距離で近いから質的に近い感情かもという話ではなく、fasttextの理屈的には出てきやすいコンテキストが近いということだと思うので、日本人がfearを感じるコンテキストはほかの5つの基本感情を感じるコンテキストとはだいぶ違うという話だと思います。