ユースケースに適した分析装置の選択
このガイドでは、アナライザを選択する際の実践的な意思決定に重点を置いています。アナライザーのコンポーネントやアナライザーパラメーターの追加方法に関する技術的な詳細については、アナライザーの概要を参照してください。
2分でわかる分析装置
Milvusでは、アナライザーはこのフィールドに格納されたテキストを処理し、全文検索(BM25)、フレーズ一致、テキスト一致などの機能で検索できるようにします。生のコンテンツを検索可能なトークンに変換するテキストプロセッサとお考えください。
アナライザーは、シンプルな2段階のパイプラインで動作します:
アナライザーのワークフロー
トークン化(必須): トークン化(必須):この最初の段階では、トークン化ツールを使用して、連続したテキスト文字列をトークンと呼ばれる意味のある個別の単位に分割します。トークン化の方法は、言語やコンテンツの種類によって大きく異なります。
トークンのフィルタリング(オプション):トークン化の後、フィルタを適用してトークンを変更、削除、洗練します。この処理には、すべてのトークンを小文字に変換する処理、一般的な無意味な単語 (ストップワードなど) を削除する処理、単語を語源の形に減らす処理 (ステミング) などがあります。
例
Input: "Hello World!"
1. Tokenization → ["Hello", "World", "!"]
2. Lowercase & Punctuation Filtering → ["hello", "world"]
解析器の選択が重要な理由
解析器の選択を誤ると、関連文書が検索不能になったり、無関係な結果が返されたりすることがあります。
次の表は、不適切なアナライザーの選択によって発生する一般的な問題をまとめたもので、検索に関する問題を診断するための実用的な解決策を提供しています。
問題点 |
症状 |
例(入力と出力) |
原因 (不適切なアナライザー) |
解決策(良いアナライザー) |
|---|---|---|---|---|
過剰なトークン化 |
専門用語、識別子、URLのテキストクエリで関連文書が見つからない。 |
|
|
トークン |
トークン不足 |
複数単語のフレーズの構成要素を検索しても、完全なフレーズを含む文書を返すことができない。 |
|
アナライザと |
句読点やスペースを |
言語のミスマッチ |
特定の言語の検索結果が無意味または存在しない。 |
中国語テキスト: |
|
以下のような、言語固有のアナライザーを使用してください。 |
最初の質問解析器を選ぶ必要がありますか?
多くの場合、特別なことをする必要はありません。あなたがその一人であるかどうかを判断してみましょう。
デフォルトの動作:standard アナライザー
全文検索のようなテキスト検索機能を使用する際にアナライザーを指定しない場合、Milvusは自動的に standardアナライザを使用します。
standard :
スペースと句読点でテキストを分割
すべてのトークンを小文字に変換します。
一般的な英語のストップワードとほとんどの句読点を除去します。
変換の例:
Input: "The Milvus vector database is built for scale!"
Output: ['the', 'milvus', 'vector', 'database', 'is', 'built', 'scale']
判定基準:クイックチェック
この表を使って、デフォルトのstandard アナライザーがあなたのニーズを満たすかどうかをすばやく判断してください。適合しない場合は、別のパスを選択する必要があります。
コンテンツ |
標準アナライザーでOK? |
なぜ |
必要なもの |
|---|---|---|---|
英語のブログ記事 |
はい |
デフォルトの動作で十分。 |
デフォルトを使う(設定不要)。 |
中国語の文書 |
いいえ |
中国語の単語にはスペースがなく、1つのトークンとして扱われます。 |
組み込みの |
技術文書 |
いいえ |
|
トークナイザーと |
フランス語/スペイン語テキストなど、スペースで区切られた言語 |
⚠️ たぶん |
アクセント記号付き文字 ( |
を使ったカスタム解析器を使うことをお勧めします。 |
多言語または未知の言語 |
いいえ |
|
カスタム解析器と あるいは、多言語コンテンツをより正確に処理するために、多言語アナライザまたは言語識別子を設定することを検討してください。 |
デフォルトのstandard アナライザーが要件を満たせない場合は、別のアナライザーを実装する必要があります。2つの方法があります:
パスA:組み込みアナライザーを使用する
ビルトイン解析器は、一般的な言語用にあらかじめ設定されたソリューションです。デフォルトの標準アナライザーが完璧にフィットしない場合に、最も簡単に使い始めることができます。
利用可能なビルトイン・アナライザー
アナライザー |
対応言語 |
コンポーネント |
備考 |
|---|---|---|---|
スペースで区切られたほとんどの言語(英語、フランス語、ドイツ語、スペイン語など) |
|
初期テキスト処理用の汎用解析器。モノリンガルのシナリオでは、言語固有のアナライザ ( |
|
英語専用。英語のセマンティックマッチングを向上させるため、ステミングとストップワード除去を適用。 |
|
|
|
中国語 |
|
現在、デフォルトで簡体字中国語辞書を使用。 |
実装例
組み込みの解析器を使用するには、フィールド・スキーマを定義する際にanalyzer_params でそのタイプを指定するだけです。
# Using built-in English analyzer
analyzer_params = {
"type": "english"
}
# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=200,
enable_analyzer=True,
analyzer_params=analyzer_params,
)
パスB:カスタム・アナライザーを作成する
組み込みのオプションではニーズに合わない場合は、トークナイザーとフィルター・セットを組み合わせてカスタム・アナライザーを作成することができます。これにより、テキスト処理パイプラインを完全に制御できるようになります。
ステップ 1: 言語に基づくトークナイザーの選択
コンテンツの主要言語に基づいてトークナイザを選択します:
欧米言語
スペースで区切られた言語の場合、以下のオプションがあります:
トークナイザー |
機能 |
最適 |
例 |
|---|---|---|---|
スペースと句読点に基づいてテキストを分割する |
一般的なテキスト、句読点の混在 |
|
|
空白文字のみで分割 |
事前処理されたコンテンツ、ユーザーフォーマットされたテキスト |
|
東アジア言語
辞書ベースの言語では、適切な単語分割のために専用のトークナイザーが必要です:
中国語
トーケナイザー |
仕組み |
最適 |
例 |
|---|---|---|---|
インテリジェントアルゴリズムによる中国語辞書ベースのセグメンテーション |
中国語コンテンツに推奨- 中国語用に特別に設計されたインテリジェントアルゴリズムと辞書の組み合わせ |
|
|
中国語辞書を用いた純粋な辞書ベースの形態素解析(cc-cedict) |
|
|
日本語と韓国語
言語 |
トーケナイザー |
辞書オプション |
最適 |
例 |
|---|---|---|---|---|
日本語 |
ipadic(汎用),ipadic-neologd(現代用語),unidic(学術) |
固有名詞を扱う形態素解析 |
|
|
韓国語 |
韓国語の形態素解析 |
|
多言語または未知の言語
文書内で言語が予測できない、または混在しているコンテンツ向け:
トーケナイザー |
仕組み |
対象 |
例 |
|---|---|---|---|
Unicodeを意識したトークン化(International Components for Unicode) |
混合スクリプト、未知の言語、または単純なトークン化で十分な場合 |
|
icuを使用する場合:
言語識別が現実的でない混合言語。
コンテンツに主要言語があり、時折、全体的な意味にはほとんど寄与しない外国語が含まれる場合(例えば、日本語やフランス語のブランド名や専門用語が散見される英語のテキスト)。
別のアプローチ:多言語コンテンツをより正確に扱うには、多言語アナライザまたは言語識別子の使用を検討してください。詳細については、多言語アナライザまたは言語識別子を参照してください。
ステップ 2: 精度を高めるフィルタの追加
使用するトークナイザを選択したら、検索要件とコンテンツの特性に基づいてフィルタを適用します。
よく使用されるフィルター
これらのフィルタは、スペースで区切られたほとんどの言語設定(英語、フランス語、ドイツ語、スペイン語など)に不可欠であり、検索品質を大幅に向上させます:
フィルター |
使用方法 |
使用時期 |
使用例 |
|---|---|---|---|
すべてのトークンを小文字に変換 |
ユニバーサル - 大文字小文字の区別があるすべての言語に適用されます。 |
|
|
単語を原形に戻す |
単語の屈折がある言語(英語、フランス語、ドイツ語など) |
英語の場合
|
|
一般的な無意味な単語を取り除く |
ほとんどの言語 - 特にスペースで区切られた言語に効果的 |
|
東アジアの言語 (中国語、日本語、韓国語など) の場合は、代わりに言語固有のフィルターに注目します。これらの言語では通常、テキスト処理に異なるアプローチが使用されるため、ステミングの効果が大 きく得られない場合があります。
テキスト正規化フィルター
これらのフィルタは、テキストのバリエーションを標準化して、マッチングの一貫性を向上させます:
フィルター |
機能 |
使用時期 |
例 |
|---|---|---|---|
アクセント記号付き文字をASCII等価文字に変換する |
国際的なコンテンツ、ユーザーが作成したコンテンツ |
|
トークンのフィルタリング
文字の内容や長さに基づいて、保存するトークンを制御します:
フィルター |
どのように機能するか |
いつ使うか |
使用例 |
|---|---|---|---|
単体の句読点トークンを削除する |
|
|
|
文字と数字だけを残す |
技術コンテンツ、クリーンなテキスト処理 |
|
|
指定された長さの範囲外のトークンを除去 |
ノイズ(過度に長いトークン)の除去 |
|
|
カスタムパターンベースのフィルタリング |
ドメイン固有のトークン要件 |
|
言語固有のフィルタ
これらのフィルタは特定の言語特性を扱います:
フィルタ |
言語 |
仕組み |
例 |
|---|---|---|---|
ドイツ語 |
複合語を検索可能な要素に分割する |
|
|
中国語 |
漢字+英数字を保持 |
|
|
中国語 |
漢字のみを保持 |
|
ステップ3:結合と実装
カスタム分析器を作成するには、analyzer_params 辞書でトークナイザーとフィルターのリストを定義します。フィルターはリストされた順に適用されます。
# Example: A custom analyzer for technical content
analyzer_params = {
"tokenizer": "whitespace",
"filter": ["lowercase", "alphanumonly"]
}
# Applying analyzer config to target VARCHAR field in your collection schema
schema.add_field(
field_name='text',
datatype=DataType.VARCHAR,
max_length=200,
enable_analyzer=True,
analyzer_params=analyzer_params,
)
最後にでテストします。run_analyzer
コレクションに適用する前に、必ず設定を検証してください:
# Sample text to analyze
sample_text = "The Milvus vector database is built for scale!"
# Run analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Analyzer output:", result)
チェックすべき一般的な問題
過剰なトークン化:専門用語の間違った分割
トークン不足:フレーズが正しく分割されていない
トークンの欠落:重要な用語が除外される
詳細な使用方法については、run_analyzerを参照してください。
ユースケース別の推奨設定
このセクションでは、Milvusでアナライザーを使用する際の一般的なユースケース別に、推奨されるトークナイザーとフィルターの設定をご紹介します。コンテンツの種類と検索要件に最適な組み合わせを選択してください。
アナライザをコレクションに適用する前に run_analyzerを使用して、テキスト分析のパフォーマンスをテストおよび検証することをお勧めします。
アクセント記号のある言語(フランス語、スペイン語、ドイツ語など)
小文字変換、言語固有のステミング、ストップワード除去を備えたstandard トー クナイザを使用します。この構成は、language およびstop_words パラメータを変更することで、他のヨーロッパ言語でも機能します。
# French example
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
"asciifolding", # Handle accent marks
{
"type": "stemmer",
"language": "french"
},
{
"type": "stop",
"stop_words": ["_french_"]
}
]
}
# For other languages, modify the language parameter:
# "language": "spanish" for Spanish
# "language": "german" for German
# "stop_words": ["_spanish_"] or ["_german_"] accordingly
英語コンテンツ
包括的なフィルタリングを伴う英語テキスト処理用。内蔵の englishアナライザーも使用できます:
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "english"
},
{
"type": "stop",
"stop_words": ["_english_"]
}
]
}
# Equivalent built-in shortcut:
analyzer_params = {
"type": "english"
}
中国語コンテンツ
jieba トークナイザを使用し、文字フィルタを適用して、中国語文字、ラテン文字、数字のみを保持します。
analyzer_params = {
"tokenizer": "jieba",
"filter": ["cnalphanumonly"]
}
# Equivalent built-in shortcut:
analyzer_params = {
"type": "chinese"
}
簡体字中国語の場合、cnalphanumonly は、漢字、英数字、数字以外のすべてのトークンを削除します。これにより、句読点が検索品質に影響するのを防ぐことができます。
日本語コンテンツ
lindera のトークナイザーと日本語辞書およびフィルタを使用して、句読点を除去し、トークンの長さを制御します:
analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict": "ipadic" # Options: ipadic, ipadic-neologd, unidic
},
"filter": [
"removepunct", # Remove standalone punctuation
{
"type": "length",
"min": 1,
"max": 20
}
]
}
韓国語コンテンツ
日本語と同様に、lindera トークナイザーと韓国語辞書を使用します:
analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict": "ko-dic"
},
"filter": [
"removepunct",
{
"type": "length",
"min": 1,
"max": 20
}
]
}
混合または多言語コンテンツ
複数の言語にまたがるコンテンツや、予測不可能なスクリプトを使用するコンテンツを扱う場合は、icu アナライザから始めましょう。この Unicode 対応アナライザは、混在するスクリプトや記号を効果的に処理します。
基本的な多言語設定 (ステミングなし):
analyzer_params = {
"tokenizer": "icu",
"filter": ["lowercase", "asciifolding"]
}
高度な多言語処理:
高度な多言語処理: 異なる言語間でのトークンの動作をより適切に制御します:
テキスト検索機能との統合
アナライザーを選択した後、Milvusが提供するテキスト検索機能と統合することができます。
全文検索
アナライザはスパースベクトル生成を通じてBM25ベースの全文検索に直接影響を与えます。一貫したトークン化を保証するために、インデックス作成とクエリの両方に同じアナライザを使用してください。言語固有のアナライザは、一般的に、汎用的なアナライザよりも優れた BM25 スコアリングを提供します。実装の詳細については、全文検索を参照してください。
テキストマッチ
テキストマッチ操作は、アナライザーの出力に基づき、クエリーとインデックスされたコンテンツの間で正確なトークンマッチングを行います。実装の詳細については、テキストマッチを参照してください。
フレーズ一致
フレーズ一致では、フレーズの境界と意味を維持するために、複数単語の表現間で一貫したトークン化が必要です。実装の詳細については、「フレーズ・マッチ」を参照してください。