لينديرا

يقوم أداة الترميز lindera بإجراء التحليل الصرفي القائم على القاموس. وهو مصمم للغتين اليابانية والكورية حيث لا يتم الفصل بين الكلمات بمسافات وترتبط العلامات النحوية (الجسيمات) بالكلمات مباشرةً.

للنص الصيني: في حين أن lindera يدعم اللغة الصينية عبر قاموس cc-cedict ، فإننا نوصي باستخدام jieba الرمز المميز بدلاً من ذلك. تم تصميم Jieba خصيصًا لتجزئة الكلمات الصينية ويوفر نتائج أفضل.

نظرة عامة

اليابانية والكورية هما لغتان متراصتان: العلامات النحوية التي تسمى الجسيمات ترتبط مباشرة بالأسماء، وتشكل العديد من التركيبات. على سبيل المثال:

اللغة

كلمة الجذر

+ جسيم

= الصيغة المركبة

المعنى

الكورية

خدمات (سيول)

خدمات

خدمات (خدمات)

في سيول

اليابانية

東京 (طوكيو)

東京 京 に

إلى طوكيو

lindera tokenizer:

  1. تجزئة النص إلى مورفيمات فردية (كلمات وجسيمات)

  2. وسم كل رمز رمزي بمعلومات جزء من الكلام (POS) من القاموس

  3. تطبيق مرشحات لإزالة الرموز غير المرغوب فيها (مثل الجسيمات وعلامات الترقيم)

تتيح هذه العملية المكونة من مرحلتين - التجزئة متبوعة بالتصفية المستندة إلى نقاط النقاط - التحكم الدقيق في الرموز التي يتم فهرستها للبحث.

المتطلبات الأساسية

مستخدمو ميلفوس 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

المعلمة

الوصف

type

نوع أداة الترميز. هذا ثابت على "lindera".

dict_kind

قاموس يستخدم لتعريف المفردات. القيم الممكنة:

  • ko-dic: الكورية - القاموس الصرفي الكوري(MeCab Ko-dic)

  • ipadic: اليابانية - القاموس الصرفي القياسي الياباني(MeCab IPADIC)

  • ipadic-neologd: اليابانية مع قاموس الكلمات الجديدة (موسع) - يشمل الكلمات الجديدة وأسماء العلم(IPADIC NEologd)

  • unidic: UniDic اليابانية (موسع) - قاموس قياسي أكاديمي مع معلومات لغوية مفصلة(UniDic)

  • cc-cedict: الماندرين الصينية (تقليدي/مبسّط) - قاموس صيني-إنجليزي صيني-إنجليزي مُصان من قبل المجتمع(CC-CEDICT)

filter

قائمة مرشحات على مستوى الرمز المميز لتطبيقها بعد التجزئة. كل مرشح هو كائن يحتوي على:

  • kind: نوع المرشح. القيم المدعومة:

    • korean_stop_tags: إزالة الرموز المطابقة لعلامات نقاط البيع الكورية المحددة.

    • japanese_stop_tags: إزالة الرموز المطابقة لعلامات نقاط البيع اليابانية المحددة.

  • tags: قائمة بعلامات نقاط البيع المراد تصفيتها. تعتمد العلامات المتاحة على kind:

    • لـ korean_stop_tags: استخدم رموز العلامات الدقيقة (على سبيل المثال، JKS ، JKO ، ، SF). تتطلب العلامات الكورية مطابقة تامة. للاطلاع على القائمة الكاملة استنادًا إلى مجموعة علامات Sejong، راجع مصدر علامات الإيقاف الكورية لينديرا.

    • للحصول على japanese_stop_tags: استخدم رموز العلامات الدقيقة (على سبيل المثال، 助詞,格助詞 ، 助詞,係助詞 ، ، 助動詞). تتطلب العلامات اليابانية مطابقة تامة. للاطلاع على القائمة الكاملة (IPADIC)، انظر مرجع علامات نقاط البيع اليابانية.

بعد تحديد 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 ، سيتضمن الإخراج جسيمات مثل (في) و (علامة الموضوع) و です (علامة الموضوع).

جرب Managed Milvus مجاناً

Zilliz Cloud خالي من المتاعب، ويعمل بواسطة Milvus ويعمل بسرعة 10 أضعاف.

ابدأ
التعليقات

هل كانت هذه الصفحة مفيدة؟