情感分析教程

受众

本教程旨在让您快速开始通过 Cloud Natural Language API 探索和开发应用它专为熟悉基本编程的人设计,但即使没有太多编程知识,您也应该能够按照说明操作。阅读完本教程后,您应该能够根据参考文档创建您自己的基本应用。

本教程介绍使用 Python 代码的 Natural Language API 应用。但我们的目的不是解说 Python 客户端库,而是说明如何调用 Natural Language API。Java 和 Node.js 中的应用本质上是相似的。请参阅 Natural Language API 示例,获取其他语言的示例(包括本教程中的示例)。

前提条件

本教程有几个前提条件:

分析文档情感

本教程引导您使用对文本执行情感分析的 analyzeSentiment 请求完成基本的 Natural Language API 应用。情感分析试图确定文本中表达的整体态度(积极还是消极),并用数字 scoremagnitude 值表示。(如需详细了解这些概念,请参阅 Natural Language 基础知识。)

我们首先显示整个代码。(请注意,我们已从该代码中删除了大多数注释,以便向您展示它的简短程度。在解说代码的过程中,我们将提供更多注释。)

如需详细了解如何安装和使用 Python 版 Google Cloud Natural Language 客户端库,请参阅 Natural Language API 客户端库
"""Demonstrates how to make a simple call to the Natural Language API."""

import argparse

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

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('Sentence {} has a sentiment score of {}'.format(
            index, sentence_sentiment))

    print('Overall Sentiment: score of {} with magnitude of {}'.format(
        score, magnitude))
    return 0

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

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

    document = types.Document(
        content=content,
        type=enums.Document.Type.PLAIN_TEXT)
    annotations = client.analyze_sentiment(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)

此简单的应用执行以下任务:

  • 导入运行应用所需的库
  • 接收一个文本文件并将其传递给 main() 函数
  • 读取文本文件并向服务发出请求
  • 解析服务的响应并将其显示给用户

我们将在下面更详细地介绍这些步骤。

导入库

如需详细了解如何安装和使用 Python 版 Google Cloud Natural Language 客户端库,请参阅 Natural Language API 客户端库
import argparse

from google.cloud import language
from google.cloud.language import enums
from google.cloud.language import types

我们导入 argparse(标准库),以允许应用接受输入文件名作为参数。

为了使用 Cloud Natural Language API,我们还需要从 google-cloud-language 库中导入 language 模块。types 模块包含创建请求所需的类。

运行应用

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)

此时,我们简单解析传递的文本文件名参数并将其传递给 analyze() 函数。

向 API 进行身份验证

与 Natural Language API 服务进行通信之前,您需要使用先前获得的凭据来验证您的服务。在应用中,获取凭据的最简单方法是使用应用默认凭据 (ADC)。默认情况下,ADC 将尝试从 GOOGLE_APPLICATION_CREDENTIALS 环境文件获取凭据,该文件应设置为指向您的服务帐号的 JSON 密钥文件。(您应该已在快速入门中设置了您的服务帐号和环境以使用 ADC。如需了解详情,请参阅设置服务帐号。)

适用于 Python 的 Google Cloud 客户端库自动使用应用默认凭据。

发出请求

由于我们的 Natural Language API 服务现已就绪,因此我们可以通过调用 LanguageServiceClient 实例的 analyze_sentiment 方法来访问该服务。

客户端库封装了对 API 请求和响应的详细信息。有关此类请求具体结构的完整信息,请参阅 Natural Language API 参考

如需详细了解如何安装和使用 Python 版 Google Cloud Natural Language 客户端库,请参阅 Natural Language API 客户端库
def analyze(movie_review_filename):
    """Run a sentiment analysis request on text within a passed filename."""
    client = language.LanguageServiceClient()

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

    document = types.Document(
        content=content,
        type=enums.Document.Type.PLAIN_TEXT)
    annotations = client.analyze_sentiment(document=document)

    # Print the results
    print_result(annotations)

此代码段执行以下任务:

  1. LanguageServiceClient 实例作为客户端实例化。
  2. 将包含文本数据的文件名读入一个变量。
  3. 借助文件内容实例化 Document 对象。
  4. 调用客户端的 analyze_sentiment 方法。

解析响应

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('Sentence {} has a sentiment score of {}'.format(
            index, sentence_sentiment))

    print('Overall Sentiment: score of {} with magnitude of {}'.format(
        score, magnitude))
    return 0

我们处理响应以提取每个句子的情感 score 值,以及整个评论的整体 scoremagnitude 值,并将这些值显示给用户。

运行示例

为了运行我们的示例,我们将对电影“Bladerunner”的一组(假)电影评论进行测试。

  1. 从 Google Cloud Storage 下载示例:

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

    gsutil 通常作为 Cloud SDK 一部分进行安装。如需安装最新版本的 Cloud SDK,请参阅 Cloud SDK 文档

  2. 解压缩这些示例,这将创建一个“评论”文件夹:

    gunzip sentiment-samples.tgz
    tar -xvf sentiment-samples.tar
    
  3. 对其中一个指定文件运行我们的情感分析:

    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
    

上面的例子表明评论相对积极(分数为 0.5)且相对情绪化(量级为 5.5)。

对其他示例运行分析应产生类似于下面所示的值:

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

请注意,除了“中性”情况外,这些量级都是相似的(表示情绪上重要的情感量相对平等)。中性则表示评论没有太多情绪化的感情,无论是正面还是负面。(有关情绪分数和量级以及如何解读这些值的更多信息,请参阅解读情感分析值。)

如果您想通过更多数据来探索情感分析,可以使用斯坦福大学提供的 IMDB 电影评论数据集。要检索这些电影评论:

  1. 下载大电影评论数据集
  2. 将文件解压缩到您的工作目录中。电影评论分别位于 traintest 数据目录的 posneg 目录中,其中每个文本文件都包含一篇电影评论。
  3. 对任一电影评论文本文件运行 sentiment_analysis.py 工具。

恭喜!您已使用 Google Cloud Natural Language API 执行了您的第一个推理任务!