【自然言語処理】AI、自然言語処理の初心者が頑張って自然言語処理と分散表現を説明してみる（出来るだけ簡単にわかりやすく）

# はじめに
タイトルにも書いた通り、私はAIや自然言語処理に関して初心者です。その世界は未知の領域です。
普段はSIerとして公共系などのシステム開発を行っているため最新の技術とは縁がなく「AI？なにそれ？」状態です。
そんな私が頑張って出来るだけ簡単に自然言語処理と分散表現を説明してみたいと思います。
・・・というか難しいことがわからないからこそ簡単に説明できるのではないかと思い記事を書くことにしました。もし間違っていることを言っていたらコメントでご指摘ください。

# 自然言語処理とは
そもそも自然言語処理がわかりません。
[Wikipedia](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86)で調べてみると

>自然言語処理（しぜんげんごしょり、英語: natural language processing、略称：NLP）は、人間が日常的に使っている自然言語をコンピュータに処理させる一連の技術であり、人工知能と言語学の一分野である。

と書かれています。
一旦、**「AIを使って人間の言葉を理解させる技術」**と理解しました。
なるほど。人間の普段話している言葉を機械が処理出来たら夢が広がりますね。
例えばスマホに「はるちゃんに電話かけて」と話しかけて指で操作せずに電話をかけたり、テレビに「もう寝るからテレビ消して」とお願いしてリモコンを探さずとも寝ることが出来るような未来がくるかもしれません。とても驚きですね。未来的です。

エンジニアの僕らは機械が理解できるように「プログラミング言語」を使用しますが、機械向けであるがゆえに構文が厳しく決められています。Javaというプログラミング言語では一見同じ文字列『あいうえお』でも「＝」で比較すると「違うものだよ！」と判断してしまいます。文字列『あいうえお』は同じ文字でも文字が書かれている紙は別物だよね？といったイメージです。**「曖昧さ」**にとても厳しいです。

機械は**「曖昧さ」**に厳しい。それはわかりました。しかし、私たちの普段使っている言葉には**「曖昧さ」**が多く含まれています。

会話の相槌なんて「やばいね」だけで成立してしまいます。

「先程、私はあちらの可愛らしい白い壁の店内でお食事をいただきました。」
「さっきあの白い壁の可愛いお店でご飯を食べたー。」
これらはほぼ同じ意味です。

曖昧ですね。どうやら自然言語処理とはこの曖昧さをどうにかしてくれる技術みたいです。
※相槌の「やばいね」を自然言語処理で解釈できるかはわかりません。

# 分散表現とは
自然言語処理はなんとなくわかりました。
次に**「分散表現」**です。
Wikipediaで調べてみると・・ん？なんとWikipediaに**「分散表現」**のページがありません。
これも自然言語の曖昧さのせいでしょうか。とりあえず**「分散表現」**でGoogle検索してみます。
2021/03/16時点で最初にヒットする[岩波データサイエンス - 分散表現(単語埋め込み)](https://sites.google.com/site/iwanamidatascience/vol2/word-embedding)から引用してみたいと思います。

>分散表現（あるいは単語埋め込み）とは、単語を高次元の実数ベクトルで表現する技術です。
近い意味の単語を近いベクトルに対応させるのが分散表現の基本ですが、最近はベクトルの足し算が意味の足し算に対応する「加法構成性」などを中心に、理論や応用の研究が進んでいます。

あーなるほど。・・・全然わからん。

**「単語を高次元の実数ベクトルで表現する技術」**がどうもやっかいです。ベクトルと言われても普段使わない単語なのでピンときません。

## ベクトル
どうもベクトルとは**「向きと大きさを持つ量のこと」**らしいです。
よくわからないのでGoogleでベクトルを画像検索してみました。すると矢印が描かれた画像ばかり出てきます。色々な方向に伸びた様々な長さの矢印です。
なるほどなるほど。**「ベクトルは矢印のこと」**みたいです。その理解で進めます。

## 高次元
次にやっかいなのが**「高次元」**です。次元？
ベクトルと同じく**「次元」**でもGoogle画像検索をしてみました。すると『黒いハットを目深くかぶり、タバコを咥えて銃までもっている髭の紳士』しか出てきません。きっと求めているのはそれではありません。
諦めて辞書で調べてみると

>数学で、一般的な空間の広がり方の度合いを表すもの。座標の数で表される。線は一次元、面は二次元、立体は三次元。空間は三次元であるが、n次元や無限次元も考えられる。

と書いてありました。
よくわからないので**「○○次元は空間のてっぺんが○○個、高次元は空間のてっぺんがたくさん。つまりトゲトゲ空間」**と理解しました。もうこれ以上噛み砕くのは無理です。

## 高次元の実数ベクトル
色々と調べたところで**「単語を高次元の実数ベクトルで表現する技術」**をもう一度考えてみます。
**「ベクトル＝矢印」**、**「高次元＝トゲトゲ空間」**なので・・・
**「単語を高次元の実数ベクトルで表現する技術」**は**「単語をトゲトゲ空間に矢印で表現する技術」**と読み替えることが出来ました。

ん？

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1203022/d221b1a6-29f0-692b-0006-44b2b52dca70.png)

ウニ（雲丹）？

たぶんそんなに間違った解釈ではないと信じてます。

**「分散表現された単語はウニ」**です。トゲトゲひとつひとつに意味があるだけです。
**「無数のトゲにそれぞれ意味があって、長さがウニの個体（分散表現された単語）によってバラバラ」**ただそれだけです。

自然界のウニと違うのはトゲの数（次元の数）が決まっていることくらいでしょうか。機械学習時に次元の数を指定するので。
きっと似た意味の単語はウニ変換された時の形も似ているはずです。少なくとも同じ意味のトゲを比較すると、そのいくつかが同じくらいの長さになっているはずです。

## トゲ？意味？例えば？
**「スイーツ図鑑」**を機械学習してみます。
そこには**「甘い」**という意味のトゲや**「日本っぽさ」**という意味のトゲが見つかりました。
トゲはたくさんあります。それこそ無数に。なんせ高次元ですから。

**「どら焼き」**という単語の**「甘い」**という意味のトゲをみてみます。MAXに近いです。とても良いスコア。100点満点で90点ほどでしょうか。**「日本っぽさ」**というトゲに着目してみてもきっと頂点に近いはずです。

同じカテゴリにいそうな**「ドーナツ」**という単語もみてみましょう。**「甘い」**という意味のトゲをみてみるとMAXに近いです。さすが**「どら焼き」**と同じスイーツです。

しかし、**「日本っぽさ」**というトゲに着目してみてるときっと頂点から離れています。ミスタードーナツの貢献度を考えても100点満点で5点ほどでしょうか。

表にするとこんな感じ（数値は適当です）
わかりやすいように関係なさそうな物も追加してみました。

|  |どら焼き  |ドーナツ  |おはぎ |大福 |あんまん  |ピザ  |かつ丼  |ピエール・エルメ  |
|---|---|---|---|---|---|---|---|---|
|甘さ  |<font color="Red">92点</font>  |<font color="Red">98点</font>  |<font color="Red">90点</font>  |<font color="Red">90点</font>  |<font color="Red">90点</font>  |5点  |8点  |1点 |
|豆っぽさ  |<font color="Red">95点</font>  |1点  |<font color="Red">95点</font>  |<font color="Red">95点</font>  |<font color="Red">90点</font>  |1点 |3点  |0点 |
|日本っぽさ  |<font color="Red">99点</font>  |5点  |<font color="Red">99点</font>  |<font color="Red">99点</font>  |60点 |5点 |<font color="Red">95点</font>  |1点 |
|間食っぽさ  |<font color="Red">90点</font>  |<font color="Red">90点</font>  |<font color="Red">90点</font>  |<font color="Red">90点</font>  |80点 |15点  |5点  |0点 |
|昼食っぽさ  |5点  |5点  |5点  |10点  |80点 |<font color="Red">90点</font>  |<font color="Red">95点</font>  |0点 |

90点越えを赤文字にするとよくわかると思います。
「どら焼き」と「おはぎ」、「大福」は共通点が多いことがわかります。
きっとウニ変換（分散表現）された単語の形を視覚的に見ることが出来るなら形がそっくりなはずです。
逆に「パティスリー界のピカソ」といわれている天才ピエール・エルメは人物ですのでこの表にある特徴からは外れています。
※自分で書いていてアレですが豆っぽさってなんですかね？

これが**「分散表現」**です。
私はちょっとそれっぽく**「基になる文章群を学習し、単語に色々な意味のスコアをつける（数値化する）ことで類似度（関係の深さ）を導き出す技術」**と理解しました。
もっと簡単に**「単語をウニっぽい形に変換して特徴をトゲの長さで表すとこでわかりやすくする技術」**という理解で良いです。

## 補足
一応注意点として伝えておくと・・・実際の機械学習済データには「甘さ」なんていうハッキリとした意味が定義されるわけではありません。学習対象の様々な類似性を判断し、結果的にベクトルのひとつが「甘さ」のような意味を持っていることは考えられますが難しいのであまり気にしなくていいと思います。

それと実際に分散表現された単語ベクトルはこんな感じですがこれも難しいのであまり気にしなくていいと思います。

どら焼き [ 0.989845845 ] [ 0.84546897546 ] [ 0.256469879 ] .......
ドーナツ [ 0.115498646 ] [ 0.24878454646 ] [ 0.994599989 ] .......

結局のところ視覚化しようとするとウニですし。

# 単語の色々な意味が数値化されることで何が嬉しいのか
さて、単語を色々な意味で数値化したことで何が起こるでしょうか？

## 単語が類似しているかがわかる
これは先程から説明しているのでイメージしやすいと思います。
単語**「王様」**と**「女王様」**はきっと類似していると言えるのではないでしょうか？どちらも国を治める側の人間です。色々なトゲトゲが近くなってそうです。
**「王様」**の子供である**「王子様」**も近しい気がします。それだけではなく、人ではない**「王冠」**や**「国」**、**「統治」**も関係性が深い言葉です。
**「トヨタ」**の類似度が高い単語は**「ホンダ」**や**「車」**、**「輸出」**などですかね。それらの単語は同じ文章内に登場することも多いでしょう。
きっとここまで読んでいただいたことで各単語の共通点を**「トゲ」**として頭の中で思い浮かべてくれているのではないでしょうか。

ここで覚えて欲しいのは**「単語が類似している ≠ 類義語」**ということです。
**「類義語」**は同じ意味の言葉です。文字の言い換えが出来ます。
しかしここで言っている**「関係性が深い言葉」**は必ずしも言い換えが出来るわけではありません。

**「国王」**は**「王様」**の類義語です。言い換えが出来ます。
しかし、**「王様」**と**関係性が深い言葉**である**「統治」**では別の意味のため言い換えが出来ません。
分散表現を使うことで**「類義語辞書」**ではわからない**関係性が深い言葉**がわかるのです。
何かを調べたい時に検索ワードに関連するワードが候補として出てくると便利ですよね？そういったことも可能になります。


## 単語の演算が出来る
単語の演算？単語の足し算、引き算なんて聞いたことがありません。
聞いたことはありませんが、自然言語処理の世界では出来るんだそうです。

分散表現を用いた**「Word2Vec」**（[Word2Vec - Wikipedia](https://ja.wikipedia.org/wiki/Word2vec)）という技術があります。　
※これはWikipediaにページがあるんですよね。分散表現はないのに。

Word2vecアルゴリズムを使用することで以下のような演算が可能になります。

「王様」- 「男」+ 「女」= 「女王」
「パリ」- 「フランス」+ 「日本」= 「東京」

これは凄いですね。単語を計算出来るなんて。

**「王様」**は一般的に**「国を治める<font color="Red">男性</font>のこと」**を指し、**「女王」**は**「国を治める<font color="Red">女性</font>のこと」**を指します。

**「パリ」**は**「<font color="Red">おフランス</font>の首都」**で、**「東京」**は**「<font color="Red">日本</font>の首都」**です。
**「パリ」**という単語の中には**「パリ＝<font color="Red">おフランス</font>の首都」**という意味が隠れていて、そこから**「おフランス」**を消すことで**「XXX＝○○の首都」**という意味だけが残ります。
その○○に**「日本」**を入れてあげることで**「XXX＝<font color="Red">日本</font>の首都」**、つまり**「東京＝<font color="Red">日本</font>の首都」**という式が成り立ちます。

この計算が出来ることで、**「人工知能が知らない未知の単語でも前後の単語から意味を推測出来る」**のではないでしょうか。

「どら焼きって甘くて美味しいよねー」
「ドーナツって甘くて美味しいよねー」

上記の文章が学習済だとすると、

「○○って甘くて美味しいよねー」

という文章から**「○○＝スイーツ」**と推測出来ると思われます。

「誤字や未知の言葉を含んだ文章」や「曖昧な文章」も精度が高く処理出来るようになりそうです。
何がどうなって精度が高くなるかは説明しません。というかわかりません。調べてはみたものの難しすぎます。数式がいっぱい出てくるので興味がある人（数学得意な人、Σ（シグマ）とかにアレルギーがない人）は調べてみてください。

いつになるかわかりませんが、次はインプット情報（文章群）がどんなフローを経て単語ベクトルに変換され類似語検索が出来るようになるか説明したいと思います。形態素解析とか出てくるやつです。
よし頑張ろう。需要がないかもしれませんが備忘録だと思って書きたいと思います。

# 参考サイト
[自然言語処理 - Wikipedia](https://ja.wikipedia.org/wiki/%E8%87%AA%E7%84%B6%E8%A8%80%E8%AA%9E%E5%87%A6%E7%90%86)
[岩波データサイエンス - 分散表現(単語埋め込み)](https://sites.google.com/site/iwanamidatascience/vol2/word-embedding)
[Word2Vec - Wikipedia](https://ja.wikipedia.org/wiki/Word2vec)
[Word2Vec：発明した本人も驚く単語ベクトルの驚異的な力](https://deepage.net/bigdata/machine_learning/2016/09/02/word2vec_power_of_word_vector.html)
[分散意味表現に基づく言語処理〜word2vecを例に〜 PDF](https://www.eng.okayama-u.ac.jp/oict/wp-content/uploads/2015/07/doc2-1.pdf)
[ベクトルとは何か？ - ベクトルの意味と使い方](https://sci-pursuit.com/math/meaning-of-vector.html)
[次元（じげん） の意味](https://dictionary.goo.ne.jp/word/%E6%AC%A1%E5%85%83/)