はじめに
本記事はOpenSearchのTokenizerによるトークン分割とフレーズ検索の挙動について、直感的に分かるよう例を多く使って説明しています。
Tokenizerによるトークン分割
OpenSearchは文章を保存する際に、Tokenizerによってトークンに分割されてインデックスに保存されます。
Tokenizerは主に「形態素解析」と「N-Gram」の2種類があります。
1. 形態素解析(kuromoji)
形態素解析とは、文章やフレーズを最小の意味単位である形態素に分割することです。
下記の文章をkuromojiという形態素解析器によって単語ごとにトークン分割した場合、4つのトークンに分割されます。
日本一の企業のインターンシップに参加
- 日本一
- 企業
- インターンシップ
- 参加
※ kuromoji_part_of_speechというToken Filterを使って助詞を排除しています。
2. N-Gram
N-Gramとは、文章をN文字ごとに分割することです。
同じく下記の文章をN=2,N=3でトークン分割した場合について示します。
日本一の企業のインターンシップに参加
- N=2の場合
日本、本一、一の、の企、企業、業の、のイ、イン、ンタ、ター、ーン、ンシ、シッ、ップ、プに、に参、参加 - N=3の場合
日本一、本一の、一の企、の企業、企業の、業のイ、のイン、インタ、ンター、ターン、ーンシ、ンシッ、シップ、ップに、プに参、に参加
このように、N-Gramによるトークン分割は無駄が多く保存するデータの容量も増えますが後に説明するように利点もあります。
フレーズ検索
今回はTokenizerに形態素解析を用いて、フレーズ検索の挙動を見てます。
下記の文章に対して、検索を行った場合を考えます。
日本一の企業のインターンシップに参加
先の説明でもあったように、これは下記のトークンに分割されて保存されます。
- 日本一
- 企業
- インターンシップ
- 参加
これに対して、様々なワードで検索をしたときの動作を示します。
OpenSearchでは検索するワードに対してもTokenizerによってトークン分割され、トークンで検索がされます。
検索ワード(検索ワードが分割されたトークン)の形式で一覧にします。
例の文章がヒットする検索ワード
- 日本一(日本一)
- 日本一の企業(日本一、企業)
- 企業のインターンシップに参加(企業、インターンシップ、参加)
- 企業にインターンシップで参加(企業、インターンシップ、参加)
例の文章がヒットしない検索ワード
- 日本(日本)
- インターン(インターン)
- 企業のインターン(企業、インターン)
- 企業の日本一(企業、日本一)
- 日本一のインターンシップ(日本一、インターンシップ)
上記の例のように、フレーズ検索では検索語と同じトークンの順番になっている文章がヒットします。
つまり、「日本一、企業、インターンシップ、参加」の順番に検索語のトークンが並んでいたらヒットします。
「企業にインターンシップで参加(企業、インターンシップ、参加) 」のように、トークンの順番が例の文章と同じなら助詞が異なっていてもヒットします。
逆に、「企業の日本一(企業、日本一)」や「日本一のインターンシップ(日本一、インターンシップ)」のようにトークンの順番が例の文章と異なる場合はトークンが同じでもヒットしません。
また、「日本」や「インターン」で検索しても、「日本一」や「インターンシップ」というトークンとは異なるのでヒットしません。
こういう形態素解析ではうまくいかない場合に、N=2のN-Gramを使っていると「日本」というトークンが作られているので「日本」で検索してもヒットします。
カスタム辞書とシノニム
N-Gramを使うと容量の増加や検索ノイズの増加などデメリットがあるため、「日本」で検索してヒットさせたい場合は代わりにカスタム辞書やシノニムを使って解決した方が良いと思います。
カスタム辞書とシノニムについてはまた別の記事にしたいと思います。