使用Python構(gòu)建可擴展的社交媒體情感分析服務(wù)
學(xué)習(xí)如何使用 spaCy、vaderSentiment、Flask 和 Python 來為你的作品添加情感分析能力。
本系列的***部分提供了情感分析工作原理的一些背景知識,現(xiàn)在讓我們研究如何將這些功能添加到你的設(shè)計中。
探索 Python 庫 spaCy 和 vaderSentiment
前提條件
- 一個終端 shell
- shell 中的 Python 語言二進(jìn)制文件(3.4+ 版本)
- 用于安裝 Python 包的
pip
命令 - (可選)一個 Python 虛擬環(huán)境使你的工作與系統(tǒng)隔離開來
配置環(huán)境
在開始編寫代碼之前,你需要安裝 spaCy 和 vaderSentiment 包來設(shè)置 Python 環(huán)境,同時下載一個語言模型來幫助你分析。幸運的是,大部分操作都容易在命令行中完成。
在 shell 中,輸入以下命令來安裝 spaCy 和 vaderSentiment 包:
pip install spacy vaderSentiment
命令安裝完成后,安裝 spaCy 可用于文本分析的語言模型。以下命令將使用 spaCy 模塊下載并安裝英語模型:
python -m spacy download en_core_web_sm
安裝了這些庫和模型之后,就可以開始編碼了。
一個簡單的文本分析
使用 Python 解釋器交互模式 編寫一些代碼來分析單個文本片段。首先啟動 Python 環(huán)境:
$ 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、導(dǎo)入所需模塊:
>>> 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、從處理后的結(jié)果中收集句子。SpaCy 已識別并處理短語中的實體,這一步為每個句子生成情感(即時在本例中只有一個句子):
>>> sentences = [str(s) for s in result.sents]
5、使用 vaderSentiments 創(chuàng)建一個分析器:
>>> analyzer = vaderSentiment.SentimentIntensityAnalyzer()
6、對句子進(jìn)行情感分析:
>>> sentiment = [analyzer.polarity_scores(str(s)) for s in sentences]
sentiment
變量現(xiàn)在包含例句的極性分?jǐn)?shù)。打印出這個值,看看它是如何分析這個句子的。
>>> print(sentiment)
[{'neg': 0.0, 'neu': 0.737, 'pos': 0.263, 'compound': 0.3612}]
這個結(jié)構(gòu)是什么意思?
表面上,這是一個只有一個字典對象的數(shù)組。如果有多個句子,那么每個句子都會對應(yīng)一個字典對象。字典中有四個鍵對應(yīng)不同類型的情感。neg
鍵表示負(fù)面情感,因為在本例中沒有報告任何負(fù)面情感,0.0
值證明了這一點。neu
鍵表示中性情感,它的得分相當(dāng)高,為 0.737
(***為 1.0
)。pos
鍵代表積極情感,得分適中,為 0.263
。***,cmpound
鍵代表文本的總體得分,它可以從負(fù)數(shù)到正數(shù),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}]
你可以看到,通過將例句改為非常積極的句子,sentiment
的值發(fā)生了巨大變化。
建立一個情感分析服務(wù)
現(xiàn)在你已經(jīng)為情感分析組裝了基本的代碼塊,讓我們將這些東西轉(zhuǎn)化為一個簡單的服務(wù)。
在這個演示中,你將使用 Python Flask 包 創(chuàng)建一個 RESTful HTTP 服務(wù)器。此服務(wù)將接受英文文本數(shù)據(jù)并返回情感分析結(jié)果。請注意,此示例服務(wù)是用于學(xué)習(xí)所涉及的技術(shù),而不是用于投入生產(chǎn)的東西。
前提條件
- 一個終端 shell
- shell 中的 Python 語言二進(jìn)制文件(3.4+ 版本)
- 安裝 Python 包的
pip
命令 curl
命令- 一個文本編輯器
- (可選) 一個 Python 虛擬環(huán)境使你的工作與系統(tǒng)隔離開來
配置環(huán)境
這個環(huán)境幾乎與上一節(jié)中的環(huán)境相同,唯一的區(qū)別是在 Python 環(huán)境中添加了 Flask 包。
1、安裝所需依賴項:
pip install spacy vaderSentiment flask
2、安裝 spaCy 的英語語言模型:
python -m spacy download en_core_web_sm
創(chuàng)建應(yīng)用程序文件
打開編輯器,創(chuàng)建一個名為 app.py
的文件。添加以下內(nèi)容 (不用擔(dān)心,我們將解釋每一行):
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)
雖然這個源文件不是很大,但它非常密集。讓我們來看看這個應(yīng)用程序的各個部分,并解釋它們在做什么。
import flask
import spacy
import vaderSentiment.vaderSentiment as vader
前三行引入了執(zhí)行語言分析和 HTTP 框架所需的包。
app = flask.Flask(__name__)
analyzer = vader.SentimentIntensityAnalyzer()
english = spacy.load("en_core_web_sm")
接下來的三行代碼創(chuàng)建了一些全局變量。***個變量 app
,它是 Flask 用于創(chuàng)建 HTTP 路由的主要入口點。第二個變量 analyzer
與上一個示例中使用的類型相同,它將用于生成情感分?jǐn)?shù)。***一個變量 english
也與上一個示例中使用的類型相同,它將用于注釋和標(biāo)記初始文本輸入。
你可能想知道為什么全局聲明這些變量。對于 app
變量,這是許多 Flask 應(yīng)用程序的標(biāo)準(zhǔn)過程。但是,對于 analyzer
和 english
變量,將它們設(shè)置為全局變量的決定是基于與所涉及的類關(guān)聯(lián)的加載時間。雖然加載時間可能看起來很短,但是當(dāng)它在 HTTP 服務(wù)器的上下文中運行時,這些延遲會對性能產(chǎn)生負(fù)面影響。
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
這部分是服務(wù)的核心 —— 一個用于從一串文本生成情感值的函數(shù)。你可以看到此函數(shù)中的操作對應(yīng)于你之前在 Python 解釋器中運行的命令。這里它們被封裝在一個函數(shù)定義中,text
源作為文本變量傳入,*** sentiments
變量返回給調(diào)用者。
@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)
源文件的***一個函數(shù)包含了指導(dǎo) Flask 如何為服務(wù)配置 HTTP 服務(wù)器的邏輯。它從一行開始,該行將 HTTP 路由 /
與請求方法 POST
和 GET
相關(guān)聯(lián)。
在函數(shù)定義行之后,if
子句將檢測請求方法是否為 GET
。如果用戶向服務(wù)發(fā)送此請求,那么下面的行將返回一條指示如何訪問服務(wù)器的文本消息。這主要是為了方便最終用戶。
下一行使用 flask.request
對象來獲取請求的主體,該主體應(yīng)包含要處理的文本字符串。decode
函數(shù)將字節(jié)數(shù)組轉(zhuǎn)換為可用的格式化字符串。經(jīng)過解碼的文本消息被傳遞給 get_sentiments
函數(shù)以生成情感分?jǐn)?shù)。***,分?jǐn)?shù)通過 HTTP 框架返回給用戶。
你現(xiàn)在應(yīng)該保存文件,如果尚未保存,那么返回 shell。
運行情感服務(wù)
一切就緒后,使用 Flask 的內(nèi)置調(diào)試服務(wù)器運行服務(wù)非常簡單。要啟動該服務(wù),請從與源文件相同的目錄中輸入以下命令:
FLASK_APP=app.py flask run
現(xiàn)在,你將在 shell 中看到來自服務(wù)器的一些輸出,并且服務(wù)器將處于運行狀態(tài)。要測試服務(wù)器是否正在運行,你需要打開第二個 shell 并使用 curl
命令。
首先,輸入以下命令檢查是否打印了指令信息:
curl http://localhost:5000
你應(yīng)該看到說明消息:
To access this service send a POST request to this URI with the text you want analyzed in the body.
接下來,運行以下命令發(fā)送測試消息,查看情感分析:
curl http://localhost:5000 --header "Content-Type: application/json" --data "I love applesauce!"
你從服務(wù)器獲得的響應(yīng)應(yīng)類似于以下內(nèi)容:
[{"compound": 0.6696, "neg": 0.0, "neu": 0.182, "pos": 0.818}]
恭喜!你現(xiàn)在已經(jīng)實現(xiàn)了一個 RESTful HTTP 情感分析服務(wù)。你可以在 GitHub 上找到此服務(wù)的參考實現(xiàn)和本文中的所有代碼。
繼續(xù)探索
現(xiàn)在你已經(jīng)了解了自然語言處理和情感分析背后的原理和機制,下面是進(jìn)一步發(fā)現(xiàn)探索該主題的一些方法。
在 OpenShift 上創(chuàng)建流式情感分析器
雖然創(chuàng)建本地應(yīng)用程序來研究情緒分析很方便,但是接下來需要能夠部署應(yīng)用程序以實現(xiàn)更廣泛的用途。按照Radnaalytics.io 提供的指導(dǎo)和代碼進(jìn)行操作,你將學(xué)習(xí)如何創(chuàng)建一個情感分析儀,可以容器化并部署到 Kubernetes 平臺。你還將了解如何將 Apache Kafka 用作事件驅(qū)動消息傳遞的框架,以及如何將 Apache Spark 用作情緒分析的分布式計算平臺。
使用 Twitter API 發(fā)現(xiàn)實時數(shù)據(jù)
雖然 Radanalytics.io 實驗室可以生成合成推文流,但你可以不受限于合成數(shù)據(jù)。事實上,擁有 Twitter 賬戶的任何人都可以使用 Tweepy Python 包訪問 Twitter 流媒體 API 對推文進(jìn)行情感分析。