Analiza el sentimiento del texto

La función ai.analyze_sentiment es una herramienta de IA integrada de AlloyDB AI que clasifica el sentimiento del texto como positivo, negativo o neutral. Incorporando esta capacidad directamente en la base de datos, AlloyDB para PostgreSQL te permite aplicar la comprensión del lenguaje de Gemini a los datos empresariales no estructurados en tiempo real con SQL, lo que admite el procesamiento por lotes basado en arrays y cursores en miles de filas sin canalizaciones complejas de extracción, transformación y carga (ETL).

Puedes usar ai.analyze_sentiment para clasificar opiniones sobre productos y comentarios de clientes no estructurados, o bien analizar las menciones en redes sociales para evaluar la percepción de la marca.

Antes de comenzar

Asegúrate de cumplir con los siguientes requisitos antes de usar la función ai.analyze_sentiment.

Habilita la extensión

Asegúrate de tener instalada la versión más reciente de la extensión google_ml_integration.enable_preview_ai_functions (versión 1.5.7 o posterior) con la funcionalidad de vista previa habilitada.

Para habilitar la marca google_ml_integration.enable_preview_ai_functions en AlloyDB, usa el comando SET. Este parámetro controla el acceso a las funciones de IA en versión preliminar, como ai.analyze_sentiment.

  1. Asegúrate de que la extensión google_ml_integration sea la versión 1.6.1 o una posterior. Para verificar la versión, ejecuta lo siguiente:

    SELECT extversion FROM pg_extension WHERE extname = 'google_ml_integration';
    

    Si necesitas actualizar a una versión que incluya estas funciones de versión preliminar, llama a lo siguiente:

    CALL google_ml.upgrade_to_preview_version();
    
  2. Habilita la marca para la sesión actual o para toda la base de datos. Para habilitar la marca en tu sesión actual, ejecuta lo siguiente:

    SET google_ml_integration.enable_preview_ai_functions = 'on';
    

    Este cambio no requiere que se reinicie la base de datos. El valor predeterminado de esta marca es off.

Crea una tabla de ejemplo

Para seguir los ejemplos de la función de análisis de opiniones de este documento, crea una tabla y complétala con las siguientes opiniones de películas.

CREATE TABLE IF NOT EXISTS reviews (
    id INT PRIMARY KEY,
    review_content TEXT
);

INSERT INTO reviews (id, review_content) VALUES 
(1, 'This movie is very good'),
(2, 'The actors play the parts well'),
(3, 'I like the music in this film'),
(4, 'The story is easy to follow'),
(5, 'Many people will enjoy this show'),
(6, 'The film is too long'),
(7, 'I do not like the ending'),
(8, 'This movie is very boring'),
(9, 'The story is okay'),
(10, 'Some parts are fine');

Analiza el sentimiento de una sola cadena

Para evaluar la opinión de una sola entrada de texto, usa la versión escalar de ai.analyze_sentiment.

SELECT ai.analyze_sentiment(
  input => 'TEXT_CONTENT',
  model_id => 'MODEL_ID' -- Optional. The default value is gemini-3.5-flash-lite.
);

En el siguiente ejemplo, se muestra cómo realizar un análisis de opiniones a nivel de fila en los datos de texto almacenados en una tabla llamada reviews con las columnas id y review_content para almacenar datos de opiniones. En el ejemplo, se ejecuta una consulta SELECT que aplica la función ai.analyze_sentiment() a la columna review_content para cada fila de la tabla. Esta función procesa cada opinión de forma individual y devuelve la opinión calculada (positive, negative o neutral).

--- Row Level sentiment analysis
SELECT ai.analyze_sentiment(review_content) FROM reviews;

El siguiente es el resultado de ejemplo:

 id | analyze_sentiment
----+-------------------
  1 | positive
  2 | positive
  3 | positive
  4 | positive
  5 | positive
  6 | negative
  7 | negative
  8 | negative
  9 | neutral
 10 | neutral

Analiza opiniones en lotes

Para obtener un mejor rendimiento en conjuntos de datos más grandes, usa la versión basada en arrays de la función para procesar varias cadenas en una sola llamada.

SELECT ai.analyze_sentiment(
  inputs => ARRAY['TEXT_1', 'TEXT_2'],
  batch_size => BATCH_SIZE, -- Optional. The default value is 10.
  model_id => 'MODEL_ID' -- Optional. The default value is gemini-3.5-flash-lite.
);

En el siguiente ejemplo, se analiza la opinión de las opiniones de los clientes de una tabla llamada reviews.

WITH sentiment_results AS (
SELECT
  ARRAY_AGG(id ORDER BY id) as ids,
  ai.analyze_sentiment(
    inputs => array_agg( 'Please analyze the sentiment of this review: ' || review_content
      ORDER BY id),
    batch_size => 15) as sentiments 
FROM reviews
),
correlated_results AS (
    SELECT ids[i] as id, sentiments[i] as sentiment
    FROM sentiment_results,
    generate_series(1, array_length(ids, 1)) AS i
)
SELECT reviews.id, correlated_results.sentiment as sentiment
FROM reviews
JOIN correlated_results ON reviews.id = correlated_results.id
ORDER BY reviews.id DESC;

El siguiente es el resultado de ejemplo:

 id | sentiment
----+-----------
  1 | positive
  2 | positive
  3 | positive
  4 | positive
  5 | positive
  6 | negative
  7 | negative
  8 | negative
  9 | neutral
 10 | neutral

Analiza opiniones con cursores

La función basada en cursores está diseñada para procesar grandes conjuntos de datos de manera eficiente, ya que permite que el sistema transmita datos a través del modelo de IA en lotes manejables sin necesidad de que todos los datos se carguen en la memoria a la vez.

La firma de la función para la versión basada en cursores de ai.analyze_sentiment es la siguiente:

CREATE OR REPLACE FUNCTION ai.analyze_sentiment(
    input_cursor REFCURSOR,
    batch_size INT DEFAULT NULL,
    model_id VARCHAR(100) DEFAULT NULL)
  RETURNS REFCURSOR

Ahora puedes usar la función ai.analyze_sentiment. Como espera un REFCURSOR, debes abrir un cursor para los datos de entrada que quieres analizar. En este ejemplo, analizarás review_content de la tabla reviews.

En el siguiente ejemplo, se muestra cómo ingresar datos en la función ai.analyze_sentiment fila por fila con un cursor:

-- Run the cursor logic in an anonymous PL/pgSQL block
DO $$
DECLARE
    -- Declare a cursor for the review content
    review_cursor REFCURSOR;
    result_cursor REFCURSOR;
    result_record RECORD;
BEGIN
    -- Open the cursor with the query to fetch the review content
    OPEN review_cursor FOR SELECT review_content FROM reviews;

    -- Call the AI function, passing the cursor
    -- This function will return another cursor containing the results
    result_cursor := ai.analyze_sentiment(
            input_cursor => review_cursor,
        batch_size => 5  -- Optional: Process in batches of 5. The default value is 10.
    );

    -- Fetch and display results from the result_cursor
    LOOP
        FETCH result_cursor INTO result_record;
        EXIT WHEN NOT FOUND;
        RAISE NOTICE '%', result_record;
    END LOOP;

    -- Close the cursors
    CLOSE review_cursor;
    CLOSE result_cursor;
-- End the anonymous block
END $$;

Este es el resultado:

      review_content            | sentiment | score
------------------------------+-----------+-------
This movie is very good        | Positive  |   0.9
The actors play the parts well | Positive  |   0.8
I like the music in this film  | Positive  |   0.8
The story is easy to follow    | Positive  |   0.7
Many people will enjoy this show | Positive  |   0.8
The film is too long           | Negative  |  -0.6
I do not like the ending       | Negative  |  -0.8
This movie is very boring      | Negative  |  -0.9
The story is okay              | Neutral   |   0.1
Some parts are fine            | Neutral   |   0.2

¿Qué sigue?