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路由/与请求方法POST和GET关联的行开头。
在函数定义行之后, 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用社交网络分析