使用 Python 構建可擴充套件的社交媒體情感分析服務
學習如何使用 spaCy、vaderSentiment、Flask 和 Python 來為你的作品新增情感分析能力。
本系列的第一部分提供了情感分析工作原理的一些背景知識,現在讓我們研究如何將這些功能新增到你的設計中。
探索 Python 庫 spaCy 和 vaderSentiment
前提條件
- 一個終端 shell
- shell 中的 Python 語言二進位制檔案(3.4+ 版本)
- 用於安裝 Python 包的
pip
命令 - (可選)一個 Python 虛擬環境使你的工作與系統隔離開來
配置環境
在開始編寫程式碼之前,你需要安裝 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 直譯器版本列印可能與此不同。)
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
變數現在包含例句的極性分數。列印出這個值,看看它是如何分析這個句子的。
>>> 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
。最後,cmpound
鍵代表文字的總體得分,它可以從負數到正數,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
的值發生了巨大變化。
建立一個情感分析服務
現在你已經為情感分析組裝了基本的程式碼塊,讓我們將這些東西轉化為一個簡單的服務。
在這個演示中,你將使用 Python Flask 包 建立一個 RESTful HTTP 伺服器。此服務將接受英文文字資料並返回情感分析結果。請注意,此示例服務是用於學習所涉及的技術,而不是用於投入生產的東西。
前提條件
- 一個終端 shell
- shell 中的 Python 語言二進位制檔案(3.4+ 版本)
- 安裝 Python 包的
pip
命令 curl
命令- 一個文字編輯器
- (可選) 一個 Python 虛擬環境使你的工作與系統隔離開來
配置環境
這個環境幾乎與上一節中的環境相同,唯一的區別是在 Python 環境中新增了 Flask 包。
1、安裝所需依賴項:
pip install spacy vaderSentiment flask
2、安裝 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 上建立流式情感分析器
雖然建立本地應用程式來研究情緒分析很方便,但是接下來需要能夠部署應用程式以實現更廣泛的用途。按照Radnaalytics.io 提供的指導和程式碼進行操作,你將學習如何建立一個情感分析儀,可以容器化並部署到 Kubernetes 平臺。你還將瞭解如何將 Apache Kafka 用作事件驅動訊息傳遞的框架,以及如何將 Apache Spark 用作情緒分析的分散式計算平臺。
使用 Twitter API 發現實時資料
雖然 Radanalytics.io 實驗室可以生成合成推文流,但你可以不受限於合成資料。事實上,擁有 Twitter 賬戶的任何人都可以使用 Tweepy Python 包訪問 Twitter 流媒體 API 對推文進行情感分析。
via: https://opensource.com/article/19/4/social-media-sentiment-analysis-python-scalable
作者:Michael McCune 選題:lujun9972 譯者:MjSeven 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
相關文章
- 使用 Python 進行社交媒體情感分析入門Python
- Django與微服務架構:構建可擴充套件的Web應用Django微服務架構套件Web
- 如何使用Zebee構建高度可擴充套件的分散式工作流中介軟體?套件分散式
- 簡要剖析:可擴充套件的微服務架構套件微服務架構
- 如何構建可控,可靠,可擴充套件的 PWA 應用套件
- 使用 Zephir 輕鬆構建 PHP 擴充套件PHP套件
- DoorDash使用 Kafka 和 Flink 構建可擴充套件的實時事件處理Kafka套件事件
- 讀構建可擴充套件分散式系統:方法與實踐15可擴充套件系統的基本要素套件分散式
- 使用 Postgres 的全文搜尋構建可擴充套件的事件驅動搜尋架構套件事件架構
- 讀構建可擴充套件分散式系統:方法與實踐09可擴充套件資料庫基礎套件分散式資料庫
- 使用 .NET Core 構建可擴充套件的實時資料處理系統套件
- Safari擴充套件 社交媒體干擾項隱藏:SocialFocus Hide Distractions for mac套件IDEMac
- 【軟體架構篇】常見可擴充套件模式架構套件模式
- 讀構建可擴充套件分散式系統:方法與實踐08微服務套件分散式微服務
- Django內建許可權擴充套件案例Django套件
- 使用ctypes來擴充套件Python套件Python
- 使用cython擴充套件python庫套件Python
- 可擴充套件性套件
- 微服務架構擴充套件FreeStyle微服務架構套件
- SPI擴充套件點在業務中的使用及原理分析套件
- 構建高可用性、高效能和可擴充套件的Zabbix Server架構套件Server架構
- [譯] 如何使用原生 JavaScript 構建簡單的 Chrome 擴充套件程式JavaScriptChrome套件
- 如何構建一個優雅擴充套件套件
- 可擴充套件的使用者表設計套件
- 谷歌的三大可擴充套件核心架構谷歌套件架構
- [擴充套件推薦] Laravel 多媒體上傳套件Laravel
- 日誌服務CLIETL-擴充套件UDF套件
- 基於 Golang 構建高可擴充套件的雲原生 PaaS(附 PPT 下載)Golang套件
- 能力可擴充套件 效果可評價! 360政企安全集團打造安全運營服務新體系套件
- 編寫可擴充套件程式套件
- [WCF許可權控制]透過擴充套件自行實現服務授權套件
- Pybind11和CMake構建python擴充套件模組環境搭建Python套件
- Python擴充套件C/C++ 實現原理分析Python套件C++
- 使用Kotlin擴充套件函式擴充套件Spring Data案例Kotlin套件函式Spring
- 微服務架構:自動擴充套件簡介微服務架構套件
- Activiti擴充套件的使用者任務屬性套件
- 使用 Cython 為 Python 編寫更快的 C 擴充套件Python套件
- 電信API:擴充套件服務和改善客戶體驗的關鍵IT工具API套件