From f0ad57a4e3037a2be5861b1758a04ddf082dece9 Mon Sep 17 00:00:00 2001 From: "Xingyu.Wang" Date: Fri, 17 May 2019 23:53:11 +0800 Subject: [PATCH] PRF:20190419 Building scalable social media sentiment analysis services in Python.md @MjSeven --- ...a sentiment analysis services in Python.md | 127 ++++++++++-------- 1 file changed, 70 insertions(+), 57 deletions(-) diff --git a/translated/tech/20190419 Building scalable social media sentiment analysis services in Python.md b/translated/tech/20190419 Building scalable social media sentiment analysis services in Python.md index a216ce8495..1df844139d 100644 --- a/translated/tech/20190419 Building scalable social media sentiment analysis services in Python.md +++ b/translated/tech/20190419 Building scalable social media sentiment analysis services in Python.md @@ -1,6 +1,6 @@ [#]: collector: (lujun9972) [#]: translator: (MjSeven) -[#]: reviewer: ( ) +[#]: reviewer: (wxy) [#]: publisher: ( ) [#]: url: ( ) [#]: subject: (Building scalable social media sentiment analysis services in Python) @@ -9,8 +9,10 @@ 使用 Python 构建可扩展的社交媒体情感分析服务 ====== -学习如何使用 spaCy、vaderSentiment、Flask 和 Python 来为你的工作添加情感分析能力。 -![Tall building with windows][1] + +> 学习如何使用 spaCy、vaderSentiment、Flask 和 Python 来为你的作品添加情感分析能力。 + +![Tall building with windows](https://img.linux.net.cn/data/attachment/album/201905/17/235241zr0cs4czu4psmrl6.jpg) 本系列的[第一部分][2]提供了情感分析工作原理的一些背景知识,现在让我们研究如何将这些功能添加到你的设计中。 @@ -20,7 +22,7 @@ * 一个终端 shell * shell 中的 Python 语言二进制文件(3.4+ 版本) - * 用于安装 Python 包的 **pip** 命令 + * 用于安装 Python 包的 `pip` 命令 * (可选)一个 [Python 虚拟环境][3]使你的工作与系统隔离开来 #### 配置环境 @@ -53,33 +55,44 @@ Type "help", "copyright", "credits" or "license" for more information. >>> ``` -_(你的 Python 解释器版本打印可能与此不同。)_ +*(你的 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] - ``` +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] +``` `sentiment` 变量现在包含例句的极性分数。打印出这个值,看看它是如何分析这个句子的。 @@ -90,7 +103,7 @@ _(你的 Python 解释器版本打印可能与此不同。)_ 这个结构是什么意思? -表面上,这是一个只有一个字典对象的数组。如果有多个句子,那么每个句子都会对应一个字典对象。字典中有四个键对应不同类型的情感。**neg** 键表示负面情感,因为在本例中没有报告任何负面情感,**0.0** 值证明了这一点。**neu** 键表示中性情感,它的得分相当高,为**0.737**(最高为 **1.0**)。**pos** 键代表积极情感,得分适中,为 **0.263**。最后,**cmpound** 键代表文本的总体得分,它可以从负数到正数,**0.3612** 表示积极方面的情感多一点。 +表面上,这是一个只有一个字典对象的数组。如果有多个句子,那么每个句子都会对应一个字典对象。字典中有四个键对应不同类型的情感。`neg` 键表示负面情感,因为在本例中没有报告任何负面情感,`0.0` 值证明了这一点。`neu` 键表示中性情感,它的得分相当高,为 `0.737`(最高为 `1.0`)。`pos` 键代表积极情感,得分适中,为 `0.263`。最后,`cmpound` 键代表文本的总体得分,它可以从负数到正数,`0.3612` 表示积极方面的情感多一点。 要查看这些值可能如何变化,你可以使用已输入的代码做一个小实验。以下代码块显示了如何对类似句子的情感评分的评估。 @@ -113,9 +126,9 @@ _(你的 Python 解释器版本打印可能与此不同。)_ #### 前提条件 * 一个终端 shell - * shell 中的 Python 语言二进制文件(3.4+版本) - * 安装 Python 包的 **pip** 命令 - * **curl** 命令 + * shell 中的 Python 语言二进制文件(3.4+ 版本) + * 安装 Python 包的 `pip` 命令 + * `curl` 命令 * 一个文本编辑器 * (可选) 一个 [Python 虚拟环境][3]使你的工作与系统隔离开来 @@ -123,19 +136,21 @@ _(你的 Python 解释器版本打印可能与此不同。)_ 这个环境几乎与上一节中的环境相同,唯一的区别是在 Python 环境中添加了 Flask 包。 - 1. 安装所需依赖项: - ``` - pip install spacy vaderSentiment flask - ``` -2. 安装 spaCy 的英语语言模型: - ``` - python -m spacy download en_core_web_sm - ``` +1、安装所需依赖项: +``` +pip install spacy vaderSentiment flask +``` + +2、安装 spaCy 的英语语言模型: + +``` +python -m spacy download en_core_web_sm +``` #### 创建应用程序文件 -打开编辑器,创建一个名为 **app.py** 的文件。添加以下内容 _(不用担心,我们将解释每一行)_ : +打开编辑器,创建一个名为 `app.py` 的文件。添加以下内容 *(不用担心,我们将解释每一行)*: ``` @@ -179,10 +194,9 @@ analyzer = vader.SentimentIntensityAnalyzer() english = spacy.load("en_core_web_sm") ``` -接下来的三行代码创建了一些全局变量。第一个变量 **app**,它是 Flask 用于创建 HTTP 路由的主要入口点。第二个变量 **analyzer** 与上一个示例中使用的类型相同,它将用于生成情感分数。最后一个变量 **english** 也与上一个示例中使用的类型相同,它将用于注释和标记初始文本输入。 - -你可能想知道为什么全局声明这些变量。对于 **app** 变量,这是许多 Flask 应用程序的标准过程。但是,对于 **analyzer** 和 **english** 变量,将它们设置为全局变量的决定是基于与所涉及的类关联的加载时间。虽然加载时间可能看起来很短,但是当它在 HTTP 服务器的上下文中运行时,这些延迟会对性能产生负面影响。 +接下来的三行代码创建了一些全局变量。第一个变量 `app`,它是 Flask 用于创建 HTTP 路由的主要入口点。第二个变量 `analyzer` 与上一个示例中使用的类型相同,它将用于生成情感分数。最后一个变量 `english` 也与上一个示例中使用的类型相同,它将用于注释和标记初始文本输入。 +你可能想知道为什么全局声明这些变量。对于 `app` 变量,这是许多 Flask 应用程序的标准过程。但是,对于 `analyzer` 和 `english` 变量,将它们设置为全局变量的决定是基于与所涉及的类关联的加载时间。虽然加载时间可能看起来很短,但是当它在 HTTP 服务器的上下文中运行时,这些延迟会对性能产生负面影响。 ``` def get_sentiments(text): @@ -192,8 +206,7 @@ def get_sentiments(text): return sentiments ``` -这部分是服务的核心 -- 一个用于从一串文本生成情感值的函数。你可以看到此函数中的操作对应于你之前在 Python 解释器中运行的命令。这里它们被封装在一个函数定义中,**text** 源作为文本变量传入,最后 **sentiments** 变量返回给调用者。 - +这部分是服务的核心 —— 一个用于从一串文本生成情感值的函数。你可以看到此函数中的操作对应于你之前在 Python 解释器中运行的命令。这里它们被封装在一个函数定义中,`text` 源作为文本变量传入,最后 `sentiments` 变量返回给调用者。 ``` @app.route("/", methods=["POST", "GET"]) @@ -206,11 +219,11 @@ def index(): return flask.json.dumps(sentiments) ``` -源文件的最后一个函数包含了指导 Flask 如何为服务配置 HTTP 服务器的逻辑。它从一行开始,该行将 HTTP 路由 **/** 与请求方法 **POST** 和 **GET** 相关联。 +源文件的最后一个函数包含了指导 Flask 如何为服务配置 HTTP 服务器的逻辑。它从一行开始,该行将 HTTP 路由 `/` 与请求方法 `POST` 和 `GET` 相关联。 -在函数定义行之后,**if** 子句将检测请求方法是否为 **GET**。如果用户向服务发送此请求,那么下面的行将返回一条指示如何访问服务器的文本消息。这主要是为了方便最终用户。 +在函数定义行之后,`if` 子句将检测请求方法是否为 `GET`。如果用户向服务发送此请求,那么下面的行将返回一条指示如何访问服务器的文本消息。这主要是为了方便最终用户。 -下一行使用 **flask.request** 对象来获取请求的主体,该主体应包含要处理的文本字符串。**decode** 函数将字节数组转换为可用的格式化字符串。经过解码的文本消息被传递给 **get_sentiments** 函数以生成情感分数。最后,分数通过 HTTP 框架返回给用户。 +下一行使用 `flask.request` 对象来获取请求的主体,该主体应包含要处理的文本字符串。`decode` 函数将字节数组转换为可用的格式化字符串。经过解码的文本消息被传递给 `get_sentiments` 函数以生成情感分数。最后,分数通过 HTTP 框架返回给用户。 你现在应该保存文件,如果尚未保存,那么返回 shell。 @@ -222,7 +235,7 @@ def index(): FLASK_APP=app.py flask run ``` -现在,你将在 shell 中看到来自服务器的一些输出,并且服务器将处于运行状态。要测试服务器是否正在运行,你需要打开第二个 shell 并使用 **curl** 命令。 +现在,你将在 shell 中看到来自服务器的一些输出,并且服务器将处于运行状态。要测试服务器是否正在运行,你需要打开第二个 shell 并使用 `curl` 命令。 首先,输入以下命令检查是否打印了指令信息: @@ -252,11 +265,11 @@ curl http://localhost:5000 --header "Content-Type: application/json" --data "I l ### 继续探索 -现在你已经了解了自然语言处理和情感分析背后的原理和机制,下面是进一步发现探索主题的一些方法。 +现在你已经了解了自然语言处理和情感分析背后的原理和机制,下面是进一步发现探索该主题的一些方法。 #### 在 OpenShift 上创建流式情感分析器 -虽然创建本地应用程序来研究情绪分析很方便,但是接下来需要能够部署应用程序以实现更广泛的用途。按照[ Radnaalytics.io][11] 提供的指导和代码进行操作,你将学习如何创建一个情感分析仪,可以集装箱化并部署到 Kubernetes 平台。你还将了解如何将 APache Kafka 用作事件驱动消息传递的框架,以及如何将 Apache Spark 用作情绪分析的分布式计算平台。 +虽然创建本地应用程序来研究情绪分析很方便,但是接下来需要能够部署应用程序以实现更广泛的用途。按照[Radnaalytics.io][11] 提供的指导和代码进行操作,你将学习如何创建一个情感分析仪,可以容器化并部署到 Kubernetes 平台。你还将了解如何将 Apache Kafka 用作事件驱动消息传递的框架,以及如何将 Apache Spark 用作情绪分析的分布式计算平台。 #### 使用 Twitter API 发现实时数据 @@ -266,17 +279,17 @@ curl http://localhost:5000 --header "Content-Type: application/json" --data "I l via: https://opensource.com/article/19/4/social-media-sentiment-analysis-python-scalable -作者:[Michael McCune ][a] +作者:[Michael McCune][a] 选题:[lujun9972][b] 译者:[MjSeven](https://github.com/MjSeven) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]: https://opensource.com/users/elmiko/users/jschlessman [b]: https://github.com/lujun9972 [1]: https://opensource.com/sites/default/files/styles/image-full-size/public/lead-images/windows_building_sky_scale.jpg?itok=mH6CAX29 (Tall building with windows) -[2]: https://opensource.com/article/19/4/social-media-sentiment-analysis-python-part-1 +[2]: https://linux.cn/article-10852-1.html [3]: https://virtualenv.pypa.io/en/stable/ [4]: https://pypi.org/project/spacy/ [5]: https://pypi.org/project/vaderSentiment/