Tokenisation

Cette page explique comment ajouter la tokenisation aux tableaux. La tokenisation est nécessaire pour créer les jetons utilisés dans l'index de recherche.

Présentation

La tokenisation est le processus de transformation des valeurs en jetons. La méthode que vous utiliser pour tokeniser un document détermine les types et l'efficacité des recherches que les utilisateurs peuvent y effectuer.

Spanner fournit des tokenizers pour le texte en langage naturel, les sous-chaînes, le texte verbatim, les nombres et les valeurs booléennes. Le schéma de base de données utilise tokenizer qui correspond au type de recherche requis pour la colonne. Tokenizers présentent les caractéristiques suivantes:

  • Chaque tokenizer est une fonction SQL qui reçoit une entrée, telle qu'une chaîne ou un nombre, et des arguments nommés pour des options supplémentaires.
  • Le tokenizer renvoie un TOKENLIST.

Par exemple, une chaîne de texte The quick brown fox jumps over the lazy dog est tokenisée en [the,quick,brown,fox,jumps,over,the,lazy,dog]. Une chaîne HTML The <b>apple</b> is <i>red</i> est tokenisée en [the,apple,is,red].

Les jetons présentent les caractéristiques suivantes:

  • Les jetons sont stockés dans des colonnes qui utilisent le type de données TOKENLIST.
  • Chaque jeton est stocké sous la forme d'une séquence d'octets, avec un ensemble facultatif d'attributs associés. Par exemple, dans les applications de texte intégral, un jeton est généralement un seul mot d'un document textuel.
  • Lors de la tokenisation des valeurs HTML, Spanner génère des attributs qui indiquent la proéminence d'un jeton dans le document. Spanner utilise ces attributs pour l'évaluation afin de mettre en avant les termes plus importants (tels qu'un titre).

Analyseurs lexicaux

Spanner accepte les fonctions de tokenizer suivantes :

  • Le tokenizeur de texte intégral (TOKENIZE_FULLTEXT) produit des jetons de mots entiers pour les requêtes en langage naturel.

    Exemple

    Les deux fonctions suivantes

    TOKENIZE_FULLTEXT("Yellow apple")
    TOKENIZE_FULLTEXT("Yellow &lt;b>apple&lt;/b>", content_type=>"text/html")
    

    génèrent les mêmes jetons: [yellow,apple].

  • Le tokenizeur de sous-chaîne (TOKENIZE_SUBSTRING) génère des jetons pour chaque n-gramme de chaque mot. Il est utilisé pour trouver des sous-chaînes de mots dans un texte.

    Exemple

    TOKENIZE_SUBSTRING("hello world", ngram_size_min=>4, ngram_size_max=>6)
    

    Génère les jetons suivants: [ello,hell,hello,orld,worl,world].

  • Tokenizer N-gram (TOKENIZE_NGRAMS) génère des n-grammes à partir d'une entrée (sans la diviser en mots séparés). Il permet d'accélérer les prédicats d'expression régulière.

    Exemple

    La fonction suivante :

    TOKENIZE_NGRAMS("Big Time", ngram_size_min=>4, ngram_size_max=>4)
    

    Génère les jetons suivants : ["Big ","ig T","g Ti"," Tim", "Time"].

  • Les tokenizers de correspondance exacte (TOKEN et TOKENIZE_BOOL) permettent de rechercher des lignes contenant une certaine valeur dans l'une de leurs colonnes. Par exemple, une application qui indexe un catalogue de produits peut vouloir rechercher des produits d'une marque et d'une couleur spécifiques.

    Exemples

    Les fonctions suivantes :

    TOKEN("hello")
    TOKEN(["hello", "world"])
    

    Générez les jetons suivants, respectivement : [hello] et [hello,world].

    La fonction suivante :

    TOKENIZE_BOOL(true)
    

    Génère le jeton suivant : [y].

  • Outil de tokenisation des nombres (TOKENIZE_NUMBER) sont utilisés pour générer un ensemble de jetons qui accélèrent la comparaison numérique des recherches. Pour les conditions d'égalité, le jeton est le nombre lui-même. Plage des conditions (comme rating >= 3.5), l'ensemble de jetons est plus élaboré.

    Exemples

    Les instructions de fonction suivantes:

    TOKENIZE_NUMBER(42, comparison_type=>"equality")
    TOKENIZE_NUMBER(42, comparison_type=>"all", granularity=>10, min=>1, max=>100)
    

    produire les jetons suivants, respectivement: "==42" et "==42". "[1,75]", "[36, 45]", "[36,55]" et "[36, 75]".

Les fonctions de tokenisation sont généralement utilisées generated column. Ces les colonnes sont définies en tant que HIDDEN afin qu'elles ne soient pas incluses dans SELECT *. les résultats de la requête.

L'exemple suivant utilise une fonction de tokenisation de texte intégral et une fonction de tokenisation numérique pour créer une base de données qui stocke les noms et les notes des albums de musique. L'instruction LDD effectue deux actions:

  1. Définit les colonnes de données AlbumTitle et Rating.
  2. Définit AlbumTitle_Tokens et AlbumRating_Tokens. Ces colonnes TOKENLIST tokenizent les valeurs des colonnes de données afin que Spanner puisse les indexer.

    CREATE TABLE Albums (
      AlbumId STRING(MAX) NOT NULL,
      AlbumTitle STRING(MAX),
      Rating FLOAT64,
      AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN,
      Rating_Tokens TOKENLIST AS (TOKENIZE_NUMBER(Rating)) HIDDEN
    ) PRIMARY KEY(AlbumId);
    

Chaque fois que les valeurs de base sont modifiées, AlbumTitle_Tokens et Rating_Tokens sont automatiquement mis à jour.

Tokeniser le texte brut ou le contenu HTML

La tokenisation de texte est compatible avec les types de contenu texte brut et HTML. Utilisez les Spanner TOKENIZE_FULLTEXT pour créer des jetons. Utilisez ensuite l'instruction LDD CREATE SEARCH INDEX pour générer l'index de recherche.

Par exemple, l'instruction LDD CREATE TABLE suivante utilise le TOKENIZE_FULLTEXT pour créer des jetons à partir de AlbumTitles dans Albums. L'instruction LDD CREATE SEARCH INDEX crée une recherche avec le nouveau AlbumTitles_Tokens.

CREATE TABLE Albums (
  AlbumId STRING(MAX) NOT NULL,
  AlbumTitle STRING(MAX),
  AlbumTitle_Tokens TOKENLIST AS (TOKENIZE_FULLTEXT(AlbumTitle)) HIDDEN
) PRIMARY KEY(AlbumId);

CREATE SEARCH INDEX AlbumsIndex ON Albums(AlbumTitle_Tokens)

Le processus de tokenisation utilise les règles suivantes:

  • La tokenisation n'inclut pas la racine des mots ni la correction des mots mal orthographiés. Par exemple, dans une phrase comme "Un chat regarde groupe de chats, le jeton "chat" est indexé séparément du jeton "chats". Par rapport aux autres moteurs de recherche qui normalisent les jetons lors des écritures, Spanner permet d'étendre la requête de recherche à inclure différentes formes de mots. Pour en savoir plus, consultez Mode de requête amélioré.
  • Les mots vides (tels que "a") sont inclus dans l'index de recherche.
  • La recherche en texte intégral n'est jamais sensible à la casse. Le processus de tokenisation convertit tous les jetons en minuscules.

Le processus de tokenisation suit les positions de chaque jeton dans l'original du texte. Ces positions sont ensuite utilisées pour faire correspondre des expressions. Les positions sont stockées dans l'index de recherche avec les docids.

Google continue d'améliorer les algorithmes de tokenisation. Dans certains cas, cela peut entraîner la tokenisation d'une chaîne différemment à l'avenir de la façon dont elle l'est. maintenant tokenisée. Nous nous attendons à ce que ce type de situation soit extrêmement rare. En voici un exemple : si des améliorations ont été apportées au chinois, au coréen et au japonais (CJK) la segmentation.

L'argument content_type indique si le format de contenu utilise le format brut texte ou HTML. Utilisez les paramètres suivants pour définir content_type:

  • Pour la tokenisation du texte, définissez l'argument content_type sur "text/plain". Il s'agit du paramètre par défaut.
  • Pour la tokenisation HTML, définissez l'argument content_type sur "text/html. Sans cet argument, les balises HTML sont traitées comme des signes de ponctuation. En mode HTML, Spanner utilise des méthodes heuristiques pour déduire la proéminence du texte sur la page. Par exemple, si le texte se trouve dans un titre ou sa taille de police. Les attributs acceptés pour le code HTML incluent small, medium, large, title et "link". Tout comme la position, l'attribut est stocké en même temps que le dans l'index de recherche. La tokenisation ne crée pas de jetons pour les éléments HTML .

Les attributs de jeton n'ont aucune incidence sur la mise en correspondance ni sur les résultats de la méthode SEARCH ou fonction SEARCH_SUBSTRING. Elles ne sont utilisées que pour le classement.

L'exemple suivant montre comment tokeniser du texte:

CREATE TABLE T (
  ...
  Text STRING(MAX),
  Html STRING(MAX),
  Text_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Text, content_type=>"text/plain")) HIDDEN,
  Html_Tokens TOKENLIST
    AS (TOKENIZE_FULLTEXT(Html, content_type=>"text/html")) HIDDEN
) PRIMARY KEY(...);

Affinement de la détection de la langue avec l'argument language_tag

Par défaut, la tokenisation détecte automatiquement la langue de saisie. Lorsque la langue d'entrée est connue, un argument language_tag peut être utilisé pour affiner ce comportement:

AlbumTitle_Tokens TOKENLIST
  AS (TOKENIZE_FULLTEXT(AlbumTitle, language_tag=>"en-us")) HIDDEN

La plupart des applications ne spécifient pas l'argument language_tag et s'appuient plutôt sur la détection automatique de la langue. Segmentation pour les langues asiatiques telles que le chinois, Il n'est pas nécessaire de définir la langue de tokenisation pour le coréen et le japonais.

Les exemples suivants montrent des cas où language_tag affecte la tokenisation:

Fonction de tokenisation Jetons produits
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que") [a, tout, pourquoi, il, ya, un, parce, que]
TOKENIZE_FULLTEXT("A tout pourquoi il y a un parce que", \ language_tag=>"fr") [a, tout, pourquoi, il, y, a, un, parce, que]
TOKENIZE_FULLTEXT("旅 行") Deux jetons : [旅, 行]
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") Un jeton: [旅용]

Étape suivante