本系列文章的第一部分介绍了一些情感分析的工作原理的背景知识。现在让我们研究如何将这些功能添加到您的设计中。
在 Python 中探索 spaCy 和 vaderSentiment
先决条件
- 终端 shell
- shell 中的 Python 语言二进制文件(版本 3.4+)
- 用于安装 Python 包的 pip 命令
- (可选)Python Virtualenv,用于将您的工作与系统隔离
配置您的环境
在开始编写代码之前,您需要通过安装 spaCy 和 vaderSentiment 包并下载语言模型来帮助您的分析,从而设置 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 解释器版本打印输出可能与此不同。)
- 导入必要的模块
>>> import spacy >>> from vaderSentiment import vaderSentiment
- 从 spaCy 加载英语语言模型
>>> english = spacy.load("en_core_web_sm")
- 处理一段文本。此示例显示了一个非常简单的句子,我们希望它返回略微积极的情感
>>> result = english("I like to eat applesauce with sugar and cinnamon.")
- 从处理结果中收集句子。SpaCy 已经识别并处理了短语中的实体;此步骤为每个句子生成情感(即使在此示例中只有一个句子)
>>> sentences = [str(s) for s in result.sents]
- 使用 vaderSentiments 创建分析器
>>> analyzer = vaderSentiment.SentimentIntensityAnalyzer()
- 对句子执行情感分析
>>> 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 包。
- 安装必要的依赖项
pip install spacy vaderSentiment flask
- 为 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 应用程序的标准过程。但是,对于 analyzer 和 english 变量,将其设为全局变量的决定是基于与所涉及的类相关的加载时间。虽然加载时间可能看起来很短,但当它在 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 路由 / 与请求方法 POST 和 GET 相关联。
在函数定义行之后,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 包对推文执行情感分析。
评论已关闭。