ステミング
ステミングは、単語をその根本的な形に減少させるプロセスです。これにより、検索中に単語のバリエーションが一致します。
例えば、walking
とwalked
は同じ根本的な単語にステミングされることができます: walk
。一度ステミングされると、どちらの単語の出現も検索中に他の単語と一致します。
ステミングは言語に依存しますが、通常は単語から接頭辞や接尾辞を取り除くことを含みます。
場合によっては、ステミングされた単語の根本的な形が実際の単語でないことがあります。例えば、jumping
とjumpiness
は両方ともjumpi
にステミングされることができます。jumpi
は実際の英単語ではありませんが、検索には関係ありません。単語のすべてのバリエーションが同じ根本的な形に減少されれば、正しく一致します。
ステムトークンフィルター
Elasticsearchでは、ステミングはステム トークンフィルターによって処理されます。これらのトークンフィルターは、単語をステミングする方法に基づいて分類できます:
- アルゴリズムステマー、これは一連のルールに基づいて単語をステミングします
- 辞書ステマー、これは辞書で単語を調べてステミングします
ステミングはトークンを変更するため、インデックスと検索分析中に同じステムトークンフィルターを使用することをお勧めします。
アルゴリズムステマー
アルゴリズムステマーは、各単語に一連のルールを適用してそれを根本的な形に減少させます。例えば、英語のアルゴリズムステマーは、複数形の単語の末尾から-s
と-es
の接尾辞を取り除くことがあります。
アルゴリズムステマーにはいくつかの利点があります:
- 設定がほとんど必要なく、通常はすぐに機能します。
- メモリをほとんど使用しません。
- 通常、辞書ステマーよりも速いです。
しかし、ほとんどのアルゴリズムステマーは単語の既存のテキストのみを変更します。これは、根本的な形を含まない不規則な単語にはうまく機能しない可能性があることを意味します。例えば:
be
、are
、am
mouse
とmice
foot
とfeet
以下のトークンフィルターはアルゴリズムステミングを使用します:
stemmer
、これはいくつかの言語に対してアルゴリズムステミングを提供し、一部には追加のバリエーションがあります。kstem
、これはアルゴリズムステミングと組み合わせた英語用のステマーです。porter_stem
、これは英語用の推奨アルゴリズムステマーです。snowball
、これはいくつかの言語に対してSnowballに基づくステミングルールを使用します。
辞書ステマー
辞書ステマーは、提供された辞書で単語を調べ、未ステミングの単語のバリエーションを辞書からのステミングされた単語に置き換えます。
理論的には、辞書ステマーは以下に適しています:
- 不規則な単語のステミング
- 概念的に関連しないが、似たように綴られた単語を区別すること、例えば:
organ
とorganization
broker
とbroken
実際には、アルゴリズムステマーは通常、辞書ステマーよりも優れています。これは、辞書ステマーには以下の欠点があるためです:
- 辞書の質
辞書ステマーは、その辞書の質に依存します。うまく機能するためには、これらの辞書にはかなりの数の単語が含まれ、定期的に更新され、言語のトレンドに応じて変化する必要があります。しばしば、辞書が利用可能になる頃には、すでに不完全であり、そのエントリのいくつかはすでに古くなっています。 - サイズとパフォーマンス
辞書ステマーは、辞書からすべての単語、接頭辞、接尾辞をメモリに読み込む必要があります。これにより、かなりの量のRAMを使用する可能性があります。低品質の辞書は、接頭辞や接尾辞の削除においても効率が悪く、ステミングプロセスを大幅に遅くする可能性があります。
辞書ステミングを実行するには、hunspell
トークンフィルターを使用できます。
利用可能な場合は、hunspell
トークンフィルターを使用する前に、あなたの言語に対してアルゴリズムステマーを試すことをお勧めします。
ステミングの制御
時には、ステミングが概念的に関連しないが、似たように綴られた共有の根本的な単語を生成することがあります。例えば、ステマーはskies
とskiing
の両方を同じ根本的な単語に減少させることがあります: ski
。
これを防ぎ、ステミングをより良く制御するために、次のトークンフィルターを使用できます:
stemmer_override
、これは特定のトークンのステミングルールを定義することを可能にします。keyword_marker
、これは指定されたトークンをキーワードとしてマークします。キーワードトークンは、その後のステマーのトークンフィルターによってステミングされません。conditional
、これはkeyword_marker
フィルターと同様にトークンをキーワードとしてマークするために使用できます。
組み込みの言語分析器に対しては、stem_exclusion
パラメータを使用して、ステミングされない単語のリストを指定することもできます。