N-gram

テキストを N 文字または N 単語ずつの連続部分列に分割する手法。検索やテキスト類似度の計算に使われる。

N-gram は、テキストを N 個の連続する文字または単語の部分列に分割する手法です。N=1 をユニグラム (unigram)、N=2 をバイグラム (bigram)、N=3 をトライグラム (trigram) と呼びます。たとえば「東京都」を文字バイグラムに分割すると「東京」「京都」の 2 つが得られます。文字単位だけでなく単語単位の N-gram もあり、「I love Tokyo」の単語バイグラムは「I love」「love Tokyo」となります。自然言語処理や情報検索の分野で古くから使われている基礎的な手法であり、現在でも多くのシステムの中核を担っています。

N-gram の最大の利点は、形態素解析や辞書を必要としない点です。日本語や中国語のように単語の区切りが明確でない言語でも、文字列を機械的にスライドするだけでトークンを生成できます。全文検索エンジンの Elasticsearch や Apache Solr では N-gram トークナイザが標準で提供されており、言語を問わない検索インデックスの構築に活用されています。全文検索エンジンの書籍で N-gram インデックスの仕組みを体系的に学べます。

テキスト類似度の計算にも N-gram は広く使われています。2 つのテキストから生成した N-gram 集合の重なり具合を Jaccard 係数やコサイン類似度で比較することで、文書間の類似性を数値化できます。この手法はスペルチェック、あいまい検索、盗用検出、レコメンデーションエンジンなど多様な場面で応用されています。Google の検索サジェスト機能も、入力途中のクエリに対して N-gram ベースの予測を行っている例の一つです。

N-gram は言語モデルの基盤技術としても重要な役割を果たしてきました。N-gram 言語モデルでは、直前の N-1 個の単語から次の単語の出現確率を推定します。深層学習が主流になる以前は、機械翻訳や音声認識の中核技術として広く採用されていました。現在でも、計算コストが低く解釈しやすいという利点から、軽量なテキスト分類やフィルタリングの用途で活用されています。

一方で N-gram にはいくつかの注意点があります。N の値が大きくなるとインデックスサイズが急激に膨張し、ストレージと計算コストが増大します。また「京都」を検索した際に「東京都」がヒットするように、意味的に無関係な部分列がマッチする偽陽性の問題があります。この問題を緩和するために、N-gram と形態素解析を組み合わせたハイブリッド方式を採用するシステムも少なくありません。情報検索アルゴリズムの書籍で N-gram の理論と実装を深く学べます。

文字数カウントの観点では、N-gram の分割結果はテキストの長さに直接依存します。文字数 L のテキストから生成される文字 N-gram の数は L-N+1 個であり、テキストが短いほど生成される N-gram の数も少なくなります。文字数カウントツールで事前にテキスト長を把握しておくことで、N-gram 分析の粒度や精度を見積もる際の参考になります。