Lindera

lindera tokenizer 執行以字典為基礎的形態分析。它專為日語和韓語設計,在日語和韓語中,單詞不以空格分隔,語法標記(顆粒)直接附加到單詞上。

適用於中文文字:雖然lindera 可透過cc-cedict 字典支援中文,但我們建議使用 jiebatokenizer 代替。Jieba 專為中文分詞而設計,能提供更好的結果。

概述

日語和韓語是聚合語言:稱為顆粒的語法標記直接附著在名詞上,形成許多組合。例如

語言

字根

+ 詞組

= 組合形式

意義

韓語

서울 (首爾)

서울에서(首爾

首爾

在首爾

韓國

東京 (Tokyo)

東京に

至東京

lindera tokenizer:

  1. 將文字分割為單獨的語素 (單字和詞組)

  2. 使用字典中的語音部分 (POS) 資訊標記每個符記

  3. 應用過濾器來移除不需要的標記 (例如:顆粒、標點符號)

這兩個階段的流程 - 先分割,再以 POS 為基礎進行篩選 - 可以精確控制哪些標記會被編入搜尋索引。

先決條件

Milvus 2.6+ 使用者:您可以跳過本節。所有字典都已預先編譯,並包含在正式版中。

對於 Milvus 2.5.x,您需要在啟用特定字典的情況下編譯 Milvus。所有字典都必須在編譯時明確包含。

若要啟用特定字典,請在編譯指令中包含它們:

make milvus TANTIVY_FEATURES=lindera-ipadic,lindera-ko-dic

可用字典的完整清單:

辭典

語言

說明

lindera-ko-dic

韓語

韓語形態字典(MeCab Ko-dic)

lindera-ipadic

日語

標準形態字典(MeCab IPADIC)

lindera-ipadic-neologd

日語

包含新詞和專有名詞的擴充字典(IPADIC NEologd)

lindera-unidic

日語

學術標準字典(UniDic)

lindera-cc-cedict

日語

社群維護的漢英字典(CC-CEDICT)

例如,啟用所有字典:

make milvus TANTIVY_FEATURES=lindera-ipadic,lindera-ipadic-neologd,lindera-unidic,lindera-ko-dic,lindera-cc-cedict

配置

若要設定使用lindera tokenizer 的分析器,請將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

tokenizer 的類型。固定為"lindera"

dict_kind

用於定義詞彙的字典。可能的值:

  • ko-dic:韓語 - 韓語形態字典(MeCab Ko-dic)

  • ipadic:日語 - 標準形態字典(MeCab IPADIC)

  • ipadic-neologd:日語新詞字典 (擴充) - 包括新詞和專有名詞(IPADIC NEologd)

  • unidic:日語 UniDic (擴充) - 包含詳細語言資訊的學術標準字典(UniDic)

  • cc-cedict:中文普通話 (繁體/簡體) - 社區維護的漢英字典(CC-CEDICT)

filter

要在分割後套用的 tokenizer 層級篩選器清單。每個篩選器都是一個物件,包含

  • kind:篩選器類型。支援的值:

    • korean_stop_tags:移除符合指定韓國 POS 標籤的字元。

    • japanese_stop_tags:移除符合指定日語 POS 標籤的詞組。

  • tags:要篩選出的 POS 標籤清單。可用的標籤取決於kind

    • 對於korean_stop_tags :使用精確的標籤代碼 (例如JKS,JKO,SF)。韓語標籤需要精確匹配。有關以世宗標籤集為基礎的完整清單,請參閱Lindera 韓語停止標籤來源

    • 對於japanese_stop_tags :使用精確的標籤代碼 (例如助詞,格助詞,助詞,係助詞,助動詞)。日語標籤需要精確匹配。如需完整清單 (IPADIC),請參閱日文 POS 標籤參考

定義analyzer_params 之後,您可以在定義集合模式時,將它們套用到VARCHAR 欄位。這允許 Milvus 使用指定的分析器來處理該欄位中的文字,以進行有效的標記化和過濾。詳情請參閱範例使用

範例

在應用分析器配置到您的收集模式之前,請使用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 ,輸出會包括像에서 (in)、 (主題標記) 和 (物件標記) 之類的顆粒,這些顆粒通常對搜尋沒有幫助。

日文範例

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 ,輸出會包括像 (所有格)、 (主題標記) 和です (共格) 之類的詞粒。

免費嘗試托管的 Milvus

Zilliz Cloud 無縫接入,由 Milvus 提供動力,速度提升 10 倍。

開始使用
反饋

這個頁面有幫助嗎?