Funciones de análisis de texto

GoogleSQL para BigQuery es compatible con las siguientes funciones de análisis de texto.

Lista de funciones

Nombre Resumen
BAG_OF_WORDS Obtiene la frecuencia de cada término (token) en un documento con token.
TEXT_ANALYZE Extrae términos (tokens) del texto y los convierte en un documento con asignación de token.
TF_IDF Evalúa qué tan relevante es un término (token) para un documento con asignación de token en un conjunto de documentos con asignación de token.

BAG_OF_WORDS

BAG_OF_WORDS(tokenized_document)

Definición

Obtiene la frecuencia de cada término (token) en un documento con token.

Definiciones

  • tokenized_document: el valor ARRAY<STRING> que representa un documento al que se le asignó un token. Un documento con asignación de token es una colección de términos (tokens), que se usan para el análisis de texto.

Tipo de datos que se muestra

ARRAY<STRUCT<term STRING, count INT64>>

Definiciones:

  • term: un término único en el documento con asignación de token.
  • count: Es la cantidad de veces que se encontró el término en el documento con asignación de token.

Ejemplos

La siguiente consulta produce términos y sus frecuencias en dos documentos con asignación de token:

WITH
  ExampleTable AS (
    SELECT 1 AS id, ['I', 'like', 'pie', 'pie', 'pie', NULL] AS f UNION ALL
    SELECT 2 AS id, ['yum', 'yum', 'pie', NULL] AS f
  )
SELECT id, BAG_OF_WORDS(f) AS results
FROM ExampleTable
ORDER BY id;

/*----+------------------------------------------------*
 | id | results                                        |
 +----+------------------------------------------------+
 | 1  | [(null, 1), ('I', 1), ('like', 1), ('pie', 3)] |
 | 2  | [(null, 1), ('pie', 1), ('yum', 2)]            |
 *----+------------------------------------------------*/

TEXT_ANALYZE

TEXT_ANALYZE(
  text
  [, analyzer=>{ 'LOG_ANALYZER' | 'NO_OP_ANALYZER' | 'PATTERN_ANALYZER' }]
  [, analyzer_options=>analyzer_options_values]
)

Descripción

Extrae términos (tokens) del texto y los convierte en un documento con asignación de token.

Definiciones

  • text: valor STRING que representa el texto de entrada para la asignación de tokens.
  • analyzer: Argumento con nombre obligatorio opcional que determina qué analizador usar para convertir text en un arreglo de términos (tokens). Puede ser:

    • 'LOG_ANALYZER' (predeterminado): Divide la entrada en términos cuando se encuentran delimitadores y, luego, normaliza los términos. Si no se especifica analyzer, se usa de forma predeterminada. Para obtener más información, consulta el analizador de texto de LOG_ANALYZER.

    • 'NO_OP_ANALYZER': Extrae el texto como un solo término (token), pero no aplica la normalización. Para obtener más información, consulta el analizador de texto de NO_OP_ANALYZER.

    • 'PATTERN_ANALYZER': Divide la entrada en términos que coinciden con una expresión regular. Para obtener más información, consulta Analizador de texto PATTERN_ANALYZER.

  • analyzer_options: Argumento con nombre obligatorio opcional que toma una lista de reglas de análisis de texto como una STRING con formato JSON. Para obtener más información, consulta Opciones del analizador de texto.

Detalles

No hay garantía sobre el orden de los tokens que produce esta función.

Si no se especifica ningún analizador, se usa el analizador LOG_ANALYZER de forma predeterminada.

Tipo de datos que se muestra

ARRAY<STRING>

Ejemplos

En la siguiente consulta, se usa el analizador de texto predeterminado, LOG_ANALYZER, con el texto de entrada:

SELECT TEXT_ANALYZE('I like pie, you like-pie, they like 2 PIEs.') AS results

/*--------------------------------------------------------------------------*
 | results                                                                  |
 +--------------------------------------------------------------------------+
 | ['i', 'like', 'pie', 'you', 'like', 'pie', 'they', 'like', '2', 'pies' ] |
 *--------------------------------------------------------------------------*/

En la siguiente consulta, se usa el analizador de texto NO_OP_ANALYZER con el texto de entrada:

SELECT TEXT_ANALYZE(
  'I like pie, you like-pie, they like 2 PIEs.',
  analyzer=>'NO_OP_ANALYZER'
) AS results

/*-----------------------------------------------*
 | results                                       |
 +-----------------------------------------------+
 | 'I like pie, you like-pie, they like 2 PIEs.' |
 *-----------------------------------------------*/

En la siguiente consulta, se usa el analizador de texto PATTERN_ANALYZER con el texto de entrada:

SELECT TEXT_ANALYZE(
  'I like pie, you like-pie, they like 2 PIEs.',
  analyzer=>'PATTERN_ANALYZER'
) AS results

/*----------------------------------------------------------------*
 | results                                                        |
 +----------------------------------------------------------------+
 | ['like', 'pie', 'you', 'like', 'pie', 'they', 'like', 'pies' ] |
 *----------------------------------------------------------------*/

Para ver ejemplos adicionales que incluyan opciones del analizador, consulta Análisis de texto.

Si deseas obtener recetas de analizador útiles que puedes usar para mejorar las consultas compatibles con el analizador, consulta Busca con los analizadores de texto.

TF_IDF

TF_IDF(tokenized_document) OVER()
TF_IDF(tokenized_document, max_distinct_tokens) OVER()
TF_IDF(tokenized_document, max_distinct_tokens, frequency_threshold) OVER()

Descripción

Evalúa qué tan relevante es un término para un documento con asignación de token en un conjunto de documentos con asignación de token mediante el algoritmo TF-IDF (frecuencia de documentos inversa de frecuencia).

Definiciones

  • tokenized_document: el valor ARRAY<STRING> que representa un documento al que se le asignó un token. Un documento con asignación de token es una colección de términos (tokens), que se usan para el análisis de texto.
  • max_distinct_tokens: Argumento opcional. Toma un valor INT64 no negativo, que representa el tamaño del diccionario, sin incluir el término desconocido.

    Las condiciones se agregan al diccionario hasta que se cumple este umbral. Por lo tanto, si este valor es 20, se agregan los primeros 20 términos únicos y, luego, no se agregan términos adicionales.

    Si no se proporciona este argumento, el valor predeterminado es 32000. Si se especifica este argumento, el valor máximo es 1048576.

  • frequency_threshold: Argumento opcional. Toma un valor INT64 no negativo que representa la cantidad mínima de veces que un término debe aparecer en un documento con asignación de token para que se incluya en el diccionario. Por lo tanto, si este valor es 3, un término debe aparecer al menos tres veces en el documento con asignación de token para que se lo agregue al diccionario.

    Si no se proporciona este argumento, el valor predeterminado es 5.

Detalles

Esta función usa un algoritmo de TF-IDF (frecuencia de documentos inversa de frecuencia) para calcular la relevancia de los términos en un conjunto de documentos con asignación de token. TF-IDF multiplica dos métricas: cuántas veces aparece un término en un documento (frecuencia de término) y la frecuencia de documento inversa del término en una colección de documentos (frecuencia de documento inversa).

  • TDIF:

    term frequency * inverse document frequency
    
  • Frecuencia de términos:

    (count of term in document) / (document size)
    
  • frecuencia de documento inversa:

    log(1 + document set size / (1 + count of documents containing term))
    

Los términos se agregan a un diccionario de términos si cumplen con los criterios para max_distinct_tokens y frequency_threshold; de lo contrario, se consideran término desconocido. El término desconocido siempre es el primer término del diccionario y se representa como NULL. El resto del diccionario está ordenado por frecuencia de términos en lugar de alfabéticamente.

Tipo de datos que se muestra

ARRAY<STRUCT<term STRING, tf_idf DOUBLE>>

Definiciones:

  • term: el término único que se agregó al diccionario.
  • tf_idf: El cálculo de TF-IDF del término.

Ejemplos

La siguiente consulta calcula la relevancia de hasta 10 términos que aparecen al menos dos veces en un conjunto de documentos con asignación de token. En este ejemplo, los argumentos con nombre se pasan de forma posicional. 10 representa max_distinct_tokens y 2 representa frequency_threshold:

WITH ExampleTable AS (
  SELECT 1 AS id, ['I', 'like', 'pie', 'pie', 'pie', NULL] AS f UNION ALL
  SELECT 2 AS id, ['yum', 'yum', 'pie', NULL] AS f UNION ALL
  SELECT 3 AS id, ['I', 'yum', 'pie', NULL] AS f UNION ALL
  SELECT 4 AS id, ['you', 'like', 'pie', 'too', NULL] AS f
)
SELECT id, TF_IDF(f, 10, 2) OVER() AS results
FROM ExampleTable
ORDER BY id;

/*----+-------------------------------------------------*
 | id | results                                         |
 +----+-------------------------------------------------+
 | 1  | [{"index":null,"value":"0.1304033435859887"},   |
 |    |  {"index":"I","value":"0.1412163100645339"},    |
 |    |  {"index":"like","value":"0.1412163100645339"}, |
 |    |  {"index":"pie","value":"0.29389333245105953"}] |
 +----+-------------------------------------------------+
 | 2  | [{"index":null,"value":"0.1956050153789831"},   |
 |    |  {"index":"pie","value":"0.14694666622552977"}, |
 |    |  {"index":"yum","value":"0.4236489301936017"}]  |
 +----+-------------------------------------------------+
 | 3  | [{"index":null,"value":"0.1956050153789831"},   |
 |    |  {"index":"I","value":"0.21182446509680086"},   |
 |    |  {"index":"pie","value":"0.14694666622552977"}, |
 |    |  {"index":"yum","value":"0.21182446509680086"}] |
 +----+-------------------------------------------------+
 | 4  | [{"index":null,"value":"0.4694520369095594"},   |
 |    |  {"index":"like","value":"0.1694595720774407"}, |
 |    |  {"index":"pie","value":"0.11755733298042381"}] |
 *----+-------------------------------------------------*/

La siguiente consulta calcula la relevancia de hasta tres términos que aparecen al menos una vez en un conjunto de documentos con asignación de token:

WITH ExampleTable AS (
  SELECT 1 AS id, ['I', 'like', 'pie', 'pie', 'pie', NULL] AS f UNION ALL
  SELECT 2 AS id, ['yum', 'yum', 'pie', NULL] AS f UNION ALL
  SELECT 3 AS id, ['I', 'yum', 'pie', NULL] AS f UNION ALL
  SELECT 4 AS id, ['you', 'like', 'pie', 'too', NULL] AS f
)
SELECT id, TF_IDF(f, 3, 2) OVER() AS results
FROM ExampleTable
ORDER BY id;

/*----+-------------------------------------------------*
 | id | results                                         |
 +----+-------------------------------------------------+
 | 1  | [{"index":null,"value":"0.12679902142647365"},  |
 |    |  {"index":"I","value":"0.1412163100645339"},    |
 |    |  {"index":"like","value":"0.1412163100645339"}, |
 |    |  {"index":"pie","value":"0.29389333245105953"}] |
 +----+-------------------------------------------------+
 | 2  | [{"index":null,"value":"0.5705955964191315"},   |
 |    |  {"index":"pie","value":"0.14694666622552977"}] |
 +----+-------------------------------------------------+
 | 3  | [{"index":null,"value":"0.380397064279421"},    |
 |    |  {"index":"I","value":"0.21182446509680086"},   |
 |    |  {"index":"pie","value":"0.14694666622552977"}] |
 +----+-------------------------------------------------+
 | 4  | [{"index":null,"value":"0.45647647713530515"},  |
 |    |  {"index":"like","value":"0.1694595720774407"}, |
 |    |  {"index":"pie","value":"0.11755733298042381"}] |
 *----+-------------------------------------------------*/