Lindera

lindera 토큰화 도구는 사전 기반의 형태소 분석을 수행합니다. 단어가 공백으로 구분되지 않고 문법 마커(입자)가 단어에 직접 붙어 있는 일본어와 한국어를 위해 설계되었습니다.

중국어 텍스트의 경우: lindera 에서는 cc-cedict 사전을 통해 중국어를 지원하지만, 중국어 텍스트의 경우에는 jieba 토큰화기를 사용하는 것이 좋습니다. Jieba는 중국어 단어 세분화를 위해 특별히 설계되었으며 더 나은 결과를 제공합니다.

개요

일본어와 한국어는 입자라는 문법적 마커가 명사에 직접 부착되어 수많은 조합을 형성하는 응집 언어입니다. 예를 들어

언어

어근 단어

+ 입자

= 결합 형태

의미

한국어

서울 (서울)

에서

서울에서

서울에서

일본어

東京 (도쿄)

東京に

도쿄로

lindera 토큰화기:

  1. 텍스트를 개별 형태소(단어와 입자)로분할합니다.

  2. 사전의 품사(POS) 정보로각 토큰에 태그를 지정합니다.

  3. 필터를 적용하여 원치 않는 토큰(예: 입자, 문장부호)을 제거합니다.

이 2단계 프로세스(세분화 후 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)

린데라-아이패드-네오로그드

일본어

신조어와 고유명사가 포함된 확장 사전(IPADIC NEologd)

린데라-유니딕

일본어

학술 표준 사전(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.typelindera 으로 설정하고 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)

  • cc-cedict: 중국어(번체/간체) - 커뮤니티에서 관리하는 중국어-영어 사전(CC-CEDICT)

filter

세분화 후 적용할 토큰화 수준 필터 목록입니다. 각 필터는 객체입니다:

  • kind: 필터 유형입니다. 지원되는 값:

    • korean_stop_tags: 지정된 한국어 POS 태그와 일치하는 토큰을 제거합니다.

    • japanese_stop_tags: 지정된 일본어 POS 태그와 일치하는 토큰을 제거합니다.

  • tags: 필터링할 POS 태그 목록입니다. 사용 가능한 태그는 kind 에 따라 다릅니다:

    • korean_stop_tags: 정확한 태그 코드를 사용합니다(예: JKS, JKO, SF). 한글 태그는 정확히 일치해야 합니다. 세종 태그 세트를 기반으로 한 전체 목록은 린데라 한국어 정지 태그 소스를 참조하세요.

    • 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 이 없으면 출력에는 (소유격), (토픽 마커), です (코퓰러)와 같은 입자가 포함됩니다.

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
피드백

이 페이지가 도움이 되었나요?