Tutorial de análise de sentimento

Público-alvo

Este tutorial foi concebido para lhe permitir começar rapidamente a explorar e desenvolver aplicações com a Google Cloud Natural Language API. Foi concebido para pessoas com conhecimentos básicos de programação, embora, mesmo sem muitos conhecimentos de programação, deva conseguir acompanhar. Depois de seguir este tutorial, deve conseguir usar a documentação de referência para criar as suas próprias aplicações básicas.

Este tutorial explica passo a passo uma aplicação da API Natural Language com código Python. O objetivo aqui não é explicar as bibliotecas cliente Python, mas sim explicar como fazer chamadas para a API Natural Language. As aplicações em Java e Node.js são essencialmente semelhantes. Consulte os exemplos da API Natural Language para ver exemplos noutros idiomas (incluindo este exemplo no tutorial).

Pré-requisitos

Este tutorial tem vários pré-requisitos:

Analisar a sensação geral do documento

Este tutorial explica-lhe uma aplicação básica da API Natural Language, através de um pedido analyzeSentiment, que realiza a análise de sentimentos no texto. A análise de sentimentos tenta determinar a atitude geral (positiva ou negativa) e é representada por valores numéricos score e magnitude. (Para mais informações sobre estes conceitos, consulte o artigo Noções básicas de linguagem natural.)

Vamos mostrar primeiro o código completo. (Tenha em atenção que removemos a maioria dos comentários deste código para lhe mostrar como é breve. Vamos fornecer mais comentários à medida que analisamos o código.)

Para mais informações sobre a instalação e a utilização da biblioteca cliente da Google Cloud Natural Language para Python, consulte o artigo Bibliotecas cliente da API Natural Language.
"""Demonstrates how to make a simple call to the Natural Language API."""

import argparse

from google.cloud import language_v1



def print_result(annotations):
    score = annotations.document_sentiment.score
    magnitude = annotations.document_sentiment.magnitude

    for index, sentence in enumerate(annotations.sentences):
        sentence_sentiment = sentence.sentiment.score
        print(f"Sentence {index} has a sentiment score of {sentence_sentiment}")

    print(f"Overall Sentiment: score of {score} with magnitude of {magnitude}")
    return 0




def analyze(movie_review_filename):
    """Run a sentiment analysis request on text within a passed filename."""
    client = language_v1.LanguageServiceClient()

    with open(movie_review_filename) as review_file:
        # Instantiates a plain text document.
        content = review_file.read()

    document = language_v1.Document(
        content=content, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    annotations = client.analyze_sentiment(request={"document": document})

    # Print the results
    print_result(annotations)




if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "movie_review_filename",
        help="The filename of the movie review you'd like to analyze.",
    )
    args = parser.parse_args()

    analyze(args.movie_review_filename)

Esta aplicação simples realiza as seguintes tarefas:

  • Importa as bibliotecas necessárias para executar a aplicação
  • Recebe um ficheiro de texto e transmite-o à função main()
  • Lê o ficheiro de texto e faz um pedido ao serviço
  • Analisa a resposta do serviço e apresenta-a ao utilizador

Vamos rever estes passos mais detalhadamente abaixo.

Importar bibliotecas

Para mais informações sobre a instalação e a utilização da biblioteca cliente da Google Cloud Natural Language para Python, consulte o artigo Bibliotecas cliente da API Natural Language.
import argparse

from google.cloud import language_v1

Importamos argparse, uma biblioteca padrão, para permitir que a aplicação aceite nomes de ficheiros de entrada como argumentos.

Para usar a Cloud Natural Language API, também vamos querer importar o módulo language da biblioteca google-cloud-language. O módulo types contém classes necessárias para criar pedidos.

Executar a sua aplicação

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
    )
    parser.add_argument(
        "movie_review_filename",
        help="The filename of the movie review you'd like to analyze.",
    )
    args = parser.parse_args()

    analyze(args.movie_review_filename)

Aqui, analisamos simplesmente o argumento transmitido para o nome do ficheiro de texto e transmitimo-lo à função analyze().

Autenticação na API

Antes de comunicar com o serviço da API Natural Language, tem de autenticar o seu serviço através de credenciais adquiridas anteriormente. Numa aplicação, a forma mais simples de obter credenciais é usar as Credenciais padrão da aplicação (ADC). Por predefinição, o ADC tenta obter credenciais do ficheiro de ambiente GOOGLE_APPLICATION_CREDENTIALS, que deve ser definido para apontar para o ficheiro de chave JSON da sua conta de serviço. (Deve ter configurado a sua conta de serviço e ambiente para usar o ADC no guia de início rápido. Consulte o artigo Configurar uma conta de serviço para mais informações.)

A biblioteca cliente Google Cloud para Python usa automaticamente as credenciais predefinidas da aplicação.

Fazer o pedido

Agora que o nosso serviço da API Natural Language está pronto, podemos aceder ao serviço chamando o método analyze_sentiment da instância LanguageServiceClient.

A biblioteca de cliente encapsula os detalhes dos pedidos e das respostas à API. Consulte a Referência da API Natural Language para ver informações completas sobre a estrutura específica de tal pedido.

Para mais informações sobre a instalação e a utilização da biblioteca cliente da Google Cloud Natural Language para Python, consulte o artigo Bibliotecas cliente da API Natural Language.
def analyze(movie_review_filename):
    """Run a sentiment analysis request on text within a passed filename."""
    client = language_v1.LanguageServiceClient()

    with open(movie_review_filename) as review_file:
        # Instantiates a plain text document.
        content = review_file.read()

    document = language_v1.Document(
        content=content, type_=language_v1.Document.Type.PLAIN_TEXT
    )
    annotations = client.analyze_sentiment(request={"document": document})

    # Print the results
    print_result(annotations)

Este fragmento do código realiza as seguintes tarefas:

  1. Instancia uma instância LanguageServiceClient como cliente.
  2. Lê o nome do ficheiro que contém os dados de texto numa variável.
  3. Instancia um objeto Document com o conteúdo do ficheiro.
  4. Chama o método analyze_sentiment do cliente.

A analisar a resposta

def print_result(annotations):
    score = annotations.document_sentiment.score
    magnitude = annotations.document_sentiment.magnitude

    for index, sentence in enumerate(annotations.sentences):
        sentence_sentiment = sentence.sentiment.score
        print(f"Sentence {index} has a sentiment score of {sentence_sentiment}")

    print(f"Overall Sentiment: score of {score} with magnitude of {magnitude}")
    return 0

Analisamos a resposta para extrair os valores de score para cada frase e os valores gerais de score e magnitude para toda a crítica, e apresentamos esses valores ao utilizador.

Execute a amostra

Para executar a nossa amostra, vamos testá-la num conjunto de críticas de filmes (falsas) para o filme "Blade Runner".

  1. Transfira os exemplos do Google Cloud Storage:

    gcloud storage cp gs://cloud-samples-tests/natural-language/sentiment-samples.tgz .
    

    Para instalar a versão mais recente da CLI do Google Cloud, consulte a documentação da CLI gcloud.

  2. Descompacte essas amostras, o que cria uma pasta "reviews":

    gunzip sentiment-samples.tgz
    tar -xvf sentiment-samples.tar
    
  3. Execute a nossa análise de sentimentos num dos ficheiros especificados:

    python sentiment_analysis.py reviews/bladerunner-pos.txt
    Sentence 0 has a sentiment score of 0.8
    Sentence 1 has a sentiment score of 0.9
    Sentence 2 has a sentiment score of 0.8
    Sentence 3 has a sentiment score of 0.2
    Sentence 4 has a sentiment score of 0.1
    Sentence 5 has a sentiment score of 0.4
    Sentence 6 has a sentiment score of 0.3
    Sentence 7 has a sentiment score of 0.4
    Sentence 8 has a sentiment score of 0.2
    Sentence 9 has a sentiment score of 0.9
    Overall Sentiment: score of 0.5 with magnitude of 5.5
    

O exemplo acima indica uma crítica relativamente positiva (classificação de 0.5) e relativamente emocional (magnitude de 5.5).

A execução da análise nos outros exemplos deve produzir valores semelhantes aos mostrados abaixo:

python sentiment_analysis.py reviews/bladerunner-neg.txt
...
Overall Sentiment: score of -0.6 with magnitude of 3.3

python sentiment_analysis.py reviews/bladerunner-mixed.txt
...
Overall Sentiment: score of 0 with magnitude of 4.7

python sentiment_analysis.py reviews/bladerunner-neutral.txt
...
Overall Sentiment: score of -0.1 with magnitude of 1.8

Tenha em atenção que as magnitudes são todas semelhantes (o que indica uma quantidade relativamente igual de sentimento emocional significativo), exceto no caso de "neutro", que indica uma crítica com pouco sentimento emocional, seja positivo ou negativo. (Para mais informações sobre as classificações de sentimento e a magnitude, e como interpretar estes valores, consulte o artigo Interpretar os valores da análise de sentimentos.)

Se quiser explorar a análise de sentimentos com mais dados, Stanford disponibiliza um conjunto de dados de críticas de filmes do IMDB. Para aceder a estas críticas de filmes:

  1. Transfira o conjunto de dados de críticas de filmes grandes.
  2. Descomprima o ficheiro no diretório de trabalho. As críticas de filmes estão divididas em diretórios pos e neg nos diretórios de dados train e test, com cada ficheiro de texto a conter uma crítica de filme.
  3. Execute a ferramenta sentiment_analysis.py em qualquer um dos ficheiros de texto de críticas de filmes.

Parabéns! Realizou as suas primeiras tarefas de inferência com a API Google Cloud Natural Language!