Lindera

Le tokenizer lindera effectue une analyse morphologique basée sur le dictionnaire. Il est conçu pour les langues japonaise et coréenne où les mots ne sont pas séparés par des espaces et où les marqueurs grammaticaux (particules) s'attachent directement aux mots.

Pour les textes chinois: Bien que lindera prenne en charge le chinois via le dictionnaire cc-cedict, nous recommandons d'utiliser plutôt le jieba à la place. Jieba est spécialement conçu pour la segmentation des mots chinois et fournit de meilleurs résultats.

Vue d'ensemble

Le japonais et le coréen sont des langues agglutinantes : des marqueurs grammaticaux appelés particules s'attachent directement aux noms, formant de nombreuses combinaisons. Par exemple, le japonais et le coréen sont des langues agglutinantes :

Langue

Mot racine

+ particule

= Forme combinée

Signification

Coréen

서울 (Séoul)

에서 (SÉOUL)

서울에서 (SÉOUL)

à Séoul

Japonais

東京 (Tokyo)

東京に (TOKYO)

à Tokyo

Le tokenizer lindera:

  1. segmente le texte en morphèmes individuels (mots et particules)

  2. Étiquette chaque token avec des informations sur la partie du discours (POS) provenant du dictionnaire.

  3. Applique des filtres pour supprimer les jetons indésirables (par exemple, les particules, la ponctuation).

Ce processus en deux étapes - segmentation suivie d'un filtrage basé sur les informations POS - permet de contrôler avec précision les tokens indexés pour la recherche.

Conditions préalables

Utilisateurs de Milvus 2.6+: Vous pouvez sauter cette section. Tous les dictionnaires sont pré-compilés et inclus dans la version officielle.

Pour Milvus 2.5.x, vous devez compiler Milvus avec des dictionnaires spécifiques activés. Tous les dictionnaires doivent être explicitement inclus lors de la compilation.

Pour activer des dictionnaires spécifiques, incluez-les dans la commande de compilation :

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

La liste complète des dictionnaires disponibles :

Dictionnaire

Langue

Description du dictionnaire

lindera-ko-dic

coréen

Dictionnaire morphologique coréen(MeCab Ko-dic)

lindera-ipadique

Dictionnaire morphologique japonais

Dictionnaire morphologique standard(MeCab IPADIC)

lindera-ipadic-neologd

Japonais

Dictionnaire étendu avec de nouveaux mots et noms propres(IPADIC NEologd)

lindera-unidic

japonais

Dictionnaire standard académique(UniDic)

lindera-cc-cedict

Chinois

Dictionnaire chinois-anglais entretenu par la communauté(CC-CEDICT)

Par exemple, pour activer tous les dictionnaires :

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

Configuration

Pour configurer un analyseur utilisant le tokenizer lindera, définissez tokenizer.type sur lindera, choisissez un dictionnaire avec dict_kind, et appliquez éventuellement des filtres.

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

Paramètre

Description du paramètre

type

Le type de tokenizer. Il est fixé à "lindera".

dict_kind

Un dictionnaire utilisé pour définir le vocabulaire. Valeurs possibles :

  • ko-dic: Coréen - Dictionnaire morphologique coréen(MeCab Ko-dic)

  • ipadic: Japonais - Dictionnaire morphologique standard(MeCab IPADIC)

  • ipadic-neologd: Japonais avec dictionnaire de néologismes (étendu) - Inclut les nouveaux mots et les noms propres(IPADIC NEologd)

  • unidic: Japonais UniDic (étendu) - Dictionnaire académique standard avec des informations linguistiques détaillées(UniDic)

  • cc-cedict: Chinois mandarin (traditionnel/simplifié) - Dictionnaire chinois-anglais entretenu par la communauté(CC-CEDICT)

filter

Une liste de filtres au niveau du tokenizer à appliquer après la segmentation. Chaque filtre est un objet avec :

  • kind: le type de filtre. Valeurs prises en charge :

    • korean_stop_tags: Supprime les tokens correspondant aux balises POS coréennes spécifiées.

    • japanese_stop_tags: Supprimer les tokens correspondant aux balises POS japonaises spécifiées.

  • tags: Une liste de balises POS à filtrer. Les balises disponibles dépendent de l'adresse kind:

    • Pour korean_stop_tags: Utilisez des codes de balises exacts (par exemple, JKS, JKO, SF). Les balises coréennes nécessitent une correspondance exacte. Pour la liste complète basée sur le jeu de balises Sejong, voir la source Lindera Korean stop tags.

    • Pour japanese_stop_tags: Utilisez les codes de balises exacts (par exemple, 助詞,格助詞, 助詞,係助詞, 助動詞). Les balises japonaises nécessitent une correspondance exacte. Pour la liste complète (IPADIC), voir la référence des balises POS japonaises.

Après avoir défini analyzer_params, vous pouvez les appliquer à un champ VARCHAR lors de la définition d'un schéma de collection. Cela permet à Milvus de traiter le texte de ce champ à l'aide de l'analyseur spécifié pour une tokenisation et un filtrage efficaces. Pour plus de détails, voir Exemple d'utilisation.

Exemples

Avant d'appliquer la configuration de l'analyseur à votre schéma de collecte, vérifiez son comportement à l'aide de la méthode run_analyzer.

Exemple coréen

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

Résultat attendu:

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

Sans korean_stop_tags, le résultat comprendrait des particules comme 에서 (in), (topic marker) et (object marker), qui ne sont généralement pas utiles pour la recherche.

Exemple en japonais

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

Résultat attendu :

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

Sans japanese_stop_tags, le résultat inclurait des particules comme (possessif), (marqueur de sujet), et です (copule).

Try Managed Milvus for Free

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

Get Started
Feedback

Cette page a-t - elle été utile ?