Tokenizzazione

Questa pagina descrive come aggiungere la tokenizzazione alle tabelle. La tokenizzazione è necessaria per creare i token utilizzati nell'indice di ricerca.

La tokenizzazione è il processo di trasformazione dei valori in token. Il metodo utilizzato per tokenizzare un documento determina i tipi e l'efficienza delle ricerche che gli utenti possono eseguire.

Spanner fornisce strumenti di tokenizzazione per testo in linguaggio naturale, sottostringhe, testo verbatim, numeri e valori booleani. Lo schema del database utilizza il tokenizer corrispondente al tipo di ricerca necessario per la colonna. I tokenizzatori hanno le seguenti caratteristiche:

  • Ogni tokenizzatore è una funzione SQL che riceve un input, ad esempio una stringa o un numero, e argomenti con nome per opzioni aggiuntive.
  • Il tokenizzatore restituisce un TOKENLIST.

Ad esempio, una stringa di testo The quick brown fox jumps over the lazy dog viene tokenizzata in [the,quick,brown,fox,jumps,over,the,lazy,dog]. Una stringa HTML The <b>apple</b> is <i>red</i> viene tokenizzata in [the,apple,is,red].

I token hanno le seguenti caratteristiche:

  • I token vengono archiviati in colonne che utilizzano il tipo di dati TOKENLIST.
  • Ogni token viene archiviato come sequenza di byte, con un insieme facoltativo di attributi associati. Ad esempio, nelle applicazioni di testo completo, un token è tipicamente una singola parola di un documento di testo.
  • Quando esegue la tokenizzazione dei valori HTML, Spanner genera attributi che indicano l'importanza di un token all'interno del documento. Spanner utilizza questi attributi per il calcolo del punteggio al fine di dare risalto ai termini più importanti (ad esempio un'intestazione).

Tokenizzatori

Spanner supporta le seguenti funzioni di tokenizzazione:

  • Il tokenizzatore del testo integrale (TOKENIZE_FULLTEXT) produce token di parole intere per le query in linguaggio naturale.

    Esempio

    Entrambe le seguenti funzioni

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

    producono gli stessi token: [yellow,apple].

  • Lo strumento di tokenizzazione delle sottostringhe (TOKENIZE_SUBSTRING) genera token per ogni n-gramma di ogni parola. Viene utilizzato per trovare sottostringhe di parole in un testo.

    Esempio

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

    Produce i seguenti token: [ello,hell,hello,orld,worl,world].

  • Il tokenizzatore di n-grammi (TOKENIZE_NGRAMS) genera n-grammi da un input (senza dividerli in parole separate). Viene utilizzato per accelerare i predicati delle espressioni regolari.

    Esempio

    La seguente funzione:

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

    Produce i seguenti token: ["Big ","ig T","g Ti"," Tim", "Time"].

  • I tokenizzatori a corrispondenza esatta (TOKEN e TOKENIZE_BOOL) vengono utilizzati per cercare le righe contenenti un determinato valore in una delle loro colonne. Ad esempio, un'applicazione che indicizza un catalogo di prodotti potrebbe voler cercare i prodotti di un determinato brand e colore.

    Esempi

    Le seguenti funzioni:

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

    Produci rispettivamente i seguenti token: [hello] e [hello,world].

    La seguente funzione:

    TOKENIZE_BOOL(true)
    

    Produce il seguente token: [y].

  • I tokenizzatori di numeri (TOKENIZE_NUMBER) vengono utilizzati per generare un insieme di token che accelerano le ricerche di confronto numerico. Per le condizioni di uguaglianza, il token è il numero stesso. Per le condizioni di intervallo (ad es. rating >= 3.5), l'insieme di token è più elaborato.

    Esempi

    Le seguenti istruzioni di funzione:

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

    Produci rispettivamente i seguenti token: "==42" e "==42", "[1,75]","[36, 45]","[36,55]","[36, 75]".

Le funzioni di tokenizzazione vengono solitamente utilizzate in un'espressione di colonna generata. Queste colonne sono definite come HIDDEN in modo che non vengano incluse nei risultati della query SELECT *.

L'esempio seguente utilizza un tokenizzatore di testo completo e un tokenizzatore numerico per creare un database che memorizza i nomi e le valutazioni degli album musicali. L'istruzione DDL esegue due operazioni:

  1. Definisce le colonne di dati AlbumTitle e Rating.
  2. Definisce AlbumTitle_Tokens e AlbumRating_Tokens. Queste TOKENLIST colonne tokenizzano i valori nelle colonne di dati in modo che Spanner possa indicizzarli.

    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);
    

Ogni volta che i valori di base vengono modificati, AlbumTitle_Tokens e Rating_Tokens vengono aggiornati automaticamente.

Tokenizzare i contenuti in testo normale o HTML

La tokenizzazione del testo supporta i tipi di contenuti di testo normale e HTML. Utilizza la funzione TOKENIZE_FULLTEXT di Spanner per creare token. Quindi, utilizza l'istruzione DDL CREATE SEARCH INDEX per generare l'indice di ricerca.

Ad esempio, la seguente istruzione DDL CREATE TABLE utilizza la funzione TOKENIZE_FULLTEXT per creare token da AlbumTitles nella tabella Albums. L'istruzione DDL CREATE SEARCH INDEX crea un indice di ricerca con il nuovo 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)

Il processo di tokenizzazione utilizza le seguenti regole:

  • La tokenizzazione non include stemming o correzione di parole con errori ortografici. Ad esempio, in una frase come "Un gatto guardava un gruppo di gatti", il token "gatto" viene indicizzato separatamente dal token "gatti". Rispetto ad altri motori di ricerca che normalizzano i token durante le scritture, Spanner offre un'opzione per espandere la query di ricerca in modo da includere forme diverse di parole. Per ulteriori informazioni, consulta Modalità di query avanzata.
  • Le parole comuni (ad es. "a") sono incluse nell'indice di ricerca.
  • La ricerca a testo intero è sempre insensibile alle maiuscole. Il processo di tokenizzazione converte tutti i token in minuscolo.

Il processo di tokenizzazione tiene traccia delle posizioni di ciascun token nel testo originale. Queste posizioni vengono successivamente utilizzate per trovare le corrispondenze con le frasi. Le posizioni vengono memorizzate nell'indice di ricerca insieme ai docid.

Google continua a migliorare gli algoritmi di tokenizzazione. In alcuni casi, questo potrebbe portare alla tokenizzazione di una stringa in modo diverso in futuro rispetto a come avviene ora. Prevediamo che questi casi siano estremamente rari. Un esempio è rappresentato da un miglioramento della segmentazione in base alla lingua per cinese, giapponese e coreano (CJK).

L'argomento content_type specifica se il formato dei contenuti utilizza testo normale o HTML. Utilizza le seguenti impostazioni per impostare content_type:

  • Per la tokenizzazione del testo, imposta l'argomento content_type su "text/plain". Si tratta dell'impostazione predefinita.
  • Per la tokenizzazione HTML, imposta l'argomento content_type su "text/html". Senza questo argomento, i tag HTML vengono trattati come punteggiatura. In modalità HTML, Spanner utilizza le heurismi per dedurre l'importanza del testo sulla pagina. Ad esempio, se il testo si trova in un'intestazione o le dimensioni del carattere. Gli attributi supportati per HTML includono small, medium, large, title e "link". Come la posizione, l'attributo viene memorizzato insieme al token nell'indice di ricerca. La tokenizzazione non crea token per i tag HTML.

Gli attributi dei token non influiscono sulla corrispondenza o sui risultati della funzione SEARCH o SEARCH_SUBSTRING. Vengono utilizzati solo per il ranking.

L'esempio seguente mostra come tokenizzare il testo:

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(...);

Raffinamento del rilevamento della lingua con l'argomento language_tag

Per impostazione predefinita, la tokenizzazione rileva automaticamente la lingua di input. Quando la lingua di input è nota, è possibile utilizzare un argomento language_tag per perfezionare questo comportamento:

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

La maggior parte delle applicazioni lascia l'argomento language_tag non specificato e si basa invece sul rilevamento automatico della lingua. La segmentazione per le lingue asiatiche come cinese, coreano e giapponese non richiede l'impostazione della lingua di tokenizzazione.

Gli esempi seguenti mostrano i casi in cui language_tag influisce sulla tokenizzazione:

Funzione di tokenizzazione Token prodotti
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("旅 行") Due token: [旅, 行]
TOKENIZE_FULLTEXT("旅 行", language_tag=>"zh") Un token: [旅行]

Passaggi successivi