自然言語処理でよく使われるn-gram(エヌグラム)とは、テキストを連続するn個の単位に区切り、その出現頻度や確率を扱う手法です。文字の並びを扱う文字n-gramと、単語の並びを扱う単語n-gramが代表的です。検索、分類、類似度計算、言語モデル、テキストマイニングなどで使われてきました。
n-gramは仕組みがシンプルで、実装しやすい一方、nを大きくすると組み合わせが増え、データ不足や計算量の問題が出やすくなります。深層学習ベースの言語モデルが主流になった現在でも、軽量な特徴量化、近似検索、表記ゆれへの対応などでは有効な選択肢です。この記事では、n-gramの定義、文字n-gramと単語n-gramの違い、用途、関連する言語モデル、課題を整理します。
n-gramは、自然言語処理でテキストの並びを扱うための基本的な手法です。テキストを連続するn個の要素に分割し、その出現傾向を統計的に扱うことで、文章を機械学習や検索で扱いやすい形にします。
n-gramの「n」は任意の整数を表し、「gram」は文字や単語などの要素を指します。つまり、n-gramとは、連続するn個の要素のまとまりです。
n-gramには、大きく分けて次の2種類があります。
日本語では単語の区切りが空白で示されないため、単語n-gramを使う場合は、分かち書きや形態素解析によって単語単位に分割する工程が必要になりやすくなります。
文字n-gramは、表記ゆれや部分一致に対応しやすく、検索や近似マッチングで扱いやすい傾向があります。たとえば、商品名や人名の表記ゆれ、入力ミスを含む検索などでは、文字単位の一致度を見ることで候補を拾いやすくなります。
単語n-gramは、単語のまとまりを前提に文脈を扱えるため、文章分類や言語モデルで意味のまとまりを捉えたい場合に適しています。ただし、日本語では形態素解析の結果によってn-gramが変わるため、辞書、品詞の扱い、表記正規化の方針を事前にそろえる必要があります。
例えば、次の文章があるとします。
「私は自然言語処理に興味があります。」
この文章を文字2-gram(バイグラム)で表現すると、連続する2文字を次のように切り出せます。
単語n-gramで扱う場合は、まず「私/は/自然言語処理/に/興味/が/あります/。」のように単語へ分割し、そのうえで2語ずつ、または3語ずつ切り出します。
n-gramが使われる主な目的は次の通りです。
n-gramは、文章を「どの文字列や単語列が多く出るか」という統計情報に変換します。そのため、機械学習でテキストを扱う際の特徴量として使いやすい手法です。
n-gramには、扱いやすさと制約の両方があります。
nを大きくすると、より長い文脈を扱えます。一方で、組み合わせが増え、学習データに存在しないn-gramも増えます。結果として、データ不足、メモリ使用量、計算コストの問題が強くなります。
実務では、ユニグラム、バイグラム、トライグラムのような小さめの値から試し、目的に応じて精度とコストを比較します。文字n-gramでは2〜3文字、単語n-gramでは2〜3語を起点にすると、特徴の違いを確認しやすくなります。
基本的な計算の流れは次の通りです。
文字2-gramの出現頻度を数えると、短い例文では次のようになります。
| 私は | 出現頻度:1 |
| 自然 | 出現頻度:1 |
| 言語 | 出現頻度:1 |
| 処理 | 出現頻度:1 |
| 興味 | 出現頻度:1 |
| ます | 出現頻度:1 |
n-gramを使うと、文章を「どの並びがどれだけ出ているか」という数値情報に変換できます。テキスト分析や機械学習で扱うための基礎的な変換方法です。
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-gram言語モデルでは、直前n-1個の文脈から次の単語を予測する形で近似します。
例えば、単語列 w1, w2, ..., wT の確率は、本来は長い依存関係を含みます。n-gramでは、次のように直前n-1語だけを条件にして近似します。
P(w1,...,wT) ≈ ∏ P(wt | wt-n+1, ..., wt-1)
実装では、文頭記号や文末記号を追加するか、未知語をどう扱うか、句読点を含めるかなどを決めて計算します。
nの値によって、代表的に次の呼び方があります。
nを大きくすると、より長い文脈を見られます。一方で、n-gramの種類が急増し、観測されない組み合わせも増えます。そのため、精度、データ量、計算コスト、メモリ使用量のバランスを取る必要があります。
n-gram言語モデルでは、学習データに出てこなかった並びを確率ゼロとして扱ってしまう問題が起こります。この問題を避けるために使うのがスムージングです。未知の並びにも一定の確率を割り当て、ゼロ確率を避けます。
代表的な手法には、次のようなものがあります。
加算スムージングは、考え方を理解するための基本例としてよく使われます。ただし、実用的なn-gram言語モデルでは、グッド・チューリング、カッツ・バックオフ、クニーザー・ネイなどが重視されます。
バックオフは、長いn-gramが観測されないときに、より短い文脈へ切り替える考え方です。例えば、トライグラムが見つからなければバイグラム、それもなければユニグラムを使います。データ不足による極端な推定を避けるための方法です。
言語モデルの評価指標として、パープレキシティ(perplexity)が使われます。パープレキシティは、モデルがテストデータをどの程度うまく予測できるかを表す指標です。一般に、小さいほど予測性能が高いと解釈されます。
テキスト W = w1...wT に対し、次の形で表されます。
PP(W) = P(W)-1/T
異なるnの値やスムージング手法を比較する際、パープレキシティはモデル比較の指標として使えます。ただし、最終的な用途が検索、分類、翻訳などである場合は、実際のタスク性能も合わせて評価する必要があります。
n-gramは分かりやすい一方で、限界も明確です。
このため、実用上はスムージング、バックオフ、可変長n-gram、スキップグラム、他の特徴量との組み合わせが使われます。
近年は、深層学習ベースの言語モデルが主流です。特にTransformer系のモデルや、その上に構築された大規模言語モデルは、長い文脈を扱いやすく、生成、要約、質問応答などで広く使われています。RNNやLSTMは、それ以前に長距離文脈を扱うための重要な発展を支えたアーキテクチャでした。
ただし、n-gramが不要になったわけではありません。軽量で実装しやすく、データが少ない場面や、検索、近似マッチング、簡易な特徴量化、ログ分析などでは今でも利用されます。大規模モデルを使うほどではない場面では、n-gramの方が実装・運用しやすいこともあります。
n-gramは文脈が短いという弱点を持ちます。その弱点を補うため、トピックや属性情報を組み込む拡張も考えられます。例えば、トピック別にn-gram確率を持つ、感情極性に応じて出やすい言い回しを重み付けする、といった方法です。
特定ドメインに合わせた分析では、汎用的なn-gram統計だけでなく、業界用語、製品名、社内用語、文書種別を考慮すると、より目的に合った特徴量を作りやすくなります。
大量データに対してn-gram統計を取る場合は、並列処理や分散処理と組み合わせやすい点が利点です。ログ分析、検索インデックス、ソーシャルデータの傾向把握、重複検出などでは、大量の文字列を集計することで価値が出ます。
一方で、大規模データでは、n-gramの種類が膨大になりやすいため、出現頻度の低いn-gramの除外、対象文字種の正規化、辞書の管理、保存形式の設計が必要になります。
n-gramは、テキストの連続する並びに着目し、出現頻度や確率を扱う自然言語処理の基本手法です。文字n-gramと単語n-gramがあり、言語モデル、類似度計算、情報検索、テキストマイニング、分類などで活用されてきました。
n-gramはシンプルで扱いやすい一方、スパース性、計算量、長距離文脈の弱さという課題があります。深層学習ベースの言語モデルが主流になった現在でも、軽量な検索、近似マッチング、特徴量化、ログ分析では実用性があります。目的、データ量、必要な精度、運用コストを見ながら、nの値や前処理の方針を決めることが重要です。
A.n-gramは、テキストを連続するn個の要素(文字や単語など)に分割し、その出現頻度や確率を扱う手法です。
A.文字n-gramは文字の並びを扱い、単語n-gramは単語の並びを扱います。日本語の単語n-gramでは、形態素解析などで単語に区切る工程が必要になりやすいです。
A.一概にはいえません。nを大きくすると文脈は増えますが、組み合わせが増え、データ不足や計算量の問題が出やすくなります。
A.言語モデル、文章の類似度計算、情報検索、テキスト分類、感情分析、近似マッチングなどで使われます。
A.直前n-1個の文脈から次の単語の確率を推定し、文章全体の確率を近似する言語モデルです。
A.学習データに出てこないn-gramを確率ゼロにすると未知文を扱いにくくなるため、未知の並びにも一定の確率を割り当てるために使います。
A.長いn-gramが観測されない場合に、より短い文脈の確率へ切り替える手法です。データ不足による極端な推定を避けるために使います。
A.言語モデルがテストデータをどの程度うまく予測できるかを表す指標です。一般に、小さいほど予測性能が高いと解釈されます。
A.不要ではありません。軽量で実装しやすく、検索、近似マッチング、簡易な特徴量化、ログ分析などでは今でも有効です。
A.単語n-gramでは、形態素解析の結果によってn-gramが変わります。目的に応じて、文字n-gramと単語n-gramのどちらを使うかを決める必要があります。