Effectuer une analyse sémantique avec des fonctions d'IA gérées
Ce tutoriel explique comment utiliser les fonctions d'IA gérées de BigQuery ML pour effectuer une analyse sémantique des commentaires des clients.
Objectifs
Dans ce tutoriel, vous allez :
- Créer un ensemble de données et charger des données de sentiment dans une table
- Utiliser les fonctions d'IA suivantes pour effectuer une analyse sémantique :
AI.IF: pour filtrer vos données avec des conditions en langage naturelAI.SCORE: pour évaluer l'entrée par sentimentAI.CLASSIFY: pour classer l'entrée dans des catégories définies par l'utilisateur
Coûts
Ce tutoriel fait appel à des composants payants de Google Cloud, y compris les suivants :
- BigQuery
- BigQuery ML
Pour en savoir plus sur le coût de BigQuery, consultez la page Tarifs de BigQuery.
Pour en savoir plus sur les coûts associés à BigQuery ML, consultez la page Tarifs de BigQuery ML.
Avant de commencer
- Connectez-vous à votre Google Cloud compte. Si vous débutez sur Google Cloud, créez un compte pour évaluer les performances de nos produits en conditions réelles. Les nouveaux clients bénéficient également de 300 $ de crédits sans frais pour exécuter, tester et déployer des charges de travail.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
If you're using an existing project for this guide, verify that you have the permissions required to complete this guide. If you created a new project, then you already have the required permissions.
-
Activez l'API BigQuery.
Rôles requis pour activer les API
Pour activer les API, vous avez besoin du rôle IAM Administrateur d'utilisation du service (
roles/serviceusage.serviceUsageAdmin), qui contient l'autorisationserviceusage.services.enable. Découvrez comment attribuer des rôles.Pour les nouveaux projets, l'API BigQuery est automatiquement activée.
- Facultatif : Activez la facturation pour le projet. Les étapes décrites dans ce document demeurent valables, même si vous ne souhaitez pas activer la facturation ou fournir une carte de crédit. BigQuery fournit un bac à sable permettant d'accomplir les étapes. Pour en savoir plus, consultez la page Activer le bac à sable BigQuery.
Rôles requis
Pour obtenir les autorisations nécessaires pour utiliser les fonctions d'IA, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet :
-
Exécuter des jobs de requête et des jobs de chargement :
Utilisateur de tâche BigQuery (
roles/bigquery.jobUser) -
Créer un ensemble de données, créer une table, charger des données dans une table et interroger une table :
Éditeur de données BigQuery (
roles/bigquery.dataEditor)
Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.
Vous pouvez également obtenir les autorisations requises avec des rôles personnalisés ou d'autres rôles prédéfinis.
Créer des exemples de données
Pour créer un ensemble de données appelé my_dataset pour ce tutoriel, exécutez la requête suivante.
CREATE SCHEMA my_dataset OPTIONS (location = 'LOCATION');
Créez ensuite une table appelée customer_feedback contenant des exemples d'avis de clients pour un appareil :
CREATE TABLE my_dataset.customer_feedback AS (
SELECT
*
FROM
UNNEST( [STRUCT<review_id INT64, review_text STRING>
(1, "The battery life is incredible, and the screen is gorgeous! Best phone I've ever had. Totally worth the price."),
(2, "Customer support was a nightmare. It took three weeks for my order to arrive, and when it did, the box was damaged. Very frustrating!"),
(3, "The product does exactly what it says on the box. No complaints, but not exciting either."),
(4, "I'm so happy with this purchase! It arrived early and exceeded all my expectations. The quality is top-notch, although the setup was a bit tricky."),
(5, "The price is a bit too high for what you get. The material feels cheap and I'm worried it won't last. Service was okay."),
(6, "Absolutely furious! The item arrived broken, and getting a refund is proving impossible. I will never buy from them again."),
(7, "This new feature for account access is confusing. I can't find where to update my profile. Please fix this bug!"),
(8, "The shipping was delayed, but the support team was very helpful and kept me informed. The product itself is great, especially for the price.")
])
);
Catégoriser le sentiment général
Il peut être utile d'extraire le sentiment général exprimé dans le texte pour prendre en charge des cas d'utilisation tels que les suivants :
- Mesurer la satisfaction client à partir des avis
- Surveiller la perception de la marque sur les réseaux sociaux
- Prioriser les demandes d'assistance en fonction du niveau de mécontentement des utilisateurs
La requête suivante montre comment utiliser la fonction AI.CLASSIFY pour classer
les avis de la table customer_feedback comme positifs, négatifs ou
neutres :
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => ['positive', 'negative', 'neutral']) AS sentiment
FROM
my_dataset.customer_feedback;
Le résultat doit ressembler à ce qui suit :
+-----------+------------------------------------------+-----------+ | review_id | review_text | sentiment | +-----------+------------------------------------------+-----------+ | 7 | This new feature for account access is | negative | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+-----------+ | 4 | "I'm so happy with this purchase! It | positive | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+-----------+ | 2 | "Customer support was a nightmare. It | negative | | | took three weeks for my order to | | | | arrive, and when it did, the box was | | | | damaged. Very frustrating!" | | +-----------+------------------------------------------+-----------+ | 1 | "The battery life is incredible, and | positive | | | the screen is gorgeous! Best phone I've | | | | ever had. Totally worth the price." | | +-----------+------------------------------------------+-----------+ | 8 | "The shipping was delayed, but the | positive | | | support team was very helpful and kept | | | | me informed. The product itself is | | | | great, especially for the price." | | +-----------+------------------------------------------+-----------+ | 5 | The price is a bit too high for what | negative | | | you get. The material feels cheap and | | | | I'm worried it won't last. Service was | | | | okay. | | +-----------+------------------------------------------+-----------+ | 3 | "The product does exactly what it says | neutral | | | on the box. No complaints, but not | | | | exciting either." | | +-----------+------------------------------------------+-----------+ | 6 | "Absolutely furious! The item arrived | negative | | | broken, and getting a refund is proving | | | | impossible. I will never buy from them | | | | again." | | +-----------+------------------------------------------+-----------+
Analyser le sentiment basé sur les aspects
Si un sentiment général tel que positif ou négatif ne suffit pas pour votre cas d'utilisation, vous pouvez analyser un aspect spécifique de la signification du texte. Par exemple, vous pouvez vouloir comprendre l'attitude d'un utilisateur envers la qualité du produit, sans tenir compte de ses réflexions sur son prix. Vous pouvez même demander une valeur personnalisée pour indiquer qu'un aspect particulier ne s'applique pas.
L'exemple suivant montre comment utiliser la fonction AI.SCORE pour évaluer le sentiment des utilisateurs de 1 à 10 en fonction du caractère favorable de chaque avis de la table customer_feedback concernant le prix, le service client et la qualité. La fonction renvoie la valeur personnalisée -1 dans les cas où un aspect n'est pas mentionné dans l'avis, afin que vous puissiez le filtrer ultérieurement.
SELECT
review_id,
review_text,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about PRICE for review: ", review_text,
"If price is not mentioned, return -1.0")) AS price_score,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about CUSTOMER SERVICE for review: ", review_text,
"If customer service is not mentioned, return -1.0")) AS service_score,
AI.SCORE(
("Score 0.0 to 10 on positive sentiment about QUALITY for review: ", review_text,
"If quality is not mentioned, return -1.0")) AS quality_score
FROM
my_dataset.customer_feedback
LIMIT 3;
Le résultat doit ressembler à ce qui suit :
+-----------+------------------------------------------+--------------+---------------+---------------+ | review_id | review_text | price_score | service_score | quality_score | +-----------+------------------------------------------+--------------+---------------+---------------+ | 4 | "I'm so happy with this purchase! It | -1.0 | -1.0 | 9.5 | | | arrived early and exceeded all my | | | | | | expectations. The quality is top-notch, | | | | | | although the setup was a bit tricky." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+ | 8 | "The shipping was delayed, but the | 9.0 | 8.5 | 9.0 | | | support team was very helpful and kept | | | | | | me informed. The product itself is | | | | | | great, especially for the price." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+ | 6 | "Absolutely furious! The item arrived | -1.0 | 1.0 | 0.0 | | | broken, and getting a refund is proving | | | | | | impossible. I will never buy from them | | | | | | again." | | | | +-----------+------------------------------------------+--------------+---------------+---------------+
Détecter les émotions
En plus du sentiment positif ou négatif, vous pouvez classer le texte en fonction d'émotions spécifiques que vous sélectionnez. Cela est utile lorsque vous souhaitez mieux comprendre les réponses des utilisateurs ou signaler les commentaires très émotionnels pour examen.
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => ['joy', 'anger', 'sadness', 'surprise', 'fear', 'disgust', 'neutral', 'other']
) AS emotion
FROM
my_dataset.customer_feedback;
Le résultat doit ressembler à ce qui suit :
+-----------+------------------------------------------+---------+ | review_id | review_text | emotion | +-----------+------------------------------------------+---------+ | 2 | "Customer support was a nightmare. It | anger | | | took three weeks for my order to | | | | arrive, and when it did, the box was | | | | damaged. Very frustrating!" | | +-----------+------------------------------------------+---------+ | 7 | This new feature for account access is | anger | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+---------+ | 4 | "I'm so happy with this purchase! It | joy | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+---------+ | 1 | "The battery life is incredible, and | joy | | | the screen is gorgeous! Best phone I've | | | | ever had. Totally worth the price." | | +-----------+------------------------------------------+---------+ | 8 | "The shipping was delayed, but the | joy | | | support team was very helpful and kept | | | | me informed. The product itself is | | | | great, especially for the price." | | +-----------+------------------------------------------+---------+ | 5 | The price is a bit too high for what | sadness | | | you get. The material feels cheap and | | | | I'm worried it won't last. Service was | | | | okay. | | +-----------+------------------------------------------+---------+ | 3 | "The product does exactly what it says | neutral | | | on the box. No complaints, but not | | | | exciting either." | | +-----------+------------------------------------------+---------+ | 6 | "Absolutely furious! The item arrived | anger | | | broken, and getting a refund is proving | | | | impossible. I will never buy from them | | | | again." | | +-----------+------------------------------------------+---------+
Catégoriser les avis par thème
Vous pouvez utiliser la fonction AI.CLASSIFY pour regrouper les avis dans des thèmes prédéfinis.
Par exemple, vous pouvez effectuer les opérations suivantes :
- Découvrir les thèmes courants dans les commentaires des clients
- Organiser les documents par sujet
- Acheminer les demandes d'assistance par thème
L'exemple suivant montre comment classer les commentaires des clients en différents types, tels que problème de facturation ou accès au compte, puis compter le nombre d'avis appartenant à chaque catégorie :
SELECT
AI.CLASSIFY(
review_text,
categories => ['Billing Issue', 'Account Access',
'Product Bug', 'Feature Request',
'Shipping Delay', 'Other']) AS topic,
COUNT(*) AS number_of_reviews,
FROM
my_dataset.customer_feedback
GROUP BY topic
ORDER BY number_of_reviews DESC;
Le résultat doit ressembler à ce qui suit :
+----------------+-------------------+ | topic | number_of_reviews | +----------------+-------------------+ | Other | 5 | | Shipping Delay | 2 | | Product Bug | 1 | +----------------+-------------------+
Identifier les avis sémantiquement similaires
Vous pouvez utiliser la fonction AI.SCORE pour évaluer le degré de similitude sémantique entre deux textes en lui demandant d'évaluer la similitude de signification. Cela peut vous aider à effectuer des tâches telles que les suivantes :
- Rechercher les entrées en double ou presque en double
- Regrouper les commentaires similaires
- Alimenter les applications de recherche sémantique
La requête suivante recherche les avis qui traitent des difficultés de configuration du produit :
SELECT
review_id,
review_text,
AI.SCORE(
(
"""How similar is the review to the concept of 'difficulty in setting up the product'?
A higher score indicates more similarity. Review: """,
review_text)) AS setup_difficulty
FROM my_dataset.customer_feedback
ORDER BY setup_difficulty DESC
LIMIT 2;
Le résultat doit ressembler à ce qui suit :
+-----------+------------------------------------------+------------------+ | review_id | review_text | setup_difficulty | +-----------+------------------------------------------+------------------+ | 4 | "I'm so happy with this purchase! It | 3 | | | arrived early and exceeded all my | | | | expectations. The quality is top-notch, | | | | although the setup was a bit tricky." | | +-----------+------------------------------------------+------------------+ | 7 | This new feature for account access is | 1 | | | confusing. I can't find where to update | | | | my profile. Please fix this bug! | | +-----------+------------------------------------------+------------------+
Vous pouvez également utiliser la fonction AI.IF pour rechercher les avis liés au texte :
SELECT
review_id,
review_text
FROM my_dataset.customer_feedback
WHERE
AI.IF(
(
"Does this review discuss difficulty setting up the product? Review: ",
review_text));
Combiner des fonctions
Il peut être utile de combiner ces fonctions dans une seule requête. Par exemple, la requête suivante filtre d'abord les avis pour détecter les sentiments négatifs, puis les classe par type de frustration :
SELECT
review_id,
review_text,
AI.CLASSIFY(
review_text,
categories => [
'Poor Quality', 'Bad Customer Service', 'High Price', 'Other Negative']) AS negative_topic
FROM my_dataset.customer_feedback
WHERE
AI.IF(
("Does this review express a negative sentiment? Review: ", review_text));
Créer des UDF d'invite réutilisables
Pour que vos requêtes restent lisibles, vous pouvez réutiliser votre logique d'invite en créant
des fonctions définies par l'utilisateur. La requête suivante crée une fonction permettant de détecter les sentiments négatifs en appelant AI.IF avec une invite personnalisée. Ensuite, elle appelle cette fonction pour filtrer par avis négatif.
CREATE OR REPLACE FUNCTION my_dataset.is_negative_sentiment(review_text STRING)
RETURNS BOOL
AS (
AI.IF(
("Does this review express a negative sentiment? Review: ", review_text))
);
SELECT
review_id,
review_text
FROM my_dataset.customer_feedback
WHERE my_dataset.is_negative_sentiment(review_text);
Libérer de l'espace
Pour éviter d'être facturé, vous pouvez supprimer le projet contenant les ressources que vous avez créées, ou conserver le projet et supprimer chaque ressource individuellement.
Supprimer votre projet
Pour supprimer le projet :
- Dans la Google Cloud console, accédez à la page Gérer les ressources.
- Dans la liste des projets, sélectionnez le projet que vous souhaitez supprimer, puis cliquez sur Supprimer.
- Dans la boîte de dialogue, saisissez l'ID du projet, puis cliquez Arrêter pour supprimer le projet.
Supprimer l'ensemble de données
Pour supprimer l'ensemble de données et toutes les ressources qu'il contient, y compris toutes les tables et fonctions, exécutez la requête suivante :
DROP SCHEMA my_dataset CASCADE;