Pinyin
中国語のテキスト検索では、多くの場合、インデックス付きテキストに表示される中国語文字をそのまま入力する必要があります。名前検索、オートコンプリート、入力しながら検索するワークフローでは、ユーザーは中国語文字ではなく Pinyin を入力することがよくあります。たとえば、ユーザーは zuqiu と入力して 足球 を検索できます。pinyin フィルターはアナライザーの出力に Pinyin トークンを追加するため、別個の Pinyin フィールドを維持しなくても、中国語テキストを Pinyin 入力に一致させることができます。
pinyin フィルターは通常、中国語テキスト用の Jieba トークナイザーと組み合わせて使用します。カスタムアナライザーのフィルターパイプラインで動作し、同じ中国語トークンに対して複数の Pinyin トークン形式を出力できます。
設定
デフォルトオプションを使用するには、analyzer_params の filter セクションに "pinyin" を指定します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
analyzerParams.put("filter", Collections.singletonList("pinyin"));
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []string{"pinyin"},
}
use milvus::v2::prelude::*;
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": ["pinyin"]
});
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {"pinyin"}}
};
let analyzer_params = {
tokenizer: "jieba",
filter: ["pinyin"],
};
# restful
analyzerParams='{
"tokenizer": "jieba",
"filter": ["pinyin"]
}'
この省略形では、元の中国語トークンを保持し、文字単位の Pinyin トークンを出力します。結合 Pinyin や Pinyin の頭文字は、それらのオプションを明示的に有効にしない限り出力されません。
詳細に制御するには、フィルターをオブジェクトとして指定し、Zilliz Cloud が出力する Pinyin トークン形式を設定します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": True,
"keep_joined_full_pinyin": False,
"keep_separate_first_letter": False,
}
],
}
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", true);
pinyinFilter.put("keep_joined_full_pinyin", false);
pinyinFilter.put("keep_separate_first_letter", false);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false,
},
},
}
use milvus::v2::prelude::*;
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false
}
]
});
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", true},
{"keep_joined_full_pinyin", false},
{"keep_separate_first_letter", false}
}
}}
};
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: true,
keep_joined_full_pinyin: false,
keep_separate_first_letter: false,
},
],
};
# restful
analyzerParams='{
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": true,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": false
}
]
}'
フィルターでは、次のパラメーターを使用できます。
| パラメーター | 型 | デフォルト | 説明 |
|---|---|---|---|
keep_original | Boolean | true | アナライザーの出力に元の中国語トークンを保持します。 |
keep_full_pinyin | Boolean | true | 文字単位の Pinyin トークンを出力します。たとえば、中文 から zhong と wen が生成されます。 |
keep_joined_full_pinyin | Boolean | false | ソーストークンごとに結合 Pinyin トークンを出力します。たとえば、中文 から zhongwen が生成されます。 |
keep_separate_first_letter | Boolean | false | ソーストークンごとに Pinyin の頭文字トークンを出力します。たとえば、中文 から zw が生成されます。 |
このフィルターは、トークナイザーによって生成されたトークンを処理します。中国語テキストには、jieba などのトークナイザーと組み合わせて使用します。
例
アナライザー設定をコレクションスキーマに適用する前に、run_analyzer を使用してその動作を確認してください。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
from pymilvus import MilvusClient
client = MilvusClient(uri="YOUR_CLUSTER_ENDPOINT")
sample_text = "中文测试"
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
import java.util.*;
ConnectConfig config = ConnectConfig.builder()
.uri("YOUR_CLUSTER_ENDPOINT")
.token("YOUR_CLUSTER_TOKEN")
.build();
MilvusClientV2 client = new MilvusClientV2(config);
List<String> texts = new ArrayList<>();
texts.add("中文测试");
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v3/milvusclient"
)
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: "YOUR_CLUSTER_ENDPOINT",
APIKey: "YOUR_CLUSTER_TOKEN",
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
texts := []string{"中文测试"}
use milvus::v2::prelude::*;
let config = ConnectConfig::new().uri("YOUR_CLUSTER_ENDPOINT").token("YOUR_CLUSTER_TOKEN");
let client = ClientV2::new(&config).await?;
let sample_text = "中文测试";
#include "milvus/MilvusClientV2.h"
#include <iostream>
auto client = milvus::MilvusClientV2::Create();
milvus::ConnectParam connect_param{"YOUR_CLUSTER_ENDPOINT", "YOUR_CLUSTER_TOKEN"};
auto status = client->Connect(connect_param);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
std::string sample_text = "中文测试";
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
address: "YOUR_CLUSTER_ENDPOINT",
token: "YOUR_CLUSTER_TOKEN",
});
const sample_text = "中文测试";
# restful
# The run_analyzer request is sent directly to the endpoint below.
文字単位の Pinyin で中国語テキストを照合する
デフォルトの pinyin フィルターは、元の中国語トークンを保持し、文字単位の Pinyin トークンを出力します。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": ["pinyin"],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
analyzerParams.put("filter", Collections.singletonList("pinyin"));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []string{"pinyin"},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": ["pinyin"]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {"pinyin"}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: ["pinyin"],
};
const char_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(char_result.results);
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [\"pinyin\"]}"
}'
期待される出力:
['中文', 'zhong', 'wen', '测试', 'ce', 'shi']
結合 Pinyin で中国語の語句を照合する
中国語の語句を、その完全な結合 Pinyin 形式に一致させる必要がある場合は、keep_joined_full_pinyin を有効にします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": False,
"keep_joined_full_pinyin": True,
"keep_separate_first_letter": False,
}
],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", false);
pinyinFilter.put("keep_joined_full_pinyin", true);
pinyinFilter.put("keep_separate_first_letter", false);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false,
},
},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": true,
"keep_separate_first_letter": false
}
]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", false},
{"keep_joined_full_pinyin", true},
{"keep_separate_first_letter", false}
}
}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: false,
keep_joined_full_pinyin: true,
keep_separate_first_letter: false,
},
],
};
const joined_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(joined_result.results);
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [{\"type\": \"pinyin\", \"keep_original\": true, \"keep_full_pinyin\": false, \"keep_joined_full_pinyin\": true, \"keep_separate_first_letter\": false}]}"
}'
期待される出力:
['中文', 'zhongwen', '测试', 'ceshi']
Pinyin の頭文字で中国語の語句を照合する
中国語の語句を、その Pinyin 形式の頭文字に一致させる必要がある場合は、keep_separate_first_letter を有効にします。
- Python
- Java
- Go
- Rust
- C++
- NodeJS
- cURL
analyzer_params = {
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": True,
"keep_full_pinyin": False,
"keep_joined_full_pinyin": False,
"keep_separate_first_letter": True,
}
],
}
result = client.run_analyzer(sample_text, analyzer_params)
print(result)
import io.milvus.v2.service.vector.request.RunAnalyzerReq;
import io.milvus.v2.service.vector.response.RunAnalyzerResp;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", "jieba");
Map<String, Object> pinyinFilter = new HashMap<>();
pinyinFilter.put("type", "pinyin");
pinyinFilter.put("keep_original", true);
pinyinFilter.put("keep_full_pinyin", false);
pinyinFilter.put("keep_joined_full_pinyin", false);
pinyinFilter.put("keep_separate_first_letter", true);
analyzerParams.put("filter", Collections.singletonList(pinyinFilter));
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
import "github.com/milvus-io/milvus/client/v3/milvusclient"
analyzerParams := map[string]any{
"tokenizer": "jieba",
"filter": []map[string]any{
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": true,
},
},
}
option := milvusclient.NewRunAnalyzerOption(texts...).
WithAnalyzerParams(analyzerParams)
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
fmt.Println(result)
use serde_json::json;
let analyzer_params = json!({
"tokenizer": "jieba",
"filter": [
{
"type": "pinyin",
"keep_original": true,
"keep_full_pinyin": false,
"keep_joined_full_pinyin": false,
"keep_separate_first_letter": true
}
]
});
let result = client
.run_analyzer(
RunAnalyzerRequest::builder()
.texts(vec![sample_text])
.analyzer_params(analyzer_params)
.build()?,
)
.await?;
nlohmann::json analyzer_params = {
{"tokenizer", "jieba"},
{"filter", {
{
{"type", "pinyin"},
{"keep_original", true},
{"keep_full_pinyin", false},
{"keep_joined_full_pinyin", false},
{"keep_separate_first_letter", true}
}
}}
};
auto request = milvus::RunAnalyzerRequest()
.AddText(sample_text)
.WithAnalyzerParams(analyzer_params);
milvus::RunAnalyzerResponse response;
status = client->RunAnalyzer(request, response);
if (!status.IsOk()) {
std::cout << status.Message() << std::endl;
}
analyzer_params = {
tokenizer: "jieba",
filter: [
{
type: "pinyin",
keep_original: true,
keep_full_pinyin: false,
keep_joined_full_pinyin: false,
keep_separate_first_letter: true,
},
],
};
const initials_result = await client.runAnalyzer({
text: sample_text,
analyzer_params,
});
console.log(initials_result.results);
curl --request POST \
--url "YOUR_CLUSTER_ENDPOINT/v2/vectordb/common/run_analyzer" \
--header "Authorization: Bearer YOUR_CLUSTER_TOKEN" \
--header "Content-Type: application/json" \
-d '{
"text": ["中文测试"],
"analyzerParams": "{\"tokenizer\": \"jieba\", \"filter\": [{\"type\": \"pinyin\", \"keep_original\": true, \"keep_full_pinyin\": false, \"keep_joined_full_pinyin\": false, \"keep_separate_first_letter\": true}]}"
}'
期待される出力:
['中文', 'zw', '测试', 'cs']