لينديرا
يقوم أداة الترميز lindera بإجراء التحليل الصرفي القائم على القاموس. وهو مصمم للغتين اليابانية والكورية حيث لا يتم الفصل بين الكلمات بمسافات وترتبط العلامات النحوية (الجسيمات) بالكلمات مباشرةً.
للنص الصيني: في حين أن lindera يدعم اللغة الصينية عبر قاموس cc-cedict ، فإننا نوصي باستخدام jieba الرمز المميز بدلاً من ذلك. تم تصميم Jieba خصيصًا لتجزئة الكلمات الصينية ويوفر نتائج أفضل.
نظرة عامة
اليابانية والكورية هما لغتان متراصتان: العلامات النحوية التي تسمى الجسيمات ترتبط مباشرة بالأسماء، وتشكل العديد من التركيبات. على سبيل المثال:
اللغة |
كلمة الجذر |
+ جسيم |
= الصيغة المركبة |
المعنى |
|---|---|---|---|---|
الكورية |
خدمات (سيول) |
خدمات |
خدمات (خدمات) |
في سيول |
اليابانية |
東京 (طوكيو) |
に |
東京 京 に |
إلى طوكيو |
lindera tokenizer:
تجزئة النص إلى مورفيمات فردية (كلمات وجسيمات)
وسم كل رمز رمزي بمعلومات جزء من الكلام (POS) من القاموس
تطبيق مرشحات لإزالة الرموز غير المرغوب فيها (مثل الجسيمات وعلامات الترقيم)
تتيح هذه العملية المكونة من مرحلتين - التجزئة متبوعة بالتصفية المستندة إلى نقاط النقاط - التحكم الدقيق في الرموز التي يتم فهرستها للبحث.
المتطلبات الأساسية
مستخدمو ميلفوس 2.6+: يمكنك تخطي هذا القسم. جميع القواميس مجمعة مسبقًا ومضمنة في الإصدار الرسمي.
بالنسبة ل Milvus 2.5.x، تحتاج إلى تجميع Milvus مع تمكين قواميس محددة. يجب تضمين جميع القواميس بشكل صريح أثناء التحويل البرمجي.
لتمكين قواميس محددة، قم بتضمينها في أمر التحويل البرمجي:
make milvus TANTIVY_FEATURES=lindera-ipadic,lindera-ko-dic
القائمة الكاملة للقواميس المتاحة:
القاموس |
اللغة |
الوصف |
|---|---|---|
لينديرا-كو-ديك |
الكورية |
القاموس الصرفي الكوري(MeCab Ko-dic) |
لينديرا-إيباديك |
اليابانية |
القاموس الصرفي القياسي(MeCab IPADIC) |
lindera-ipadic-neologd |
اليابانية |
قاموس موسع مع الكلمات الجديدة وأسماء العلم(IPADIC NEologd) |
lindera-unidic |
اليابانية |
قاموس قياسي أكاديمي(UniDic) |
لينديرا-سي-سي-ديكت |
الصينية |
قاموس صيني-إنجليزي صيني-إنجليزي(CC-CEDICT) |
على سبيل المثال، لتمكين جميع القواميس:
make milvus TANTIVY_FEATURES=lindera-ipadic,lindera-ipadic-neologd,lindera-unidic,lindera-ko-dic,lindera-cc-cedict
التهيئة
لتهيئة محلل باستخدام أداة الترميز lindera ، اضبط tokenizer.type على lindera ، واختر قاموسًا باستخدام dict_kind ، وقم بتطبيق المرشحات اختياريًا.
analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict_kind": "ko-dic",
"filter": [
{
"kind": "korean_stop_tags",
"tags": ["SP", "SSC", "SSO", "SC", "SE", "SF", "JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ", "JX", "JC", "UNK", "EP", "ETM"]
}
]
}
}
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", new HashMap<String, Object>() {{
put("type", "lindera");
put("dict_kind", "ko-dic");
put("filter", Arrays.asList(
new HashMap<String, Object>() {{
put("kind", "korean_stop_tags");
put("tags", Arrays.asList(
"SP", "SSC", "SSO", "SC", "SE", "SF",
"JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ",
"JX", "JC", "UNK", "EP", "ETM"
));
}}
));
}});
analyzerParams := map[string]interface{}{
"tokenizer": map[string]interface{}{
"type": "lindera",
"dict_kind": "ko-dic",
"filter": []interface{}{
map[string]interface{}{
"kind": "korean_stop_tags",
"tags": []string{
"SP", "SSC", "SSO", "SC", "SE", "SF",
"JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ",
"JX", "JC", "UNK", "EP", "ETM",
},
},
},
},
}
const analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict_kind": "ko-dic",
"filter": [
{
"kind": "korean_stop_tags",
"tags": ["SP", "SSC", "SSO", "SC", "SE", "SF", "JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ", "JX", "JC", "UNK", "EP", "ETM"]
}
]
}
};
# restful
المعلمة |
الوصف |
|---|---|
|
نوع أداة الترميز. هذا ثابت على |
|
قاموس يستخدم لتعريف المفردات. القيم الممكنة:
|
|
قائمة مرشحات على مستوى الرمز المميز لتطبيقها بعد التجزئة. كل مرشح هو كائن يحتوي على:
|
بعد تحديد analyzer_params ، يمكنك تطبيقها على حقل VARCHAR عند تحديد مخطط المجموعة. يسمح ذلك لميلفوس بمعالجة النص في ذلك الحقل باستخدام المحلل المحدد من أجل ترميز وتصفية فعالة. لمزيد من التفاصيل، راجع مثال الاستخدام.
أمثلة
قبل تطبيق تكوين المحلل على مخطط المجموعة الخاص بك، تحقق من سلوكه باستخدام الأسلوب run_analyzer.
مثال كوري
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict_kind": "ko-dic",
"filter": [
{
"kind": "korean_stop_tags",
"tags": ["SP", "SSC", "SSO", "SC", "SE", "SF", "JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ", "JX", "JC", "UNK", "EP", "ETM"]
}
]
}
}
# Sample Korean text: "서울에서 맛있는 음식을 먹었습니다" (I ate delicious food in Seoul)
sample_text = "서울에서 맛있는 음식을 먹었습니다"
result = client.run_analyzer(sample_text, analyzer_params)
print("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);
Map<String, Object> analyzerParams = new HashMap<>();
analyzerParams.put("tokenizer", new HashMap<String, Object>() {{
put("type", "lindera");
put("dict_kind", "ko-dic");
put("filter", Arrays.asList(
new HashMap<String, Object>() {{
put("kind", "korean_stop_tags");
put("tags", Arrays.asList(
"SP", "SSC", "SSO", "SC", "SE", "SF",
"JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ",
"JX", "JC", "UNK", "EP", "ETM"
));
}}
));
}});
List<String> texts = new ArrayList<>();
texts.add("서울에서 맛있는 음식을 먹었습니다");
RunAnalyzerResp resp = client.runAnalyzer(RunAnalyzerReq.builder()
.texts(texts)
.analyzerParams(analyzerParams)
.build());
List<RunAnalyzerResp.AnalyzerResult> results = resp.getResults();
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
}
analyzerParams := map[string]interface{}{
"tokenizer": map[string]interface{}{
"type": "lindera",
"dict_kind": "ko-dic",
"filter": []interface{}{
map[string]interface{}{
"kind": "korean_stop_tags",
"tags": []string{
"SP", "SSC", "SSO", "SC", "SE", "SF",
"JKS", "JKC", "JKG", "JKO", "JKB", "JKV", "JKQ",
"JX", "JC", "UNK", "EP", "ETM",
},
},
},
},
}
bs, _ := json.Marshal(analyzerParams)
texts := []string{"서울에서 맛있는 음식을 먹었습니다"}
option := milvusclient.NewRunAnalyzerOption(texts).
WithAnalyzerParams(string(bs))
result, err := client.RunAnalyzer(ctx, option)
if err != nil {
fmt.Println(err.Error())
// handle error
}
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
uri: "http://localhost:19530",
});
const analyzer_params = {
tokenizer: {
type: "lindera",
dict_kind: "ko-dic",
filter: [
{
kind: "korean_stop_tags",
tags: [
"SP",
"SSC",
"SSO",
"SC",
"SE",
"SF",
"JKS",
"JKC",
"JKG",
"JKO",
"JKB",
"JKV",
"JKQ",
"JX",
"JC",
"UNK",
"EP",
"ETM",
],
},
],
},
};
const sample_text = "서울에서 맛있는 음식을 먹었습니다";
const result = await client.run_analyzer(sample_text, analyzer_params);
console.log("Analyzer output:", result);
# restful
الناتج المتوقع:
['서울', '맛있', '음식', '먹', '습니다']
بدون korean_stop_tags ، سيتضمن الإخراج جزيئات مثل 에서 (في) و 는 (علامة الموضوع) و 을 (علامة الكائن)، والتي عادةً ما تكون غير مفيدة للبحث.
مثال ياباني
from pymilvus import MilvusClient
client = MilvusClient(uri="http://localhost:19530")
analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict_kind": "ipadic",
"filter": [
{
"kind": "japanese_stop_tags",
"tags": ["接続詞", "助詞,格助詞", "助詞,格助詞,一般", "助詞,格助詞,引用", "助詞,格助詞,連語", "助詞,係助詞", "助詞,終助詞", "助詞,接続助詞", "助詞,特殊", "助詞,副助詞", "助詞,副助詞/並立助詞/終助詞", "助詞,連体化", "助詞,副詞化", "助詞,並立助詞", "助動詞", "記号,一般", "記号,読点", "記号,句点", "記号,空白", "記号,括弧閉", "記号,括弧開", "その他,間投", "フィラー", "非言語音"]
}
]
}
}
# Sample Japanese text: "東京スカイツリーの最寄り駅はとうきょうスカイツリー駅です"
sample_text = "東京スカイツリーの最寄り駅はとうきょうスカイツリー駅です"
result = client.run_analyzer(sample_text, analyzer_params)
print("Analyzer output:", result)
// java
// go
import { MilvusClient } from "@zilliz/milvus2-sdk-node";
const client = new MilvusClient({
uri: "http://localhost:19530",
});
const analyzer_params = {
"tokenizer": {
"type": "lindera",
"dict_kind": "ipadic",
"filter": [
{
"kind": "japanese_stop_tags",
"tags": ["接続詞", "助詞,格助詞", "助詞,格助詞,一般", "助詞,格助詞,引用", "助詞,格助詞,連語", "助詞,係助詞", "助詞,終助詞", "助詞,接続助詞", "助詞,特殊", "助詞,副助詞", "助詞,副助詞/並立助詞/終助詞", "助詞,連体化", "助詞,副詞化", "助詞,並立助詞", "助動詞", "記号,一般", "記号,読点", "記号,句点", "記号,空白", "記号,括弧閉", "記号,括弧開", "その他,間投", "フィラー", "非言語音"]
}
]
}
}
// Sample Japanese text: "東京スカイツリーの最寄り駅はとうきょうスカイツリー駅です"
const sample_text = "東京スカイツリーの最寄り駅はとうきょうスカイツリー駅です"
const result = await client.run_analyzer(sample_text, analyzer_params);
console.log("Analyzer output:", result);
# restful
الناتج المتوقع:
['東京', 'スカイ', 'ツリー', '最寄り駅', 'とう', 'きょう', 'スカイ', 'ツリー', '駅']
بدون japanese_stop_tags ، سيتضمن الإخراج جسيمات مثل の (في) و は (علامة الموضوع) و です (علامة الموضوع).