逆コンパウンダー

decompounder フィルタは、指定された辞書に基づいて複合語を個々の要素に分割し、複合語の一部の検索を容 易にする。このフィルタは、ドイツ語など、複合語を頻繁に使用する言語で特に役立ちます。コンポーネント辞書は、word_list パラメータでインラインで指定するか、word_list_file パラメータで登録されたファイルリソースから読み込むことができます。

構成

decompounder フィルタは、word_list パラメータによってインラインで、またはword_list_file パラメータによって登録されたファイルリソースから成分辞書を受け取ります。

インライン単語リスト

decompounder フィルタは Milvus のカスタムフィルタです。このフィルタを使用するには、"type": "decompounder" と、認識する単語コンポーネントの辞書を提供するword_list パラメータをフィルタ設定に指定します。

analyzer_params = {
    "tokenizer": "standard",
    "filter":[{
        "type": "decompounder", # Specifies the filter type as decompounder
        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],
    }],
}
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "standard");
analyzerParams.put("filter",
        Collections.singletonList(
                new HashMap<String, Object>() {{
                    put("type", "decompounder");
                    put("word_list", Arrays.asList("dampf", "schiff", "fahrt", "brot", "backen", "automat"));
                }}
        )
);
const analyzer_params = {
    "tokenizer": "standard",
    "filter":[{
        "type": "decompounder", // Specifies the filter type as decompounder
        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],
    }],
};
analyzerParams = map[string]any{"tokenizer": "standard",
    "filter": []any{map[string]any{
        "type":       "decompounder",
        "word_list": []string{"dampf", "schiff", "fahrt", "brot", "backen", "automat"},
    }}}
# restful
analyzerParams='{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "decompounder",
      "word_list": [
        "dampf",
        "schiff",
        "fahrt",
        "brot",
        "backen",
        "automat"
      ]
    }
  ]
}'

decompounder フィルタは以下の設定可能なパラメータを受け付けます。

パラメータ

説明

word_list

複合語の分割に使用される単語コンポーネントのリスト。この辞書によって、複合語が個々の語にどのように分解されるかが決まります。

decompounder フィルタは、トークナイザによって生成された用語で動作するため、トークナイザと組み合わせて使用する 必要があります。Milvusで利用可能なトークナイザーのリストについては、Standard Tokenizerとその兄弟ページを参照してください。

analyzer_params を定義した後、コレクションスキーマを定義する際にVARCHAR フィールドに適用することができます。これにより、Milvusは指定された解析器を使用してそのフィールドのテキストを処理し、効率的なトークン化とフィルタリングを行うことができます。詳細については、使用例を参照してください。

ファイルリソースからの単語コンポーネントのロードCompatible with Milvus 3.0.x

大規模なコンポーネント辞書(特に全言語単語リスト)の場合、コンポーネントをファイルに保存し、そのファイルをリモートファイルリソースとして登録し、word_list_file パラメータを介してフィルタから参照します。word_list_file を単独で使うことも、インラインのword_list と一緒に使うこともできます。両方が設定されている場合、フィルタは2つのソースを1つのコンポーネントリストに統合します。

ファイルはプレーンなUTF-8テキストで、1行に1つのコンポーネントの単語があります。例えば

dampf
schiff
fahrt
brot
backen
automat

ファイルをMilvusクラスタが使用するように設定されているオブジェクトストアにアップロードし、登録します:

from pymilvus import MilvusClient

client = MilvusClient(uri="http://localhost:19530")

# Register the uploaded file under a name you'll reference from analyzer configs.
client.add_file_resource(
    name="de_components",
    path="file/decompounder.txt",    # full S3 object key, including the rootPath prefix
)

登録されたリソースをフィルタ内でword_list_file を介して参照します:

analyzer_params = {
    "tokenizer": "standard",
    "filter": [{
        "type": "decompounder",
        "word_list_file": {
            "type": "remote",
            "resource_name": "de_components",
            "file_name": "decompounder.txt",
        },
    }],
}

word_list_file パラメータは以下のフィールドを持つオブジェクトを受け付けます:

フィールド

フィールド

type

リソースタイプ。add_file_resource 経由で登録されたファイルには"remote" を使用します。セルフホスト配備で使用される"local" バリアントについては、「ファイルリソースの管理」を参照してください。

resource_name

ファイルがadd_file_resource で登録されたときに使用された名前。

file_name

登録 さ れてい る リ ソ ース のオブジ ェ ク ト ・ ス ト ア ・ パ ス の フ ァ イ ル名部分 (た と えば、 リ ソ ース がpath="file/decompounder.txt" で登録 さ れてい る 場合は"decompounder.txt" )。

アナライザ構成をコレクション・スキーマに適用する前に、run_analyzer メソッドを使用して動作を確認します。

アナライザ構成

analyzer_params = {
    "tokenizer": "standard",
    "filter":[{
        "type": "decompounder", # Specifies the filter type as decompounder
        "word_list": ["dampf", "schiff", "fahrt", "brot", "backen", "automat"],
    }],
}
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "standard");
analyzerParams.put("filter",
        Collections.singletonList(
                new HashMap<String, Object>() {{
                    put("type", "decompounder");
                    put("word_list", Arrays.asList("dampf", "schiff", "fahrt", "brot", "backen", "automat"));
                }}
        )
);
// javascript
analyzerParams = map[string]any{"tokenizer": "standard",
    "filter": []any{map[string]any{
        "type":       "decompounder",
        "word_list": []string{"dampf", "schiff", "fahrt", "brot", "backen", "automat"},
    }}}
# restful
analyzerParams='{
  "tokenizer": "standard",
  "filter": [
    {
      "type": "decompounder",
      "word_list": [
        "dampf",
        "schiff",
        "fahrt",
        "brot",
        "backen",
        "automat"
      ]
    }
  ]
}'

を使用した検証run_analyzer

from pymilvus import (
    MilvusClient,
)

client = MilvusClient(uri="http://localhost:19530")

# Sample text to analyze
sample_text = "dampfschifffahrt brotbackautomat"

# Run the standard analyzer with the defined configuration
result = client.run_analyzer(sample_text, analyzer_params)
print("Standard analyzer output:", result)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;

ConnectConfig config = ConnectConfig.builder()
        .uri("http://localhost:19530")
        .build();
MilvusClientV2 client = new MilvusClientV2(config);

List<String> texts = new ArrayList<>();
texts.add("dampfschifffahrt brotbackautomat");

RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
        .texts(texts)
        .analyzerParams(analyzerParams)
        .build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
// javascript
import (
    "context"
    "encoding/json"
    "fmt"

    "github.com/milvus-io/milvus/client/v2/milvusclient"
)

client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
    Address: "localhost:19530",
    APIKey:  "root:Milvus",
})
if err != nil {
    fmt.Println(err.Error())
    // handle error
}

bs, _ := json.Marshal(analyzerParams)
texts := []string{"dampfschifffahrt brotbackautomat"}
option := milvusclient.NewRunAnalyzerOption(texts).
    WithAnalyzerParams(string(bs))

result, err := client.RunAnalyzer(ctx, option)
if err != nil {
    fmt.Println(err.Error())
    // handle error
}
# restful

期待される出力

['dampf', 'schiff', 'fahrt', 'brotbackautomat']