初心者でもわかる!N-gramとは?自然言語処理の基本を解説

N-gramってなんだろう?

N-gram(エヌグラム)は、文章やテキストデータを扱うための基本的な手法の一つです。一言でいうと、「文章を、連続するN個の単語や文字のカタマリに分割する」という非常にシンプルな方法です。 「N」は数字(例えば1, 2, 3…)が入り、「gram」は「かたまり」や「単位」を意味します。この技術は、コンピュータが「言葉」を統計的に理解するための第一歩として、自然言語処理(NLP)の様々な場面で利用されています。

この考え方は、情報理論の創始者として知られるクロード・シャノンによって考案された言語モデルが元になっています。

N-gramの仕組み:文章の分割方法

N-gramの仕組みはとても直感的です。「N」に入る数字によって、分割する単位が変わります。ここでは代表的な3つの種類を見てみましょう。

例として、「今日は良い天気です」という文章を分割してみます。


  • 1-gram (uni-gram, ユニグラム): N=1の場合。文章を1単語(または1文字)ずつに区切ります。

    「今日」「は」「良い」「天気」「です」

  • 2-gram (bi-gram, バイグラム): N=2の場合。2単語(または2文字)ずつのペアで区切っていきます。単語のつながり(共起関係)を見ることができます。

    「今日は」「は良い」「良い天気」「天気です」

  • 3-gram (tri-gram, トライグラム): N=3の場合。3単語(または3文字)ずつのグループで区切ります。より長い文脈を捉えられます。

    「今日は良い」「は良い天気」「良い天気です」

このように、Nの値を大きくするほど、より長い単語の並び(文脈)を考慮することができますが、その分、組み合わせの数も爆発的に増えていきます。

Pythonでの簡単な例 (単語bi-gram)

プログラミングでは、ライブラリを使って簡単にN-gramを生成できます。

from nltk.util import ngrams
text = "今日は良い天気です"
# MeCabなどの形態素解析器で単語に分割(わかち書き)したと仮定
words = ["今日", "は", "良い", "天気", "です"]
# 2-gram (bi-gram) を生成する
bigrams = list(ngrams(words, 2))
print(bigrams)
# 出力: [('今日', 'は'), ('は', '良い'), ('良い', '天気'), ('天気', 'です')]

何に使われているの? N-gramの応用例

N-gramは、そのシンプルさから様々な技術の基礎として活用されてきました。

  • 検索エンジン: 検索キーワードをN-gramで分解し、関連性の高い文書を見つけ出します。例えば「東京都」で検索した際に、「東京」と「京都」に分解し、両方が隣接して出現する文書を探します。
  • 入力予測・サジェスト機能: スマートフォンのキーボードで文字を入力すると、次に来る単語の候補が表示されますよね。これは、直前に入力された単語のN-gramを元に、次に出現する確率が高い単語を予測している例です。
  • 機械翻訳: 初期の統計的機械翻訳システムで、ある言語の単語の並びが、別の言語でどのよう並びに翻訳されるかを学習するために使われていました。
  • スペル訂正・文章校正: 出現する確率が極端に低いN-gramが見つかった場合、それはタイプミスや文法的な誤りである可能性があります。
  • 感情分析: ポジティブな単語やネガティブな単語の組み合わせ(N-gram)を分析し、文章全体の感情を判定します。

【応用編】自然言語処理以外のN-gram

N-gramの考え方は、テキストデータだけに留まりません。「連続する要素の並び」を分析できるため、他の分野でも応用されています。

  • バイオインフォマティクス (生命情報科学): DNAの塩基配列(A, T, G, C)を文字の並びとみなし、N-gramで解析することで、特定の遺伝子の機能領域を予測する研究などに利用されます。
  • 音楽情報処理: メロディーを音符の並びと捉え、N-gramで分析することで、自動作曲や音楽のジャンル分類などに応用されることがあります。

N-gramのメリットとデメリット

N-gramは非常に強力な手法ですが、万能ではありません。メリットとデメリットを理解しておくことが重要です。

項目説明
メリット
  • シンプルで実装が容易: 仕組みが単純なため、理解しやすく、プログラムに組み込むのが比較的簡単です。
  • 言語に依存しない: 単語や文字を機械的に区切るだけなので、特定の言語の文法知識が不要で、多言語に適用しやすいです。
  • 検索漏れが少ない: 全ての文字列の組み合わせを網羅的に見るため、検索などで目的の情報を見つけやすいです。
デメリット
  • データのスパースネス(疎性)問題: Nの値を大きくすると、組み合わせの数が膨大になります。その結果、学習データ(コーパス)には一度も出現しないN-gramが多数発生し、それらの出現確率が0になってしまう問題があります。
  • 長期的な依存関係の欠如: N-gramは直前のN-1個の単語しか考慮しません。そのため、「今日は晴れていたが、遠くの山には暗い雲がかかっていたので、を持っていった」のような、離れた場所にある単語同士の関連性を捉えることができません。
  • ノイズの多さ: 機械的に分割するため、「東京都」が「東京」と「京都」に分かれるように、意味のない単語の組み合わせがノイズとして生成されることがあります。

まとめ

N-gramは、文章を連続する単語や文字のカタマリに分割して分析する、シンプルかつ強力な手法です。その分かりやすさから、検索エンジンや入力予測など、私たちの身の回りの多くの技術の基礎として利用されてきました。

データのスパースネス問題や長期的な文脈を捉えられないといった課題もありますが、N-gramは自然言語処理の世界を理解するための重要な第一歩です。現在主流となっているTransformerなどのより高度なモデルも、N-gramのような基礎的な技術の考え方の上に成り立っています。まずはこのN-gramから、言葉を扱うAI技術の世界に触れてみてはいかがでしょうか。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です