この記事は、書籍『Kaggleではじめる大規模言語モデル入門』の輪読会で学んだテーマを、自分の言葉で整理・深掘りしたものです。
はじめに
自然言語処理(NLP: Natural Language Processing)の入門記事は世の中にたくさんありますが、「結局なぜテキストの処理は画像や数値データより厄介なのか」を納得するには、 「テキストをどうやって数値に変換するか」という一本の軸 で眺めるのが近道だと感じます。
この記事では、その軸に沿って以下を整理します。
- NLPとは何か、何がコアの問題なのか
- テキストが持つ「粒度」の階層(文章・文・単語・文字)
- 英語と日本語で前処理の事情がどう違うか
- NLPが難しい3つの理由
対象読者は、機械学習の基礎はなんとなく知っているが、NLP は初めてという方を想定しています。
自然言語処理とは
自然言語処理は、人間が日常的に使う言葉(自然言語)をコンピュータに処理させる技術の総称です。身近な応用だけでも、
- 機械翻訳(DeepL、Google翻訳)
- 感情分析(SNS 投稿がポジティブかネガティブか)
- スパムフィルタ(迷惑メールの自動判定)
- 要約、質問応答、チャットボット
など、すでに生活のあらゆる場面に入り込んでいます。
ChatGPT をはじめとする大規模言語モデル(LLM)も、この NLP という分野の延長線上にあります。
コアの問題は「テキストの数値化」
機械学習モデルも、統計的な分析手法も、可視化も、その多くは 数値データを入力とする前提 で設計されています。線形回帰は特徴量ベクトルを受け取りますし、ニューラルネットワークの入力も結局は数値のテンソルです。
ところがテキストは文字列であり、そのままではこれらの手法に投入できません。
"この映画は面白かった" という文字列に係数を掛けることはできないのです。
したがって NLP の分析は、ほぼ必ず次の形をとります。
テキスト → 【何らかの方法で数値ベクトルに変換】 → 機械学習・統計処理 → 結果
この「何らかの方法」こそが NLP の歴史そのものです。
単語の出現回数を数える Bag-of-Words から、TF-IDF、word2vec、そして Transformer の埋め込み表現まで、 数値化の方法が進化してきた歴史 として NLP を眺めると、各手法の位置づけが非常にクリアになります(この進化の流れはシリーズ第4回で詳しく扱います)。
LLM 時代でも本質は変わらない
ChatGPT のような LLM は「テキストを入れるとテキストが返ってくる」ため、数値化を意識する場面は減りました。しかし内部では、
- 入力テキストをトークンに分割し、トークン ID(整数)の列に変換する
- 各トークン ID を埋め込みベクトル(数値ベクトル)に変換する
- ニューラルネットワークで次のトークンの確率分布を計算する
- 確率の高いトークンを選んでテキストとして出力する
という処理が行われており、 「テキスト → 数値 → テキスト」の変換は今も中心にあります 。
LLM のトークナイザや埋め込みを理解するうえでも、古典的な数値化手法の知識は無駄になりません。
テキストの「粒度」を意識する
テキストデータには階層構造があります。上から順に、
| 粒度 | 説明 | 例 |
|---|---|---|
| 文章(文書) | 複数の文の集まり | ニュース記事1本、レビュー1件 |
| 文 | 単語の並び。句点などで区切られる | 「今日は雨が降っている。」 |
| 単語 | 意味のまとまりの単位 | 「今日」「雨」「降る」 |
| 文字 | テキストの最小単位 | 「今」「日」「は」 |
どの粒度を処理単位にするかはタスクによって変わります。
文書分類なら文章単位、固有表現抽出なら単語単位、といった具合です。
同じ「分類」というタスクでも、粒度が変わると前処理もモデル設計も変わるため、 「いま自分はどの粒度を扱っているのか」を常に意識する のが NLP の第一歩です。
言語によって事情が大きく違う
粒度の話は、言語が変わるとさらに複雑になります。英語と日本語を比べてみます。
英語の特徴
- 文字(アルファベット)単体には意味がなく、組み合わせて初めて意味を持つ
- 単語がスペースで区切られている ため、単語分割は比較的容易
- 語源(接頭辞・接尾辞)の組み合わせで意味が構成される。たとえば
unbelievableはun(否定)+believe(信じる)+able(可能)に分解できる
日本語の特徴
- ひらがな・カタカナ・漢字・アルファベット・記号が混在する
- 同じ対象に対する表記が多様(例:「サーバ / サーバー / server」「引っ越し / 引越し / 引越」)
- 漢字は1文字でも意味を持つ(表意文字)が、ひらがな・カタカナ単体の意味は薄い
- 単語間にスペースがない ため、単語分割(分かち書き)自体が1つの技術課題になる
日本語の分かち書きには形態素解析器(MeCab、Sudachi、Janome など)を使います。
from janome.tokenizer import Tokenizer
t = Tokenizer(wakati=True)
print(list(t.tokenize("機械学習で文章を分類する")))
# ['機械', '学習', 'で', '文章', 'を', '分類', 'する']
英語圏で生まれた手法をそのまま日本語に適用できないことが多いのは、この「そもそも単語の境界が自明でない」という事情によるところが大きいです。
NLPが難しい3つの理由
ここまでの内容を踏まえると、NLP の難しさは次の3点に整理できます。
1. 粒度の多様性
タスクごとに文章・文・単語・文字を扱い分ける必要があります。
処理単位の選択そのものが設計判断になります。
2. 言語依存性
言語ごとに文字体系・単語境界・表記ゆれの事情が異なり、言語に合わせた前処理が必要です。
これは画像データにはない課題です。
画像は「ピクセル値の格子」という共通形式に世界中どこでも収まりますが、テキストは言語の数だけ前処理の流儀があります。
3. 曖昧さ・文脈依存性
これが最も本質的な難しさです。同じ表記でも文脈によって意味が変わります。
- 「はしを渡る」「はしで食べる」──「はし」は橋か箸か、文脈がないと決まらない
- 英語の
bankは「銀行」とも「土手」とも解釈できる - 「その服、やばいね」──賞賛か批判かは状況次第
人間は前後の文脈から無意識に正しい意味を選んでいますが、機械にこれをやらせるのは容易ではありません。
単語を文脈と無関係に固定のベクトルへ変換する古典的手法(word2vec など)はこの多義性を原理的に扱えず、 文脈に応じて表現を変える Transformer 系のモデル(BERT 以降)が登場してようやく大きく前進した、という流れがあります。
まとめ
- NLP のコアの問題は「テキストをどう数値に変換するか」。LLM 時代でもこの本質は変わらない
- テキストには文章・文・単語・文字という粒度があり、タスクに応じて扱い分ける
- 言語ごとに前処理の事情が大きく異なる。日本語では分かち書きが必要
- 最も本質的な難しさは曖昧さ・文脈依存性であり、これが後の文脈化埋め込み(BERT 以降)への発展動機になった
次回は、NLP の主要タスクのうち「分類」と、その評価指標(交差エントロピー・AUC・F1)を整理します。
参考
シリーズの他の記事