6-2-2 機械にとって、言葉とは何か

私たちは、言葉を読むとき、ただ文字を眺めているわけではありません。

「りんご」と「みかん」は少し近い感じがするし、「はし」という言葉は、文脈によって意味が変わることもある。
そんなふうに、私たちは言葉の意味や関係を自然に感じ取りながら読んでいます。

でも機械にとって、言葉は最初から意味のあるものではありません。
ただの記号の並びにすぎないないのです。
だから自然言語処理では、まず言葉を機械が扱える形に変える必要があります。

この章の流れを、最初にざっくり見取り図で置いておきます。

この章の見取り図

まずは、単語をただ数える→ ワンホットベクトル、BoW、n-gram、TF-IDF
次に、意味の近さをベクトルで表す→ 分散表現、単語埋め込み、word2vec、CBOW、スキップグラム、fastText
さらに、文脈ごとに意味が変わると考える→ ELMo
つまりこの章は、数える → 近づける → 文脈で読むという流れで進んでいきます。

ワンホットベクトル、BoW、n-gram、TF-IDF
― 言葉を数える時代

機械に言葉を扱わせようとするとき、いちばん最初に必要なのは、言葉を数字にすることです。
コンピュータは数字の世界で動くので、「犬」「猫」「空」といった単語も、まずは何らかの数の形にしなければなりません。

ワンホットベクトル

いちばん素朴な考え方が、ワンホットベクトルです。
これは、単語ごとに専用の席をひとつ用意して、その単語の席だけを1、ほかを0にする方法です。

たとえば単語帳に




があるとしたら、

犬 → 1 0 0 0
猫 → 0 1 0 0
空 → 0 0 1 0
本 → 0 0 0 1

のように表します。

これは、教室の座席表に近いです。
それぞれの単語が、ただ別々の席に座っているだけ。

わかりやすい方法だけれど、この表し方では

・「犬」と「猫」が少し近い
・「犬」と「本」は遠い

みたいな意味の近さは表せません。
機械にとっては、どの単語もただ別の席にいるだけなのですね。

BoW(Bag-of-Words)

次に出てくるのが、BoWです。
Bag-of-Wordsは、直訳すると「単語の袋」。
これは、文や文書の中にどの単語が何回出てきたかを見る考え方です。

たとえば、

「犬が公園で走る」
「公園で犬が遊ぶ」

という二つの文は、語順は少し違っても、出てくる単語はかなり似ていますよね。
BoWでは、文を「どの単語が入っている袋か」として見るので、単語の出現回数は見ますが、語順はあまり見ません。

たとえるなら、文章を細かく切って単語カードにし、袋に入れてしまう感じです。
袋の中に何が入っているかはわかるけれど、どの順で入れたかはわからなくなる。
だからBoWはシンプルで使いやすいけれど、文の流れや順番をあまり扱えないという弱点もあります。

n-gram

そこで、語順を少しだけ意識しようとする考え方が、n-gramです。
n-gramでは、単語を1個ずつではなく、連続するn個のまとまりとして見ます

たとえば2-gramなら、

「私は 本を 読む」

私は
本を
読む

ではなく、

私は 本を
本を 読む

のような、続き方として見ます。

これは、BoWが単語カードをばらばらに袋へ入れる方法だとしたら、n-gramは隣どうしのカードを少しつなげて残す感じです。
だからn-gramを使うと、単語の出現だけでなく、どう続いていたかも少し見られるようになります。

TF-IDF

でも、単語をただ数えるだけだと、どの単語も同じ重さに見えてしまうことがあります。
たとえば日本語の文章では、「の」「は」「が」のような語はよく出てきますよね。
でも、そうした語は多くの文章に出てくるので、その文章らしさを表しているとは言いにくい。

そこで使われるのが、TF-IDFです。
TF-IDFは、その文章の中ではよく出てくるけれど、ほかの文章ではそれほどよく出てこない単語を、その文章にとって大事な語だと考える方法です。

ここで、

TF(Term Frequency) は、その単語がその文章の中でどれくらい出てくるか
IDF(Inverse Document Frequency) は、その単語がたくさんの文章の中で見たとき、どれくらい珍しいか

を表します。

つまりTF-IDFは、文章の中でよく出ることと、ほかの文章ではあまり出てこないことの両方を見ているのです。

たとえば、「G検定の勉強法」という文章の中で、「シラバス」や「模試」という言葉が何度も出てきて、しかもほかの一般的な文章ではあまり出てこないなら、その語はその文章にとって重要そうですよね。
逆に、「です」「ある」「もの」のような語は、どんな文章にもよく出てくるので、TFが高くても、その文章ならではのキーワードとは言いにくいです。
だからTF-IDFの値が大きい単語は、その文章の中でよく使われていて、しかもその文章らしさをよく表している語だと考えられます。

たとえるなら、たくさんの本が並ぶ本棚の中で、どの本にも出てくるありふれた言葉ではなく、この本を読むと特によく目に入る、その本らしい言葉に印をつけるような方法です。

分散表現、単語埋め込み、word2vec、CBOW、スキップグラム、fastText
― 言葉の意味を近さで表す時代

ここまでの方法は、言葉を数字にできるという意味では大事でした。
でもまだ、言葉の意味の近さまではうまく表せませんでした。

「犬」と「猫」は近い感じがする。
「王」と「女王」には関係がある。
そんな「感じ」や「関係」を機械にも扱わせたい。

そこで出てきたのが、分散表現や単語埋め込みという考え方です。

分散表現・単語埋め込み

分散表現とは、単語を、ひとつの席だけで表すのではなく、複数の数の組み合わせで表す考え方です。
そして、その中でも単語を意味の近さが表れるようなベクトルにすることを、単語埋め込みと呼ぶことが多いです。

たとえば、
「犬」と「猫」はベクトルの位置が近くなり、
「犬」と「机」は遠くなる。

つまり単語を、ただ別々の席に座らせるのではなく、意味が近い単語どうしは、近い場所に並ぶようにするわけです。
これは、単語たちを大きな地図の上に並べていく感じに近いです。
似たものは近く、違うものは遠く。
ここで初めて、機械の中に意味の地図が生まれはじめます。

word2vec

その流れの中でとても有名なのが、word2vecです。
word2vecは、単語の周りにどんな単語が現れるかを手がかりにして、意味の近い単語どうしを近いベクトルにしていく方法です。
考え方の芯にあるのは、似た文脈で使われる単語は、意味も近いだろうという発想です。

たとえば、

・犬が走る
・猫が走る

のように、似た場所に現れやすいなら、「犬」と「猫」は少し近い意味を持っていそうですよね。
word2vecは、この「周りの言葉との関係」から、単語の意味を学ぼうとした方法です。

CBOW

word2vecには、代表的な学習の仕方が二つあります。
その一つが、CBOWです。
CBOWは、周りの単語から、真ん中の単語を予測する方法です。

たとえば、

「私は _ を読む」

という文があったとき、
周りの単語から「本」が来そうだ、と予測するような感じです。
つまりCBOWは、文脈を見て、そこに入りそうな単語を当てる学び方です。

スキップグラム

もう一つが、スキップグラムです。
こちらはCBOWとは逆で、真ん中の単語から、周りの単語を予測する方法です。

たとえば「本」という単語があったとき、
その周囲には

読む
面白い
借りる

みたいな語が来やすいかもしれない。
つまりスキップグラムは、ある単語が、どんな文脈に現れやすいかを学ぶ方法です。

CBOWとスキップグラムは向きが逆だけれど、どちらも周りの言葉との関係から意味を学ぶという点では同じです。

fastText

fastTextは、word2vecの考え方を受け継ぎつつ、さらに単語の中の文字の並びも活かそうとした方法です。

たとえば、

・食べる
・食べた
・食べます

のように、似た形を持つ単語は、意味的にも関係が近いことがありますよね。
fastTextでは、単語をまるごと一つとして見るだけでなく、その中の部分的な形も手がかりにします。
これによって、あまり見たことのない単語や、形が似ている単語にも対応しやすくなります

たとえるなら、単語をひとまとまりの箱として見るだけでなく、その箱の中の部品の似かよい方も見る感じです。

ELMo
― 文脈の中で言葉を見る時代

ここまで来ると、機械はかなり「意味の近さ」を扱えるようになってきました。
でも、まだ大きな問題が残っていました。
それは、同じ単語でも、文脈によって意味が変わるということです。

たとえば「はし」は、



のように、文によって意味が変わりますよね。

でもword2vecのような方法では、一つの単語に対して、基本的に一つのベクトルを与えることが多いです。
すると、「はし」の意味の揺れを表しにくいですよね。
ここで出てきたのが、ELMoです。
ELMoは、単語の意味を、その単語だけで決めるのではなく、文脈の中で変わるものとして扱う考え方を持った表現です。
つまりELMoでは、同じ単語でも、

・どんな文の中にいるか
・前後にどんな言葉があるか

によって、表現が変わります。
たとえるなら、一人の人でも、家族の中にいるときの顔、仕事中の顔、友人といるときの顔が少しずつ違うようなものです。
単語もまた、文の中で置かれる場所によって、少しずつ意味の表情を変えます。
ELMoは、そうした文脈込みの言葉の意味を扱おうとした点で、とても大事な一歩でした。

まとめ

ワンホットベクトル→ 単語ごとに別の席を用意する
BoW→ 文書を「どの単語がいくつあるか」で見る
n-gram→ 単語の続き方も少し見る
TF-IDF→ その文章でよく出て、しかも文章らしさを表す語を重く見る
分散表現・単語埋め込み→ 単語の意味の近さが表れるベクトルにする
word2vec→ 周りの単語との関係から意味を学ぶ
CBOW→ word2vecのテクニックの一つ。周りの単語から真ん中を予測する
スキップグラム→ word2vecのテクニックの一つ。真ん中の単語から周りを予測する
fastText→ 単語の中の形も手がかりにする
ELMo→ 文脈によって単語の意味が変わることを表現する

next ▶ 翻訳モデルの発展