使用 Python 构建可扩展的社交媒体情感分析服务

了解如何使用 spaCy、vaderSentiment、Flask 和 Python 为您的工作添加情感分析功能。
134 位读者喜欢这篇文章。

本系列文章的第一部分介绍了一些情感分析的工作原理的背景知识。现在让我们研究如何将这些功能添加到您的设计中。

在 Python 中探索 spaCy 和 vaderSentiment

先决条件

  • 终端 shell
  • shell 中的 Python 语言二进制文件(版本 3.4+)
  • 用于安装 Python 包的 pip 命令
  • (可选)Python Virtualenv,用于将您的工作与系统隔离

配置您的环境

在开始编写代码之前,您需要通过安装 spaCyvaderSentiment 包并下载语言模型来帮助您的分析,从而设置 Python 环境。值得庆幸的是,其中大部分都相对容易从命令行完成。

在您的 shell 中,键入以下命令以安装 spaCy 和 vaderSentiment 包

pip install spacy vaderSentiment

命令完成后,安装 spaCy 可用于文本分析的语言模型。以下命令将使用 spaCy 模块下载并安装英语语言模型

python -m spacy download en_core_web_sm

安装了这些库和模型后,您现在可以开始编码了。

进行简单的文本分析

使用 Python 解释器交互模式 编写一些代码,用于分析单个文本片段。首先启动 Python 环境

$ python
Python 3.6.8 (default, Jan 31 2019, 09:38:34)
[GCC 8.2.1 20181215 (Red Hat 8.2.1-6)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

(您的 Python 解释器版本打印输出可能与此不同。)

  1. 导入必要的模块
    >>> import spacy
    >>> from vaderSentiment import vaderSentiment
  2. 从 spaCy 加载英语语言模型
    >>> english = spacy.load("en_core_web_sm")
  3. 处理一段文本。此示例显示了一个非常简单的句子,我们希望它返回略微积极的情感
    >>> result = english("I like to eat applesauce with sugar and cinnamon.")
  4. 从处理结果中收集句子。SpaCy 已经识别并处理了短语中的实体;此步骤为每个句子生成情感(即使在此示例中只有一个句子)
    >>> sentences = [str(s) for s in result.sents]
  5. 使用 vaderSentiments 创建分析器
    >>> analyzer = vaderSentiment.SentimentIntensityAnalyzer()
  6. 对句子执行情感分析
    >>> sentiment = [analyzer.polarity_scores(str(s)) for s in sentences]

情感变量现在包含示例句子的极性分数。打印出该值以查看它是如何分析句子的。

>>> print(sentiment)
[{'neg': 0.0, 'neu': 0.737, 'pos': 0.263, 'compound': 0.3612}]

此结构是什么意思?

从表面上看,这是一个包含单个字典对象的数组;如果有多个句子,则每个句子都会有一个字典。字典中有四个键,对应于不同类型的情感。neg 键表示负面情感,如 0.0 值所示,本文本中没有报告任何负面情感。neu 键表示中性情感,它获得了相当高的分数 0.737(最大值为 1.0)。pos 键表示正面情感,它的分数为中等 0.263。最后,compound 键表示文本的总体评分;它的值范围可以从负值到正值,其中值 0.3612 表示情感更偏向正面。

要查看这些值可能如何变化,您可以使用已输入的代码运行一个小实验。以下代码块演示了对类似句子的情感评分评估。

>>> result = english("I love applesauce!")
>>> sentences = [str(s) for s in result.sents]
>>> sentiment = [analyzer.polarity_scores(str(s)) for s in sentences]
>>> print(sentiment)
[{'neg': 0.0, 'neu': 0.182, 'pos': 0.818, 'compound': 0.6696}]

您可以看到,通过将示例句子更改为非常积极的内容,情感值发生了巨大变化。

构建情感分析服务

既然您已经组装了进行情感分析的基本构建块,那么让我们将这些知识转化为一个简单的服务。

对于此演示,您将使用 Python Flask 包创建一个 RESTful HTTP 服务器。此服务将接受英文文本数据并返回情感分析结果。请注意,此示例服务仅用于学习所涉及的技术,而不是用于生产环境。

先决条件

  • 终端 shell
  • shell 中的 Python 语言二进制文件(版本 3.4+)。
  • 用于安装 Python 包的 pip 命令
  • curl 命令
  • 文本编辑器
  • (可选)Python Virtualenv,用于将您的工作与系统隔离

配置您的环境

此环境与上一节中的环境几乎相同。唯一的区别是 Python 中添加了 Flask 包。

  1. 安装必要的依赖项
    pip install spacy vaderSentiment flask
  2. 为 spaCy 安装英语语言模型
    python -m spacy download en_core_web_sm

创建应用程序文件

打开编辑器并创建一个名为 app.py 的文件。将以下内容添加到其中(不用担心,我们将逐行查看)

import flask
import spacy
import vaderSentiment.vaderSentiment as vader

app = flask.Flask(__name__)
analyzer = vader.SentimentIntensityAnalyzer()
english = spacy.load("en_core_web_sm")


def get_sentiments(text):
    result = english(text)
    sentences = [str(sent) for sent in result.sents]
    sentiments = [analyzer.polarity_scores(str(s)) for s in sentences]
    return sentiments


@app.route("/", methods=["POST", "GET"])
def index():
    if flask.request.method == "GET":
        return "To access this service send a POST request to this URL with" \
               " the text you want analyzed in the body."
    body = flask.request.data.decode("utf-8")
    sentiments = get_sentiments(body)
    return flask.json.dumps(sentiments)

虽然这不是一个非常大的源文件,但它非常密集。让我们逐步了解此应用程序的各个部分,并描述它们正在做什么。

import flask
import spacy
import vaderSentiment.vaderSentiment as vader

前三行引入了执行语言分析和 HTTP 框架所需的包。

app = flask.Flask(__name__)
analyzer = vader.SentimentIntensityAnalyzer()
english = spacy.load("en_core_web_sm")

接下来的三行创建了一些全局变量。第一个变量 app 是 Flask 用于创建 HTTP 路由的主入口点。第二个变量 analyzer 与之前示例中使用的类型相同,它将用于生成情感分数。最后一个变量 english 也与之前示例中使用的类型相同,它将用于注释和标记初始文本输入。

您可能想知道为什么这些变量被声明为全局变量。对于 app 变量,这是许多 Flask 应用程序的标准过程。但是,对于 analyzerenglish 变量,将其设为全局变量的决定是基于与所涉及的类相关的加载时间。虽然加载时间可能看起来很短,但当它在 HTTP 服务器的上下文中运行时,这些延迟可能会对性能产生负面影响。

def get_sentiments(text):
    result = english(text)
    sentences = [str(sent) for sent in result.sents]
    sentiments = [analyzer.polarity_scores(str(s)) for s in sentences]
    return sentiments

下一部分是服务的核心——一个从文本字符串生成情感值的函数。您可以看到此函数中的操作对应于您之前在 Python 解释器中运行的命令。在这里,它们被包装在一个函数定义中,其中源 text 作为变量文本传入,最后将 sentiments 变量返回给调用者。

@app.route("/", methods=["POST", "GET"])
def index():
    if flask.request.method == "GET":
        return "To access this service send a POST request to this URL with" \
               " the text you want analyzed in the body."
    body = flask.request.data.decode("utf-8")
    sentiments = get_sentiments(body)
    return flask.json.dumps(sentiments)

源文件中的最后一个函数包含指示 Flask 如何为服务配置 HTTP 服务器的逻辑。它以一行开始,该行将 HTTP 路由 / 与请求方法 POSTGET 相关联。

在函数定义行之后,if 子句将检测请求方法是否为 GET。如果用户向服务发送此请求,则以下行将返回一条文本消息,指示如何访问服务器。这在很大程度上是为了方便最终用户而包含的。

下一行使用 flask.request 对象来获取请求的主体,其中应包含要处理的文本字符串。decode 函数会将字节数组转换为可用的格式化字符串。解码后的文本消息现在被传递给 get_sentiments 函数以生成情感分数。最后,分数通过 HTTP 框架返回给用户。

如果您尚未保存文件,则现在应该保存文件并返回到 shell。

运行情感服务

一切就绪后,使用 Flask 的内置调试服务器运行服务非常简单。要启动服务,请从源文件所在的同一目录输入以下命令

FLASK_APP=app.py flask run

您现在将在 shell 中看到服务器的一些输出,并且服务器将正在运行。要测试服务器是否正在运行,您需要打开第二个 shell 并使用 curl 命令。

首先,通过输入以下命令检查是否打印了指令消息

curl http://localhost:5000

您应该看到指令消息

To access this service send a POST request to this URI with the text you want analyzed in the body.

接下来,发送测试消息以查看情感分析,方法是运行以下命令

curl http://localhost:5000 --header "Content-Type: application/json" --data "I love applesauce!"

您从服务器获得的响应应类似于以下内容

[{"compound": 0.6696, "neg": 0.0, "neu": 0.182, "pos": 0.818}]

恭喜!您现在已经实现了一个 RESTful HTTP 情感分析服务。您可以在 GitHub 上找到此服务和本文所有代码的参考实现链接

继续探索

现在您已经了解了自然语言处理和情感分析背后的原理和机制,以下是一些进一步探索此主题的方法。

在 OpenShift 上创建流式情感分析器

虽然创建本地应用程序来探索情感分析是方便的第一步,但能够部署您的应用程序以供更广泛使用是强大的下一步。通过遵循来自 Radanalytics.io 的 workshop 中的说明和代码,您将学习如何创建一个可以容器化并部署到 Kubernetes 平台的情感分析器。您还将了解如何将 Apache Kafka 用作事件驱动消息传递的框架,以及如何将 Apache Spark 用作情感分析的分布式计算平台。

使用 Twitter API 发现实时数据

虽然 Radanalytics.io 实验室生成了合成推文以进行流式传输,但您并不限于合成数据。事实上,任何拥有 Twitter 帐户的人都可以访问 Twitter 流式 API,并使用 Tweepy Python 包对推文执行情感分析。

标签
Picture of Michael's face
Michael McCune 是 Red Hat 新兴技术部门的软件开发人员。他是多个 radanalytics.io 项目的积极贡献者,也是 OpenStack API 特殊兴趣小组的核心审阅者。自加入 Red Hat 以来,他一直在为云平台开发和部署应用程序。
User profile image.
Jason Schlessman 是 Red Hat 的数据科学家和机器学习工程师。自 2017 年加入 Red Hat 以来,他一直在开发可扩展的基于云的机器学习和数据科学解决方案。在加入 Red Hat 之前,Jason 开发了计算机视觉和传感器融合驱动的嵌入式系统,用于监控人类活动。

评论已关闭。

© . All rights reserved.