Lindera

O tokenizador lindera efectua uma análise morfológica baseada em dicionário. Foi concebido para as línguas japonesa e coreana, em que as palavras não são separadas por espaços e os marcadores gramaticais (partículas) se ligam diretamente às palavras.

Para texto chinês: Embora lindera suporte o chinês através do dicionário cc-cedict, recomendamos a utilização do jieba em vez disso. O Jieba foi concebido especificamente para a segmentação de palavras chinesas e fornece melhores resultados.

Visão geral

O japonês e o coreano são línguas aglutinativas: os marcadores gramaticais chamados partículas ligam-se diretamente aos substantivos, formando inúmeras combinações. Por exemplo:

Língua

Palavra de raiz

+ Partícula

= Forma combinada

Significado

Coreano

서울 (Seul)

에서

서울에서

em Seul

Japonês

東京 (Tóquio)

東京に

para Tóquio

O lindera tokenizador:

  1. Segmenta o texto em morfemas individuais (palavras e partículas)

  2. Marca cada token com informações de parte da fala (POS) do dicionário

  3. Aplica filtros para remover tokens indesejados (por exemplo, partículas, pontuação)

Este processo de duas fases - segmentação seguida de filtragem baseada em POS - permite um controlo preciso sobre os tokens que são indexados para pesquisa.

Pré-requisitos

Usuários do Milvus 2.6+: Pode saltar esta secção. Todos os dicionários são pré-compilados e incluídos na versão oficial.

Para o Milvus 2.5.x, é necessário compilar o Milvus com dicionários específicos activados. Todos os dicionários devem ser explicitamente incluídos durante a compilação.

Para ativar dicionários específicos, inclua-os no comando de compilação:

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

A lista completa de dicionários disponíveis:

Dicionário

Idioma

Descrição do dicionário

lindera-ko-dic

Coreano

Dicionário morfológico do coreano(MeCab Ko-dic)

lindera-ipádico

Japonês

Dicionário morfológico padrão(MeCab IPADIC)

lindera-ipadic-neologd

Japonês

Dicionário alargado com novas palavras e nomes próprios(IPADIC NEologd)

lindera-unidic

Japonês

Dicionário académico padrão(UniDic)

lindera-cc-cedict

Chinês

Dicionário chinês-inglês mantido pela comunidade(CC-CEDICT)

Por exemplo, para ativar todos os dicionários:

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

Configuração

Para configurar um analisador usando o tokenizador lindera, defina tokenizer.type como lindera, escolha um dicionário com dict_kind e, opcionalmente, aplique filtros.

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

Parâmetro

Descrição

type

O tipo de tokenizador. Este é fixado em "lindera".

dict_kind

Um dicionário utilizado para definir o vocabulário. Valores possíveis:

  • ko-dic: Coreano - Dicionário morfológico coreano(MeCab Ko-dic)

  • ipadic: Japonês - Dicionário morfológico padrão(MeCab IPADIC)

  • ipadic-neologd: Japonês com dicionário de neologismos (alargado) - Inclui palavras novas e nomes próprios(IPADIC NEologd)

  • unidic: UniDic japonês (extenso) - Dicionário padrão académico com informação linguística detalhada(UniDic)

  • cc-cedict: Chinês Mandarim (tradicional/simplificado) - Dicionário Chinês-Inglês mantido pela comunidade(CC-CEDICT)

filter

Uma lista de filtros de nível de tokenizador para aplicar após a segmentação. Cada filtro é um objeto com:

  • kind: O tipo de filtro. Valores suportados:

    • korean_stop_tags: Remover tokens que correspondam às etiquetas POS coreanas especificadas.

    • japanese_stop_tags: Remove tokens que correspondem a etiquetas POS japonesas especificadas.

  • tags: Uma lista de etiquetas POS para filtrar. As etiquetas disponíveis dependem de kind:

    • Para korean_stop_tags: Utilize códigos de etiqueta exactos (por exemplo, JKS, JKO, SF). As etiquetas coreanas requerem uma correspondência exacta. Para obter a lista completa baseada no conjunto de etiquetas Sejong, consulte a fonte Lindera Korean stop tags.

    • Para japanese_stop_tags: Utilize códigos de etiqueta exactos (por exemplo, 助詞,格助詞, 助詞,係助詞, 助動詞). As etiquetas japonesas requerem uma correspondência exacta. Para obter a lista completa (IPADIC), consulte a referência de etiquetas POS japonesas.

Depois de definir analyzer_params, pode aplicá-las a um campo VARCHAR ao definir um esquema de coleção. Isto permite que o Milvus processe o texto nesse campo utilizando o analisador especificado para uma tokenização e filtragem eficientes. Para mais pormenores, consulte Exemplo de utilização.

Exemplos

Antes de aplicar a configuração do analisador ao seu esquema de coleção, verifique o seu comportamento utilizando o método run_analyzer.

Exemplo coreano

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

Saída esperada:

['서울', '맛있', '음식', '먹', '습니다']

Sem korean_stop_tags, a saída incluiria partículas como 에서 (in), (marcador de tópico) e (marcador de objeto), que normalmente não são úteis para a pesquisa.

Exemplo japonês

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

Resultado esperado:

['東京', 'スカイ', 'ツリー', '最寄り駅', 'とう', 'きょう', 'スカイ', 'ツリー', '駅']

Sem japanese_stop_tags, o resultado incluiria partículas como (possessivo), (marcador de tópico) e です (cópula).

Try Managed Milvus for Free

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

Get Started
Feedback

Esta página foi útil?