python用社交网络分析

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

在Python中探索spaCy和vaderSentiment

先决条件

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

配置环境

在开始编写代码之前,您需要通过安装spaCy和vaderSentiment软件包并下载语言模型来协助您的分析来设置Python环境。 值得庆幸的是,大多数这些操作相对容易从命令行完成。

在您的外壳中,键入以下命令以安装spaCy和vaderSentiment软件包:

pip install spacy vaderSentiment 
pip install spacy vaderSentiment

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

python -m spacy download en_core_web_sm 
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
>>> english = spacy. load ( "en_core_web_sm" ) 
>>> english = spacy. load ( "en_core_web_sm" )
>>> result = english ( "I like to eat applesauce with sugar and cinnamon." ) 
>>> result = english ( "I like to eat applesauce with sugar and cinnamon." )
>>> sentences = [ str ( s ) for s in result. sents ] 
>>> sentences = [ str ( s ) for s in result. sents ]
>>> analyzer = vaderSentiment. SentimentIntensityAnalyzer ( ) 
>>> analyzer = vaderSentiment. SentimentIntensityAnalyzer ( )
>>> sentiment = [ analyzer. polarity_scores ( str ( s ) ) for s in sentences ] 
>>> 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 。 最后, 复合键代表文本的总分。 得分范围从负到正,范围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中的Python语言二进制文件(版本3.4+)。
  • 用于安装Python软件包的pip命令
  • curl命令
  • 文字编辑器
  • (可选) Python Virtualenv使您的工作与系统隔离

配置环境

这种环境与上一节中的环境几乎相同。 唯一的区别是向Python添加了Flask软件包。

pip install spacy vaderSentiment flask 
pip install spacy vaderSentiment flask
python -m spacy download en_core_web_sm 
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应用程序的标准过程。 但是,对于分析器英语变量,决定是否使其成为全局变量是基于与所涉及类相关的加载时间。 尽管加载时间可能看起来很小,但是当它在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解释器中运行的命令相对应。 在这里,它们被包装在一个函数定义中,其中源文本作为变量文本传递,最后将情感变量返回给调用者。

@ 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对象获取请求的正文,该正文应包含要处理的文本字符串。 解码功能会将字节数组转换为可用的格式化字符串。 现在,已解码的文本消息将传递到get_sentiments函数,以生成情感分数。 最后,分数通过HTTP框架返回给用户。

现在您应该保存文件(如果尚未保存),然后返回到Shell。

运行情感服务

一切就绪后,使用Flask的内置调试服务器即可轻松运行服务。 要启动服务,请从与源文件相同的目录中输入以下命令:

FLASK_APP = app. py flask run 
FLASK_APP = app. py flask run

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

首先,通过输入以下命令来检查说明消息是否已打印:

curl http://localhost: 5000 
curl http://localhost: 5000

您应该看到说明消息:

To access this service send a POST request to this URI with the text you want analyzed in the body. 
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!" 
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 } ] 
[ { "compound" : 0.6696 , "neg" : 0.0 , "neu" : 0.182 , "pos" : 0.818 } ]

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

继续探索

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

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

创建本地应用程序以探索情绪分析是一个方便的第一步,而具有部署应用程序以更广泛使用的功能则是一个强大的下一步。 通过遵循Radanalytics.io上该讲习班中的说明和代码,您将学习如何创建可被容器化并部署到Kubernetes平台的情感分析器。 您还将看到如何将Apache Kafka用作事件驱动消息传递的框架,以及如何将Apache Spark用作情绪分析的分布式计算平台。

使用Twitter API发现实时数据

尽管Radanalytics.io实验室生成了要发送的合成推文,但您不仅限于合成数据。 实际上,拥有Twitter帐户的任何人都可以使用Tweepy Python软件包访问Twitter流API并在推文上执行情感分析。

翻译自: https://opensource.com/article/19/4/social-media-sentiment-analysis-python-scalable

python用社交网络分析