1. はじめに
本記事では、機械学習をベースとした自然言語処理の基礎的な事項を紹介します。自然言語処理技術は文書分類や情報検索など様々な問題解決に利用されますが、その問題解決のプロセスは共通するパイプラインによって抽象化できます。そのパイプラインの概略を説明することで、自然言語処理全般について、モデル構築の手続きの概略を把握していただくのが本記事の目的です。
2. 自然言語処理とは
2000年代以降から現在(2022年)は、機械学習の実社会への応用が進む第3次AIブームの最中であるとされています。AI(人工知能)は、画像や音声の認識など、人間の能力をコンピュータ上で動くように模倣したものです。人間には英語や日本語などを理解して、書物や音声から情報を獲得する能力がありますが、このような能力をコンピュータ上で模倣する人工知能技術は自然言語処理と呼ばれます。
自然言語とは、プログラミング言語などの人工言語と区別した言葉で、人間が他者と意思疎通をするために自然に発達した言語を意味します。コンピュータは文字通り機械的に情報を理解するため、コンピュータに理解させることを目的として開発されたプログラミング言語は曖昧性を排除した文法で記述されます。一方、人間には文脈や状況に応じて情報を処理する能力が備わっており、それを反映して英語や日本語などの自然言語は曖昧性を含んだ構造になっています。(その反面、人工言語と比べて簡潔に情報を記述することができます。)このことは、同じ表現でも前後の文脈・背景情報によって解釈が異なる状況を生み出す可能性があることを意味します。この曖昧性が、機械が自然言語を理解することを難しくしています。
初期の人工知能(1950年代)は、作成者が設計したルールに従って動作するルールベースの手法が主でしたが、十分な性能の自然言語処理システムをこの方法で構築するのは困難でした。冒頭でも述べた通り、2000年前後から、データから望ましい出力を学習する機械学習や深層学習の実社会への応用が進んでいますが、自然言語処理もその例外ではありません。特にトランスフォーマーと呼ばれるニューラルネットワークをベースとした2018年のBERTの登場以降、それまで難しいとされていた言語の曖昧な部分もコンピュータ上で取り扱えるようになってきました。本記事では、主に機械学習をベースとした自然言語処理の推論モデル構築の手続きについて、その概略を説明します。
図1: 人工知能・機械学習・深層学習・自然言語処理の関係
3. 自然言語処理のタスク
3-1. 実世界で応用される自然言語処理
自然言語処理と一口に言っても、実世界での応用に繋がる自然言語処理関連の問題はいくつもあります。図2にいくつかの自然言語処理関連のタスクと、実際の活用シーンを表形式で示しました。
図2: 自然言語処理で解かれるタスク(実践自然言語処理 オライリーの分類を参考にした)
3-2. 自然言語処理の処理単位
英語や日本語などの言語を問わず、一般にテキストデータは、文書はいくつかの文から成り、文はいくつかの単語から成る、といった形で、様々な粒度のデータ単位を持ちます。図2に示したように自然言語処理で解ける問題はいくつもありますが、問題に応じてどの粒度でテキストデータを扱うべきかを考える必要があります。
例えばEメールテキストに対して、そのメールがスパムか判定したい場合、1件のEメールのテキスト全体に対してスパムメールか否かの判定をすることが適切です。そのため、スパムメール判定の際には文書単位(メール単位)でデータを取り扱います。一方、Eメールの中からユーザが見るべき箇所の選別・優先度付与をしたい場合には文(センテンス)単位、日付や人名など特定の情報を抽出したい場合には単語単位の取り扱いをすることが妥当です。(図2の分類で前者は「テキスト要約」、後者は「情報抽出」に相当します。)それぞれの粒度の取り扱いの様子を図3に示しました。1つのIDが1つのレコードに相当し、実際に問題を解く際には、それぞれのレコードに対して何らかの推論が為されることになります。例えば、スパムメール判定の場合には各レコードに対してスパムか否かの判定結果が出力される、といった形です。
図3: 目的に応じたデータ整形
4. 自然言語処理パイプライン
3節で述べたように、自然言語処理で解くことができる問題は多様ですが、その問題解決のプロセスは図4に示すような共通のパイプラインに沿って実行することができます。この節では、特に文書単位の自然言語処理を対象として、パイプラインの各手続きを概説します。
4-1. 前処理: テキスト整形
機械学習でテキストデータを取り扱うには、テキストデータを数値で表現する必要があります。特に文書を数値で表現する際には、その文書を構成する単語の種類や出現頻度が利用されます。英語などでは単語の区切りに空白がありますが、日本語などでは単語がどこで区切られるかは自明ではありません。したがって、機械学習による自然言語処理の前に、文書を単語に分割する必要があります。また、収集したテキストは解きたいタスクに関係のないノイズを含むことが一般的です。図4のパイプラインにおける「前処理」では、テキストの数値表現を獲得するための前準備として、このような単語への分割(トークナイズ)や、不要な情報の除去などを行います。
4-1-1. トークナイズ(文や単語への分割)
単語などのテキストを構成する小さい単位はトークンと呼ばれ、テキストをトークンに分割する処理はトークナイズ、トークナイズを実現するシステムのことをトークナイザと呼びます。
単語へのトークナイズの例:
彼は犬を2匹飼っています
⇒「彼」「は」「犬」「を」「2匹」「飼って」「います」
日本語のテキストは英語などと異なり、単語ごとの区切りが明示されていないため、単語単位の解析をするためには単語への分割(分かち書き)をする必要があります。日本語テキストの分かち書きは、形態素解析と呼ばれる処理の中で実現されます。日本語の形態素解析器として、janomeやMeCabなどが知られています。形態素解析器は、人手で整備された言語の辞書を利用してテキストを形態素単位(形態素は意味を持つ文字列の最小の単位を意味し、単語よりも小さい単位ですが、本記事では単語のことを意味すると考えて差し支えありません)に分割するシステムで、対象とする言語の文法的知識を土台として構築されたトークナイザです。
文法的知識をベースとしないトークナイザとして、SentencePieceがあります。SentencePieceは人が事前に定義した語彙数(ユニークなトークンの数)に合うように機械的にテキストを分割することができ、一般的に分割後のトークンは単語の一部分だったり単語と単語を跨いだ文字列であったり、言語的背景とは独立したものになります。後述するBERTなどのニューラル言語モデルでは扱える語彙サイズに制限があり、任意の語彙数を指定できるSentencePieceとの相性が良いことが知られています。
4-1-2. その他の前処理
トークナイズ以外にも、精度の高い機械学習モデルを得るために様々な前処理が適用されます。例えば、インターネットで収集したテキストデータを利用する場合には、htmlタグなどの不要な情報が含まれるため、それらを除去することが必要になります。その他、一般的に単語の正規化(語幹化、見出し語化)やストップワードの除去といった前処理が行われますが、本記事では詳細の説明は割愛します。
4-2. 特徴抽出: テキストの数値表現の獲得
「前処理」によってテキストの数値表現を得るための準備ができたら、実際に数値データへの変換を行います。最終的に精度の高い推論モデルが得られるか否かは、良い数値表現が使えるか否かでほぼ決まると言っても過言ではなく、このプロセスは非常に重要です。主要な数値データへの変換方法には、単語の出現頻度を元にしたカウントベースの方法と、ニューラルネットワークによる埋め込み表現を利用する方法とが存在します。以下では、カウントベースの方法としてBoWとTF-IDF、埋め込み表現を利用した方法としてWord2VecとBERTを紹介します。
4-2-1. Bag of Words (BoW)
テキストが与えられたときに、それが「スポーツ」に関するものか、「IT」に関するものかを判別したいような状況を考えます。直感的には、テキスト中に「サッカー」や「野球」などの単語が出現すれば前者の可能性が、「python」や「クラウド」などの単語が出現すれば後者の可能性が高いと考えられます。出現する回数が高い単語は、そのテキストの中で何度も触れられていると考えられるため、「サッカー」が1回、「python」が10回出現するようなテキストがあれば、どちらかといえばIT色が強い可能性が高いでしょう。これらの直感を反映するために、テキストを構成する単語の出現回数を用いて数値化する方法が考えられます。これはBag of words (BoW)と呼ばれる数値化手法です。
語彙数(ユニークな単語の数)が$V$の場合、BoWによる数値化の結果は$V$次元のベクトルになります。あるテキストの数値表現は、その中での各単語$w_1, w_2,\dots,w_V$の出現回数を並べたベクトル$(n_1, n_2,\dots,n_V)$で与えられます。
BoWでは単語の出現回数だけが考慮されて、出現する順番については考慮されません。テキストは単語の順序によって意味が全く異なることが普通ですが、BoWではその意味の違いが全く反映されないということになります。BoWに単語の順序情報を取り入れるための拡張として、単語の代わりにN-グラム(N-gram)を利用したBag of N-grams (BoN)があります。N-グラムはテキスト中で連続して出現するN個の単語を一つの固まりと考えた単位です。2-グラムはバイグラム(bigram)、3-グラムはトライグラム(trigram)とも呼ばれ、1-グラムは単語と同義です。出現しうるN-グラムが$g_1, g_2,\dots,g_G$の$G$種類であった場合、BoNによるテキストの数値表現はそれぞれのN-グラムの出現回数を並べたベクトル$(n_1, n_2,\dots,n_G)$になります。
BoWでもBoNでも、単純に出現回数を用いて数値化すると、テキストの長さが数値化の結果にダイレクトに反映されます。(BoWまたはBoNで得られるベクトルの成分の中に、長いテキストでは大きい値が、短いテキストでは小さい値が出現しやすくなります。)テキストの長さが推定結果に対して大きな意味を持たないようにするために、テキストの長さ(単語数やN-グラム数)で割って正規化することも一般的です。
4-2-2. TF-IDF
BoWは単語の出現回数を元にテキストを数値化する手法でした。その根底には、テキスト中で出現回数の多い単語がそのテキストを特徴づけるという考えがあります。しかし、仮に出現頻度の高い単語であっても、どのテキストにも出現するような単語は、そのテキストを特徴づけるとは考えにくいです。例えば、映画の批評のテキスト群から肯定的な批評と否定的な批評とを選別したい場合を考えます。対象とするテキスト群が全て映画の批評であるならば、「映画」という単語は否定的・肯定的であるに依らず出現しやすいと考えられるため、BoWで考えればこの単語の特徴量の寄与が大きくなることが予想されます。しかし、映画の批評の肯定・否定の判定に対して、「映画」という単語の出現頻度が根拠となるとは考えにくいはずです。
実際に、あるテキストを特徴づける単語というのは、そのテキスト中で出現頻度が大きいことは重要な因子ですが、他のテキストには現れにくい単語であることも必要な条件だと考えられます。この考えを反映した数値化の手法がTF-IDFです。これは、単語$t$が文書中にどれだけ出現するかを表すTF (Term Frequency)と、単語$t$がコーパス(※)内でどれほど希少であるかを表すIDF (Inverse Document Frequency)を乗じたものです。
\mathrm{TF\text{-}IDF}(t,d)=\mathrm{TF}(t,d) \cdot \mathrm{IDF}(t)
\mathrm{TF}(t,d)=\frac{文書dでの単語tの出現回数}{文書dの総単語数}
\mathrm{IDF}(t)=\log\frac{コーパス内の総文書数}{単語tの現れる文書数}
※コーパスとは文書の集合のことで、ここでは単語の経験分布を計算するために集められたコーパスを意味します。
4-2-3. 単語埋め込み
BoWやTF-IDFなどの単語の出現頻度をもとにしたテキストの数値化には、以下のような欠点があります。
-
生成されるベクトルがスパースになる
BoW、TF-IDFともに生成されるベクトルの次元数は語彙数で、そのうちゼロでない値をとるのは、そのテキストで出現する単語に対応する要素のみです。例えば10,000単語の語彙で、あるテキストが1,000個の単語で構成される場合、9,000次元はゼロとなります。 -
単語間の類似性を考慮できない
BoW、TF-IDFともに出現する単語の数だけが反映され、その意味は反映されません。例えば「サッカー」と「野球」は競技名という同じカテゴリに属し、類似性が認められますが、「サッカー」と「python」は何の関係もないと考えられます。しかしBoW、TF-IDFではこの類似性・相違性が全く考慮されません。
これらの欠点は、ここで紹介する単語埋め込みによって解消されます。よく知られている単語埋め込み手法として、Word2Vec (Google), GloVe (Stanford), fastText (Facebook)などが知られていますが、ここではWord2Vecについて紹介します。
Word2Vecは、分布仮説を背景とした単語埋め込み手法です。分布仮説とは、2つの異なる単語が似たような文脈で現れる頻度が高いならば、それらの単語の意味は近いであろう、という仮説です。例として、次の文章(1)-(3)を考えます。
文章(1) 彼は犬を2匹飼っています。
文章(2) 彼は猫を2匹飼っています。
文章(3) 彼は自動車を2匹飼っています。
文章(1)は特に違和感のない文章だと思います。(1)の「犬」を「猫」に置換した文章(2)も自然で、そのような文章が現れる確率は十分あることも想像できます。一方で、「犬」を「自動車」に置換した文章(3)は滅多に登場しないと考えられます。そういう意味で、「犬」と「猫」は意味が近いが、「犬」と「自動車」は意味が遠いと言えます。これが分布仮説の考え方です。
Word2Vecでは、埋め込みベクトルの学習方法として、Continuous Bag of Words (CBOW)とSkip-gramの2種類が提案されています。ここではCBOWについて紹介します。CBOWは、図5のような構造で、中間層が1層のニューラルネットワークを用いて、テキストの文脈からターゲットの単語を予測する推論モデルとして学習されます。ここで文脈とはターゲットの単語の前後$k$個の単語を意味します。入力層の次元$V$はコーパスの語彙数(ユニークな単語数)で、中間層の次元$N$が埋め込みベクトルの次元に対応します。(埋め込みベクトルの次元は事前定義されるパラメータで、50-数百程度の値が選択されることが多いようです。)入力は文脈を構成する単語のone-hotベクトル(単語の番号に該当する次元が1で、その他の次元が0のベクトル)で、$V \times N$次元の行列$W_{\mathrm{in}}$を乗じることで$N$次元の埋め込みベクトルを得ます。文脈を構成する全単語の埋め込みベクトルの和を取ることで$N$次元の文脈ベクトルを算出し、これに$N \times V$次元の行列$W_{\mathrm{out}}$を乗じ、$V$次元の出力が得られます。出力のベクトルにソフトマックス関数を作用させ、ターゲットの単語のクロスエントロピーが最小になるように$W_{\mathrm{in}}$、$W_{\mathrm{out}}$を学習します。ここで得られた2つの行列が単語の埋め込みベクトルに相当します。単語の埋め込みベクトルからテキストの数値表現を得るには、テキストを構成する各単語の埋め込みベクトルの平均を取るなどの方法が考えられます。その他、詳細の説明は割愛しますが、Word2Vecの拡張で文書の数値表現を直接得ることのできるDoc2Vecと呼ばれる方法も知られています。図6に文脈の数を規定するパラメータ$k=2$とした場合のCBOWの学習用データ構築の様子を示しました。
図5: CBOWのモデル構造
図6: CBOWの学習用データセットの構築
「文脈」を入力し、「ターゲット」が出力されるように学習を行う
4-2-4. 文脈情報を加味した埋め込み表現
単語埋め込みによる数値化では、単語の順序情報を排除しているため原理的に文脈の情報を取り入れることができません。カウントベースの方法の中で、n-グラムを利用したBoWは順序情報を取り込むことができますが、得られる表現が疎になってしまうという欠点があります。文脈情報を含む密な埋め込みベクトルを得る方法として、リカレントニューラルネットワークをベースとしたELMoや、トランスフォーマーをベースとしたBERTなどが知られています。特にBERTは自然言語処理にとっては大きなブレイクスルーで、BERTの登場以降、GPT-2/3やT5などのトランスフォーマーベースの自然言語処理モデルがいくつも発表されています。ここではBERTによるテキストの数値表現の概略を説明します。
図7にBERTによる埋め込みベクトル算出の模式図を示しました。BERTには、文をトークン単位に分割した形で投入します。図7最下段のピンクの六角形が、文から分割されたトークンを表しています。(先頭の[CLS]は、文の先頭を表す特殊なトークンです。)各々のトークンは、トークンの種類とその文中での位置で決まる埋め込みベクトル$E_{token}$に変換されたのち、BERTの本体であるニューラルネットワークを通過後、文脈情報を持つ埋め込みベクトル$T_{token}$が得られます。BERTを構成するニューラルネットワーク部分がトランスフォーマーと呼ばれる構造になっていて、注意機構と呼ばれる構造によって前後の文脈情報を取り込みます。BERTはMasked Language Model(MLM)とNext Sentence Prediction(NSP)と呼ばれる事前学習タスクを学習することで文章理解の能力を獲得していて、個別の自然言語タスクに対してファインチューンすることで当時のSoTAを更新しました。BERT以降、事前学習のタスクやモデル構造の改善がなされて、種々のトランスフォーマーモデルが提案されています。ここでは詳細の説明は割愛しますが、興味のある方はBERTなどの論文を参照してください。
4-3. モデリング~精度評価
「特徴抽出」によってテキストを数値データに変換が出来たら、それを用いて解きたい問題に応じた推論モデルの構築と、構築したモデルの精度評価を実施します。この部分は解きたい問題によってアプローチの仕方が大きく変わる部分になりますが、具体的なタスクの例として、文書分類と文書検索システムを取り上げて簡単にご紹介します。
4-3-1. 文書分類
文書分類は、与えられた文書を、事前定義されたカテゴリに分類するタスクです。商品に対する口コミやブログに投稿された文章から、個人の感情を分析するセンチメント分析や、メールに書かれた文章からスパムメールを検出するスパムフィルタなどは、文書分類を用いたアプリケーションの例です。
機械学習を用いた文書分類には、一般的な分類タスクで利用される機械学習モデル(ナイーブベイズ、サポートベクターマシンなど)が適用可能です。正解ラベルを付与した文書群に対して、前節で説明したTF-IDFやWord2Vecなどを適用して文書の数値表現を獲得し、それを説明変数とした教師あり学習によって文書分類器を構築することが可能です。精度評価についても一般的な分類タスクと同様、正解率や再現率・適合率などを用いて実施されます。
一般的なカテゴリに文書を分類する場合には、独自の文書分類モデルを構築する前に、既存のAPIを利用することも有効です。例えばGoogle Cloud Natural Language APIを使えば、学習済のモデルを利用して事前定義されたカテゴリ(スポーツや政治などのカテゴリ)への分類を行うことが可能です。
4-3-2. 情報検索
情報検索システムは、ユーザが入力したクエリに対して、それと関連度の高いコンテンツが順位付けされてユーザに提示されるようなサービスです。情報検索を使った代表的なサービスは、Googleなどのウェブ検索エンジンが有名です。その他、ECサイトの商品や書店の在庫の検索、或いは社内の情報資産を検索するようなエンタープライズ検索が実現できます。
情報検索におけるコンテンツの順位付けには、自然言語処理の技術が活用できます。2019年には、当時のGoogle検索にBERTを導入することで、クエリの微妙なニュアンスを捉えた高精度な検索が可能になりました。入力したクエリと、検索対象となる各コンテンツとの間の関連度の計算には、それぞれのテキストを数値表現してベクトル化したときのコサイン類似度が利用できます。
Elastic社が提供するオープンソースの全文検索エンジンであるElasticsearchを用いれば、手軽に検索アプリケーションの構築が可能です。デフォルトでTF-IDFの発展版ともいえるBM25を使用して文書検索が可能で、カスタマイズしてWord2VecやBERTによる埋め込みベクトルを使用してスコアを算出することも可能です。
5. まとめ
本記事では、自然言語の基礎的な事項を紹介しました。自然言語処理に興味を持つ方のお役に立てば幸いです。
6. 参考文献・リンク
書籍
参考リンク
- ベクトルフィールドを使ったテキスト類似性検索: Elasticsearchを用いて、埋め込みベクトルを用いた検索システムの構築方法を紹介
- Understanding searches better than ever before: Google検索がBERTの導入で高精度化
論文
- Efficient Estimation of Word Representations in Vector Space: 単語の埋め込み表現を得る方法(Word2Vec)
- Global Vectors for Node Representations: 単語の埋め込み表現を得る方法(GloVe)
- Enriching Word Vectors with Subword Information: 単語の埋め込み表現を得る方法(fastText)
- Attention Is All You Need: トランスフォーマーで採用されている注意機構の提案論文
- BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding: BERTの提案論文
- FAQ Retrieval using Query-Question Similarity and BERT-Based Query-Answer Relevance: BERTを用いた検索システムに関する論文