自然言語処理でよく登場する n-gram(エヌグラム)とは、テキストを「連続するn個の単位」に区切り、その出現頻度や確率を扱う手法です。単語や文字の並び方を数値として表せるため、テキストの特徴量化や、検索・分類・生成など幅広いタスクで使われてきました。本記事では、n-gramの定義や特徴、活用分野、関連アルゴリズム、課題と展望を、できるだけ噛み砕いて解説します。
n-gramは、自然言語処理における基本的な考え方の一つです。テキストを連続するn個の要素(文字・単語など)に分割し、その出現傾向を統計的に扱うことで、文章の特徴を扱いやすい形にします。
n-gramの「n」は任意の整数を表し、「gram」は要素(文字や単語など)を意味します。つまり、n-gramとはn個の連続した要素のまとまりです。
ここで大事なのは、n-gramには大きく分けて2種類あることです。
例えば、次の文章があるとします。
「私は自然言語処理に興味があります。」
この文章を文字2-gram(バイグラム)で表現すると、例えば次のようになります(例示のため、連続する2文字を切り出しています)。
一方、単語n-gramで扱う場合は、まず「私/は/自然言語処理/に/興味/が/あります/。」のように単語に区切ったうえで、2語ずつ切り出すイメージになります。
n-gramが使われる主な目的は、次の通りです。
n-gramには、扱いやすさと引き換えに、はっきりした弱点もあります。
基本的な計算の流れは、次のようになります。
以下は、文字2-gramの出現頻度を数えるイメージ例です(文章が短いので、ほとんどが1回になります)。
| 2-gram(例) | 出現頻度 |
|---|---|
| 私は | 1 |
| 自然 | 1 |
| 言語 | 1 |
| 処理 | 1 |
| 興味 | 1 |
| ます | 1 |
n-gramを使うと、文章を「どんな並びが多いか」という統計情報に落とし込めます。これが、テキスト分析を機械学習に載せるときの入口になります。
n-gramは、言語モデルの構築や文章の特徴量化に使われてきました。大量のテキストからn-gramの頻度を学習し、次に出やすい単語(文字)を確率として推定することで、入力補完や誤り訂正などに応用できます。文章分類やクラスタリングでも、n-gramの頻度ベクトルが素直な特徴量として働きます。
検索の世界では、n-gramは「表記ゆれ」や「部分一致」に強い仕組みを作るのに役立ちます。クエリと文書をn-gramに分解し一致度を見れば、単語が完全一致しなくても近い候補を拾えることがあります。単語ベース検索よりも柔軟に動くケースがあるのが利点です。
テキストマイニングでは、頻出フレーズの抽出や、文章の傾向把握でn-gramが使われます。n-gramの頻度を見ると、単語単体では拾いにくい「まとまり(言い回し)」が見えやすいため、トピック把握や特徴分析の足がかりになります。
統計的機械翻訳(SMT)では、n-gram言語モデルが重要部品でした。原言語と目的言語の対応関係を学びつつ、目的言語側のn-gram確率で「自然さ」を評価し、よりそれらしい訳を選ぶ考え方です。現在の主流はニューラル機械翻訳(NMT)ですが、n-gramの発想自体は「確率で言語を扱う」入門として価値があります。
言語モデルとは、文章(単語列)がどのくらい起こりやすいかを確率で表すモデルです。n-gram言語モデルでは、直前n-1個の文脈から次の単語を予測する、という形で近似します。
例えば、単語列 w1, w2, ..., wT の確率は、本来は長い依存関係を含みますが、n-gramでは次のように近似します。
P(w1,...,wT) ≈ ∏ P(wt | wt-n+1, ..., wt-1)
nの値によって、代表的に次の呼び方があります。
nを大きくすると文脈は豊かになりますが、データ不足(スパース性)が一気に重くなるため、バランスが重要です。
n-gram言語モデルは、学習データに出てこない並びを「確率ゼロ」としてしまいがちです。これを避けるのがスムージングです。未知の並びにも少し確率を割り当て、極端なゼロを回避するのが目的です。
代表例として、次のような手法が知られています。
バックオフは、長いn-gramが観測されないときに、より短い文脈(nを小さくしたモデル)へ切り替える考え方です。例えばトライグラムがなければバイグラム、それもなければユニグラム、という具合です。
言語モデルの評価指標として、パープレキシティ(perplexity)がよく使われます。ざっくり言うと、「モデルがどれくらい迷わずに次を予測できるか」の度合いです。小さいほど良い(予測が鋭い)と解釈されます。
テキスト W = w1...wT に対し、次の形で表されます。
PP(W) = P(W)^(-1/T)
異なるnやスムージングの組み合わせを比較するとき、パープレキシティは便利な物差しになります。
n-gramは分かりやすい一方で、限界も明確です。
このため、実用上はスムージング/バックオフ、可変長n-gram、スキップグラムなど、工夫とセットで使われます。
近年は深層学習ベースの言語モデル(RNN/LSTM、さらにTransformer系)が主流です。これらは長距離文脈を扱えるため、n-gramの苦手領域を大きく補えます。
ただし、n-gramが完全に不要になったわけではありません。軽量で実装しやすく、データが少ない場面や、検索・近似マッチングなどの用途では今でも活躍します。「重いモデルを使うほどではない」場面で効く手札として残り続けています。
n-gramの「文脈が短い」という弱点を補うため、トピックや属性情報を組み込む拡張も考えられます。例えば、トピック別にn-gram確率を持つ、感情極性に応じて出やすい言い回しを重み付けする、といった方向です。特定ドメインに寄せた分析では、こうした工夫が役に立つことがあります。
大量データに対してn-gram統計を取る場合は、並列処理・分散処理との相性が良いのも特徴です。ログ分析やソーシャルデータの傾向把握など、集計のスケールがそのまま価値になる用途では、今後も使われ続けるでしょう。
n-gramは、テキストの連続性(並び)に着目し、出現頻度や確率を扱う自然言語処理の基本手法です。言語モデル、類似度計算、情報検索、テキストマイニングなど、幅広い分野で活用されてきました。スパース性や長距離文脈の弱さといった限界はあるものの、スムージングやバックオフ、拡張手法と組み合わせることで実用性は高まります。深層学習が主流になった今でも、軽量で扱いやすい手法として、n-gramは場面を選びながら活躍しています。
n-gramは、テキストを「連続するn個の要素(文字や単語など)」に分割し、その出現頻度や確率を扱う手法です。
文字n-gramは文字の並びを、単語n-gramは単語の並びを扱います。日本語の単語n-gramでは、分かち書きや形態素解析で単語に区切る工程が必要になることが多いです。
一概には言えません。nを大きくすると文脈は増えますが、組み合わせが増えすぎてデータ不足になりやすく(スパース性)、計算量も重くなります。
言語モデル(予測・入力補完)、文章の類似度計算、情報検索、テキスト分類、感情分析など、テキストの特徴量化が必要な場面で広く使われます。
直前n-1個の文脈から次の単語の確率を推定し、文章全体の確率を近似する言語モデルです。ユニグラム、バイグラム、トライグラムなどがあります。
学習データに出てこないn-gramを確率ゼロにしてしまうと、未知文への評価や予測が極端になります。スムージングは未知の並びにも確率を割り当て、ゼロ確率問題を避けるために使います。
長いn-gramが観測されない場合に、より短い文脈(nを小さくしたモデル)の確率へ切り替える手法です。データ不足に対してモデルをロバストにします。
言語モデルの予測の良さを測る代表的な指標です。小さいほど、モデルがテキストを「迷わず」説明できている(予測性能が高い)と解釈されます。
不要ではありません。軽量で実装しやすく、検索・近似マッチング・簡易な特徴量化などでは今でも有効です。重いモデルを使うほどではない場面で強みがあります。
単語n-gramを使う場合、単語の区切り方(形態素解析の結果)でn-gramが変わります。目的に応じて、文字n-gramにするか単語n-gramにするか、前処理の方針を揃えることが重要です。