Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

介紹

本文介紹瞭如何構建一個基於Python和Flask的web應用程序,用於在互聯網資源(比如博客頁面)上執行文本分析。為了執行文本分析,我將使用Requests獲取web頁面,使用BeautifulSoup解析html和提取可視文本,並應用TextBlob包來計算一些情感得分。本文的代碼託管在GitHub上,所以請復刻並使用它進行試驗。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

TextBlob情感分析基礎

TextBlob Python包是自然語言工具包(NLTK)庫的一個包裝器,目的是抽象其複雜性。

使用TextBlob與實例化TextBlob主類一樣簡單,你只需要向它傳入要分析的文本數據。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

基本的TextBlob對象有一個名為情感(sentiment)的命名元組字段,它本身有兩個字段: 極性和主觀性。這兩個字段都是情感的數值測量,極性在-1到1之間,-1表示語言上是消極的句子,值達到+1時被認為語言上是積極的句子,值為0時表示語言上是中性的句子。主觀性字段的範圍是從0表示客觀情感到1表示主觀或固執己見。sentalizer演示應用程序將報告頁面總情感的這些值。

對於上面的例子來說,這就是它的總情感。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

TextBlob還會將情感分解為更細的粒度級別,比如句子甚至單個單詞。實際上,TextBlob類有一個名為句子的列表字段,其中包含一個 Sentence對象的集合。Sentence 對象與TextBlob類本身非常相似,只不過它只表示句子,而不表示整個文檔。與TextBlob一樣, Sentence 對象也有一個情感命名元組和一個名為words的Word對象集合。該sentalizer應用會對Sentence對象集合進行評估,並找出極性最強和最不強的句子,以及最客觀和最主觀的句子。

下面是前一個示例的情感值。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

TextBlob包中包含了很多的功能,我鼓勵讀者在優秀的TextBlob文檔中去發現這些功能,並進行進一步的實驗,但是,我在這裡只演示在文檔和句子級別情感的用法。

Flask 應用程序開發本地環境設置

首先,創建一個Python3虛擬環境,激活它,然後安裝所需的庫。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

激活虛擬環境(Windows)

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

激活虛擬環境(Mac / Linux)

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

安裝Python包

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

獲取Text Blob (NLTK)語料庫文件

NLTK語料庫文件用於指導文本數據的評估。此命令將在用戶的主目錄中名為nltk_data的目錄中安裝語料庫數據文件。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

構建Flask Sentalizer文本分析應用程序

安裝了必要的Python庫和支持數據文件後,我開始構建應用程序,首先創建一個名為sentalizer的應用程序包,然後在我最喜歡的文本編輯器/ IDE,Visual Studio Code,中打開它。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

我添加了一個將目錄轉換為包的 __init__.py模塊。在 __init__.py模塊中,我創建了一個應用程序工廠函數,用於創建Flask應用程序的實例,如官方Flask文檔中所示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

首先,我想通過運行flask開發服務器來測試設置,並確保在進一步深入之前可以從瀏覽器中訪問它。

運行開發服務器 (Mac / Linux)

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

運行開發服務器 (Windows)

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

我將瀏覽器指向http://127.0.0.1:5000,顯示如下。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

顯然這並不令人興奮,所以我將繼續。接下來,我將在sentializer包中添加兩個新的目錄。一個目錄名為templates,用於存放Jinja HTML模板。另一個目錄名為static,它包含一個名為Bulma的CSS框架,用於去掉單調的HTML外觀。下面是tree命令的輸出,所以你可以看到我在做什麼。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

我首先構建base.html模板,它是另外兩個頁面的主佈局。這個base.html模板引用了bulma css的源代碼,並創建了一個導航條,其中包含一個指向主頁路徑的logo鏈接。此外,我使用{% block %}語法定義了兩個Jinja代碼塊部分。這些代碼塊用於通過index.html和results.html模板來將標題和主要內容注入其中,這些模板將擴展base.html。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

注意為模板構建資源的引用URI路徑所使用的url_for(…)模板過濾器。此模板過濾器函數可用於所有模板的上下文。這裡我使用它來引用bulma css文件。另一個值得注意的部分是圍繞url_for函數的部分,此

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

內插大括號用於計算Python代碼並將其內容輸出到相應位置。還有一種使用大括號的插值構造,

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

它與程序控制語言元素一起使用。

接下來,我將構建index.html模板,首先從擴展base.html模板開始,使用extends模板上下文幫助器跟著用引號括起來的base.html文件的名稱來完成。然後,我為標題和主區塊提供了一個實現。現在標題就包含一個段落元素,主塊包含一個佔位符註釋,稍後我將在其中添加一個表單和一個用於收集網頁url的輸入字段,以及一個提交按鈕。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

我對results.html模板做了類似的處理,它最終將顯示一系列塊,每個塊都包含一個計算出的情感值,用於提交的url頁面的文本分析輸出。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

這是模板的一個良好開端,因此,我將繼續讓Flask應用程序提供index.html和results.html模板。回到前面的__init__ .py模塊中,我從將要使用的Flask包中添加了一些常見的導入。我現在要關注的導入是render_template函數, 我將使用它來加載index.html模板,該模板將被處理並作為html返回。當/ url被請求時,Flask應用程序將返回所有這些內容。下面是更新後的__init__ .py模塊。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

保存了__init__ .py模塊之後,如果開發服務器仍在運行,Flask開發服務器應該會重新加載自己,否則就需要重新啟動。重新加載指向http://127.0.0.1:5000/的瀏覽器,現在會顯示如下內容。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

現在,我可以創建一個新的route(路由)和視圖函數來提供result.html模板。為此,我在@app.route('/results')裝飾器下面定義了一個名為results(…)的新函數,並類似地使用render_template來返回results.html模板。但是,這需要在裝飾器中進行一個更改,使其只接受POST請求方法,如下所示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

新引入的results()視圖函數需要一個名為url的表單字段,它可以由我之前從flask包中導入的全局請求對象上的表單字典字段進行檢索。我還添加了一些註釋來描述執行文本分析所需的程序流,然後再次使用了render_template函數,但是使用了一個新的關鍵字參數page_results,目前它只是一個空字典。

現在我有了一個/results路由來POST(請求)一個url,因此,我可以向index.html添加一個表單。注意,在下面的表單元素中,我再次使用了url_for(…)方法,但這次我提供了一個名為“results”的參數,它是view_function函數的名稱,用於我希望將表單數據POST到的路由。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

該應用程序能夠接受一個代表頁面的url來對其實執行情感分析,所以,我現在可以來實現文本分析功能。正如我在results(…)視圖函數註釋中已經提到的,首先需要使用已POST的url來獲取該頁面。為此,我導入了requests庫,並使用url來調用requests.get(…)方法。這是一個使用未驗證url發出的HTTP請求,該url可能指向或不指向一個真實的web資源,因此,引發異常是很有可能的。如果一個異常被捕獲,應用程序會向用戶顯示一條錯誤消息。

為了顯示錯誤消息,我將通過前邊從Flask包中導入的flash方法來使用消息閃爍功能。此外,我需要給應用程序一個密鑰,因為消息閃爍用到了session,該session過程需要在應用程序實例的配置字典中設置一個秘鑰,如下所示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

現在,如果由於web頁面沒有成功返回而引發異常,應用程序就會調用flash(…)方法,並將用戶重定向到index.html頁面。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

要在此UI中看到閃爍的消息,我們還需要做一些工作。在base.html中的上面,在消息註釋下面,我添加了一個{% with…%}模板塊,用於調用get_flashed_messages模板函數(對所有模板都可用),並將返回的集合分配給一個messages變量。然後對該messages變量進行遍歷並顯示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

下一步是從bs4包中導入BeautifulSoup類,以及從textblob包中導入TextBlob類。假設一個網頁被成功獲取,程序控制通過try / except部分進行傳遞,返回的內容被解析為一個BeautifulSoup對象中的可查詢的文檔對象模型(DOM)表示形式,並被分配給一個soup變量。h1元素或者頁面標題(如果h1不存在的話)會在將所有可視化文本傳給TextBlob之前被從soup變量中提取,然後在其實例化期間被分配給一個名為blob的變量。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

收集了所有必要的數據後,我現在可以查詢TextBlob對象的字段來顯示頁面的整體情感以及頁面包含的各種句子的傾向性。為此,我將創建一個名為PageSentiment的自定義Python類型或類,它將維護關於一個頁面的url、標題、總體情感以及具有最高情感得分的句子的信息。我將PageSentiment類放在create_app函數上方,如下所示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

現在剩下的是在results.html模板中顯示提交的url頁面的情感信息。為此,我將PageSentiment類對象page_results中的每條信息進行分組,並通過bulma tile組件中的render_template頁面傳遞給results.html模板,如下所示。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

下面是在thecodinginterface.com上運行第一篇名為《Django Authentication Part 1: Sign Up, Login, Logout》的博客文章的輸出。

Python中使用Flask、BS4和TextBlob構建一個文本分析應用程序

進一步學習Python、Flask 和Webscraping的一些資源

  • 使用Python進行Web爬取: 《從現代Web收集更多數據》是一本關於Web爬取的好書,它演示瞭如何使用BeautifulSoup從Web頁面中提取內容。
  • Miguel Grinberg的新編寫的Flask Web 開發: 《使用Python開發Web應用》是迄今為止市場上質量很好的Flask書籍。

結論

在本文中,我演示瞭如何使用Flask構建一個簡單的基於Python的web應用程序,該程序會使用Requests、BeautifulSoup和TextBlob包獲取web頁面並對其執行文本分析。我很感謝你的跟進,並希望本文對你來說既有用又有趣。在後續文章中,我將展示如何集成Redis和Celery來實現後臺異步任務去獲取和分析頁面,以及如何將此應用程序部署到一個雲端的虛擬專用服務器中。

英文原文:https://thecodinginterface.com/blog/text-analytics-app-with-flask-and-textblob/


分享到:


相關文章: