人間の言葉をコンピュータが理解できるようにするための「ベクトル化」の話

全ての道はベクトル化に通ず
2022.12.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

12月に毎日楽しみにすることと言えば、そう。これですね。


▲ 今年はめちゃくちゃ美味しいシュトーレンを買って育てています

こんにちは。データアナリティクス事業本部 インテグレーション部 機械学習チームのShirotaです。
これは「 クラスメソッド 機械学習チーム アドベントカレンダー 2022 」12/5(月)の記事となっております。
前日 12/4(日)の記事は以下よりご覧ください。Amazon Forecastがいい仕事をしております。

さて、私はこの12月を勝手に 自然言語処理強化月間 として、自然言語処理について学習したことを基礎的なことから中心に記事にしていく予定です。
予定なので、機械学習分野の別のことやクラウドで触れるマネージドなML系サービスを触った記事になることもあるかもしれませんが、基本的にはこの方針でやっていこうと思います。
早速いってみましょう!

そもそも自然言語処理とは何か

まず、自然言語処理とは何かについて簡単にお話しします。
コンピュータは基本的にプログラム言語(人工言語)を使って指示を受け、処理を実行するものです。
対して、我々が普段使っている日本語や英語といった言語は自然言語と 呼ばれる言語となっています。
コンピュータは基本的には自然言語を理解するようには作られていません。
ここで「え?家にあるAlexaは呼びかけたらちゃんと理解して仕事してくれるよ?」と思われた方もいるかもしれません。
これが成り立つためには、 自然言語処理 と言われる技術が必要になってきます。

すなわち自然言語処理は、自然言語をコンピュータに理解できるようにして処理させる技術と言えるでしょう。

自然言語処理にある4つの処理プロセス

大まかに分けて、自然言語処理には4つの処理プロセスがあります。

形態素解析

形態素解析は、文書を意味を持つ最小単位(形態素)に分解して品詞を割り振るものです。
実は以前、形態素解析については今年頭に書いた再ジョインブログに用いています。

その後このブログの作り方について社内で話す機会があり、社内LTで発表しました。
その時に作成した資料の形態素解析に関する部分を抜粋したものをアップしたので、よかったらこちらをご覧ください。

構文解析

構文解析は、形態素解析で分解した形態素を文節の単位にまとめてそれぞれの関係性を解析するものです。

例えば「私」「は」「猫」「だ」と形態素解析で分解したものを、「私は」「猫だ」と文節の単位にまとめます。
この「私は」「猫だ」に関しては、「私は」が主語、「猫だ」が述語の関係ということができます。
別の例として、「かわいい」「猫」と形態素解析で分解したものがあった時、「かわいい」「猫」が文節の単位になります。形態素単体で文節となることもできるのです。
そしてこの「かわいい」「猫」に関しては、「かわいい」が「猫」に対する修飾語で「猫」は被修飾語の関係になります。

主語が述語を「受け」る、修飾語が被修飾語に「係る」ことから、これは「係り受け解析」とも呼ばれます。

意味解析

意味解析は、構文解析で解析した文書がどのような意味を持つか解析するものです。
文法的にはあり得ても文書的には成立しない構文を単語の意味などから判断することができます。

「頭が赤い魚を食べる猫」の話をインターネットで見かけたことがある人は多いのではないかと思います。(初めて聞いた、という方は「頭が赤い魚を食べる猫」で検索してみてくだ。考案者の方のTwitterでのツイートが上位に表示されると思います
上記の例で言うと、構文解析の段階では「頭が」が「赤い魚を食べる猫」に係る、猫が頭で赤い魚を食べると言う意味合いの文書も成り立つことになります。
しかし、現状ではこの世界において頭で魚を食べる猫は存在しません。
単語の意味からこういったことを判断して成立する文書を解析することが意味解析となっています。

文脈解析

文脈解析は、複数の文書間の関係性やそれに伴いどのような意味を持つかを解析するものです。

例えば、日本語には同じ単語で複数の意味を持つものがあります。
「養生」と言う単語には、「体を大事にする」という意味と「土木工事で固まらないコンクリートを保護する、建築で柱や壁に傷がつかないよう保護する」という意味が存在します。
「ここ養生しておいて」と言った際、我々はこれを聞いて「この場所を養生すると言った文脈に取れるから後者の養生だな」と理解することができます。
これは日本語の例でしたが、勿論英語でも同じ単語で複数の意味を持つものがあります。
こう言った文書の話題を読み取り適切な単語の意味をコンピュータが理解できるようにするために文脈解析があります。

4つの処理プロセスは内容から見ても分かるように、シンプルな形態素解析が一番精度も高く理解しやすいものとなっております。
そして構文解析・意味解析・文脈解析とより長く複雑な文書を解析することになり、精度も低くなっていく傾向があります。

自然言語処理の主なプロセスを紹介したところで、今回はその中でも一番基礎となる形態素解析を行うことで何ができるようになるかと言った話をしていきましょう。

形態素解析をすることでできるようになること

形態素解析を行うことで、文書を「数値化(以下 ベクトル化)する」ことができるようになります。
ここで補足ですが日本語のような単語の区切りがそのままではコンピュータで理解できない言語においては形態素解析が必要になってきます。
英語などは、元々スペース区切りで単語が分割されているのでこれを行わなくてもベクトル化することができます。
文書については、その他に様々な前処理(表記揺れを統一する正規化や単体では意味を持たない助詞・助動詞を除去する)を実施する必要はあります。

また文書のように、画像や音声と言ったデータもベクトル化することができます。
例えば、

  • pngやjpgといったラスターデータはピクセルの集合体でできており、ピクセルの濃淡を数値で表現して配列に格納する
  • 音声をフーリエ変換を用いて周波数データとする

と言った処理を実施することでベクトル化することができます。
ベクトル化することで、機械学習の入力として利用できるようになります。
より正確に言うなら、効率良く学習を進めることができる入力として利用できるようになると言ったところでしょうか。 また、ベクトルになったデータはそれぞれの関連性を調べることができるようになります。
自然言語処理においては「コサイン類似度」と呼ばれるものがあり、これを用いて文書の類似度を計算できるようになります。
人間が見て「なんとなくこの文章似ているな」と感じるものを、コンピュータがより確実に「この文章は似ているよ」と解析できるようになるわけです。

ここからは、そんな自然言語におけるベクトル化の手法を見ていきましょう。

自然言語におけるベクトル化の手法について

大きく分けて、2種類の手法があります。

カウントベースの手法

これは、コーパスと呼ばれる自然言語処理の研究に用いるために集積された、構造化して情報を付与した大量のテキストデータを用いて行われる手法です。
以下、有名な2種類のカウントベースの手法について紹介します。

  • Bag of Words(BoW)

BoWは、形態素解析で分割した単語を文書ごとに何回出現したかを数えベクトルとする手法です。
この手法を実施する前に、前述した前処理(表記揺れを統一する正規化や単体では意味を持たない助詞・助動詞を除去する)を確実に実施しておく必要があります。
前処理を実施しておかないと、文書ごとに出現した正しい単語数が取得できなかったり、文書において意味を持たない助詞や助動詞が一番多いと言う結果が出てしまうからです。
この手法は分かりやすくシンプルですが、単語数をカウントする特性上、文書が長い方が有利になるという欠点があります。
そこで重み付けに焦点をおいたのが次の手法です。

  • Term Frequency - Inverse Document Frequency(TF-IDF)

TF-IDFは、文書中の単語の重要度を評価する手法です。
TFとIDFという2つの値の積を用いたものになっております。
それぞれの説明をすると、

  • TF:単語出現頻度。ある文書中のある単語の出現数/ある文書の全単語の出現回数の和 を求めることによって、ある単語の重要度を数値化する
  • IDF:逆文書頻度。ある単語が含まれている文書数/総文書数(DF)の逆数を取り、文章の規模に対してIDF値の変化を小さくするために対数を取ったもの

TF-IDFについては以下ブログで分かりやすく説明されていたのでよかったらこちらをご覧ください。

この手法にも欠点があり、それは文書の集合体の中での文書の長さによってTF値が影響を受けてしまうというものです。
しかし、この欠点を補うためにTF-IDFを改良した「Okapi BM25」という手法が生まれました。
以下、Wikipediaのリンクを参考に載せておきます。

ここまでカウントベースの手法を紹介してきましたが、これらの手法では文書自体の類似度が求められるが各単語の類似度は求められません。
そこで、次から紹介する分散表現を用いる手法が生まれました。

分散表現を用いる手法

分散表現は、単語そのものをベクトルにマッピングするものです。これを用い、単語ごとの類似度を求めることができる手法です。
2013年にGoogleが発表した Word2Vec が有名なものとしてまず挙げられます。
これは「ある単語の前後にある単語は関連性が高い単語である可能性が高い」という分布仮説を利用した手法になっております。

Word2Vecについては以下ブログで分かりやすく説明されていたのでよかったらこちらをご覧ください。

Word2Vecには中心となる単語から前後の単語を予測する「Skip-Gram」モデルとその逆である前後の単語から中心となる単語を予測する「Countinuous Bag-of-Words(CBOW)」モデルが存在します。

自然言語処理以外にも使える手法として、最近だと Transformer や、自然言語処理分野においてはTransformerをベースにした BERTGPT-3 などが有名です。
つい数日前にGPT-3を開発しているOpen AIが発表した対話に最適化されたモデルである ChatGPT を発表したことは皆さんの記憶に新しいのではないでしょうか。

簡単な説明にはなってしまいましたが、このように主に2つのベクトル化の手法があります。

ベクトル化は自然言語処理において必ず通る道

このようにして文書をベクトル化することにより単語の関連性や文書の関連性を見出す手法は、検索や感情分析など様々なものに用いられます。

今回は自然言語処理の概要・その際に必要となってくるベクトル化について簡単にまとめてみました。
それぞれについて、今後は手を動かし理論を学びながらより理解を深めていこうと思います。

明日の機械学習チームのアドベントカレンダーもどうぞお楽しみに!