如何使用自然語言工具包(NLTK)在Python3中執行情感分析

介紹

現如今生成的大量數據都是非結構化的,需要處理才能產生洞察力。非結構化數據的一些例子包括新聞文章、社交媒體上的帖子和搜索歷史。分析自然語言並從中獲得意義的過程屬於自然語言處理(NLP)領域。情感分析是一項常見的NLP任務,它涉及到將文本或部分文本歸類到一個預先定義的情感中。您將使用自然語言工具包(NLTK) ,Python中一個常用的NLP庫,來分析文本數據。

在本教程中,您將使用不同的數據清理方法為NLP準備一個來自NLTK包的示例推文數據集。一旦該數據集準備好進行處理,您將在預先分類的推文上訓練一個模型,並使用該模型將示例推文分類為負面和正面情感。

本文假設您熟悉Python的基礎知識(請參閱我們發的《如何使用Python 3進行編碼》系列教程),主要是數據結構、類和方法的使用。本教程假設您沒有NLP和nltk方面的背景知識,但是有一些這方面的知識是一個額外的優勢。

預備知識

  • 本教程是基於 Python 3.6.5版本。如果您還沒有安裝Python3,這裡有一個安裝和設置Python3的本地編程環境的指南。
  • 建議您對語言數據處理有一定的熟悉。如果您剛開始使用NLTK,請查看《如何使用自然語言工具包(NLTK)在Python 3中處理語言數據》指南。

步驟1 -安裝NLTK並下載數據

在本教程中,您將使用Python中的NLTK包處理所有的NLP任務。在此步驟中,您將安裝NLTK並下載將用於訓練和測試模型的示例推文。

首先,使用pip包管理器安裝NLTK包:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

本教程將使用作為NLTK包一部分的示例推文。首先,通過運行以下命令啟動一個Python交互式會話:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

然後,在Python解釋器中導入nltk模塊。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

從NLTK包下載示例推文:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

從Python解釋器中運行此命令在本地下載和存儲推文。一旦下載了示例,您就可以使用它們了。

在本教程的後面部分,您將使用負面和正面的推文來對您的模型進行情感分析訓練。沒有情感的推文將被用來測試您的模型。

如果您想使用自己的數據集,您可以使用Twitter API收集特定時間段、用戶或推文話題的推文。

既然您已經導入了NLTK並下載了示例推文,那麼您就可以輸入exit()來退出交互式會話。您現在已經準備好導入推文並開始處理數據了。

步驟2 -對數據進行詞性標記

原始形式的語言不能被機器精確地處理,所以您需要對語言進行處理,以便機器更容易理解。理解數據的第一部分是通過一個稱為詞性標記的過程,或者將字符串分割成稱為標記的更小的部分。

一個標記是文本中作為一個單元的字符序列。根據您創建標記的方式,它們可能由單詞、表情符號、推文話題、鏈接甚至單個字符組成。將語言分解為標記的一種基本方法是根據空格和標點符號分割文本。

首先,創建一個新的.py文件用於保存您的腳本。本教程將使用nlp_test.py:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在這個文件中,您首先要導入twitter_samples,以便您可以處理這些數據:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

這將從NLTK導入三個包含各種推文的數據集來訓練和測試模型:

  • negative_tweets.json: 5000條帶有負面情感的推文
  • positive_tweets.json: 5000條帶有正面情感的推文
  • tweets.20150430 - 223406.json: 20000條沒有情感的推文

接下來,創建positive_tweets、negative_tweets和text變量:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

twitter_samples的strings()方法將以字符串的形式打印出一個數據集中的所有推文。將不同的推文集合設置為一個變量將使得處理和測試過程變得更容易。

在NLTK中使用標記解析器之前,您需要下載一個額外的資源——punkt。punkt模塊是一個預先訓練好的模型,它可以幫助您標記解析單詞和句子。例如,這個模型知道一個名稱可能包含一個句點(比如“S. Daityari”),並且這個句點出現在一個句子裡並不一定就表示到此結束了。首先,啟動一個Python交互式會話:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在會話中運行以下命令來下載punkt資源:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下載完成後,您就可以使用NLTK的標記解析器了。NLTK使用.tokenized()方法為推文提供了一個默認的標記解析器。我們添加一行代碼來創建一個標記解析positive_tweets.json數據集的對象:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

如果您想測試腳本以實際查看.tokenized方法,您只需要將突出顯示的內容添加到您的nlp_test.py腳本中。這將標記解析來自positive_tweets.json數據集的一條推文:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

保存並關閉文件,然後運行該腳本:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

標記解析過程需要一些時間,因為它不是簡單地分割空格。經過幾分鐘的處理,您將看到以下內容:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在這裡,.tokenized()方法會返回特殊字符,比如@和_。本教程稍後部分將通過正則表達式刪除這些字符。

既然您已經瞭解了.tokenized()方法的工作方式,那麼請確保註釋掉或刪除腳本中打印標記推文的最後一行,在該行的開頭添加一個#:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

您的腳本現在被配置為標記解析數據了。在下一個步驟中,您將更新腳本以標準化數據。

步驟3 — 規範化數據

單詞有不同的形式——例如,“ran”、“runs”和“running”是同一個動詞“run”的不同形式。根據您的分析的需求,所有這些版本可能都需要被轉換為相同的形式,“run”。NLP中的規範化是將一個單詞轉換為其簡潔形式的過程。

規範化有助於將意思相同但形式不同的單詞歸類在一起。如果不進行規範化,“ran”、“runs”和“running”將被視為不同的單詞,即使您可能希望它們被視為相同的單詞。在本節中,您將探索詞幹提取和詞性還原,它們是規範化的兩種常用技術。

詞幹提取是去掉詞綴的過程。詞幹提取只使用簡單的動詞形式,是一個刪除詞尾的啟發式過程。

在本教程中,您將使用詞形還原的過程,它通過詞彙表和文本中單詞的形態學分析來規範化單詞。詞形還原算法會分析詞的結構及其上下文,並將其轉換為一個規範化的形式。因此,這是以速度為代價的。詞幹提取和詞形還原的比較最終歸結為速度和準確性之間的權衡。

在開始使用詞形還原之前,請在一個Python交互式會話中輸入以下內容下載必要的資源:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在Python會話中運行以下命令來下載資源:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

wordnet是一個英語詞彙數據庫,它可以幫助腳本確定詞幹。您需要averaged_perceptron_tagger資源來確定一個句子中單詞的上下文。

下載之後,您幾乎就可以使用詞形還原器了。在運行詞形還原器之前,您需要確定您的文本中每個單詞的上下文。這是通過一個標記算法實現的,該算法會評估一個單詞在句子中的相對位置。在一個Python會話中,導入pos_tag函數,並提供一個標記列表作為參數來獲取標籤。我們來在Python中試一下:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下面是pos_tag函數的輸出。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

以下是標籤列表中最常見的項目及其含義:

  • NNP: 專有名詞,單數形式
  • NN: 常用名詞,單數形式
  • IN: 介詞或從屬連詞
  • VBG: 動名詞和現在分詞
  • VBN: 過去分詞

這裡是該數據集的一個完整列表。(https://www.ling.upenn.edu/courses/Fall_2003/ling001/penn_treebank_pos.html )

一般來說,如果一個標籤以NN開頭,這個詞就是名詞,如果它以VB開頭,這個詞就是動詞。查看這些標籤之後,通過輸入exit()退出Python會話。

要將其合併到一個規範化句子的函數中,您應該首先為文本中的每個標記生成標籤,然後使用該標籤對每個單詞進行詞形還原。

使用下面的函數來更新nlp_test.py文件,該函數會對一個句子進行詞形還原:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

這段代碼導入了WordNetLemmatizer類並將其初始化給一個變量, lemmatizer。

lemmatize_sentence函數首先獲取一個推文的每個標記的位置標籤。在if語句塊中,如果標籤以NN開頭,則標記被指定為名詞。類似地,如果標籤以VB開頭,則標記被指定為動詞。

保存並關閉文件,然後運行該腳本:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下面是輸出:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

您會注意到動詞being變成了它的詞根形式,即be,名詞members變成了member。在繼續之前,請註釋掉腳本中打印示例推文的最後一行。

現在,您已經成功地創建了一個用於規範化單詞的函數,接下來就可以移除噪聲了。

步驟4 -從數據中移除噪聲

在此步驟中,您將從數據集中移除噪聲。噪聲是指文本中沒有對數據添加意義或信息的任何部分。

噪聲是特定於每個項目的,所以,在一個項目中構成噪聲的部分可能在一個不同的項目中並不構成噪聲。例如,一門語言中最常見的單詞被稱為停止詞。停止詞的例子有“is”、“the”和“a”。在處理語言時,它們通常是不相關的,除非特定的用例需要包含它們。

在本教程中,您將使用Python中的正則表達式來搜索和刪除這些項:

  • 超鏈接——Twitter中的所有超鏈接都被轉換為網址縮寫器t.co。因此,將它們保留在文本處理中不會給分析增加任何價值。
  • 回覆中的Twitter句柄——這些Twitter用戶名前面被放置了一個@符號,它沒有任何含義。
  • 標點符號和特殊字符——雖然這些通常對文本數據提供上下文,但這種上下文通常很難處理。為了簡單起見,您將從推文中刪除所有標點符號和特殊字符。

要刪除超鏈接,您需要首先搜索一個與以http://或https://開頭,後面跟著字母、數字或特殊字符的URL相匹配的子字符串。一旦匹配了一個模式,.sub()方法就會用一個空字符串替換它。

因為我們將在remove_noise()函數中規範化單詞形式,所以您可以從腳本中註釋掉lemmatize_sentence()函數。

將以下代碼添加到您的nlp_test.py文件中來從數據集中去除噪聲:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

這段代碼創建了一個remove_noise()函數,該函數會移除噪聲併合並前一節中提到的規範化和詞形還原過程。此代碼接受兩個參數:推文標記和停止詞組成的元組。

然後,此代碼會使用一個循環來從數據集中移除噪聲。要刪除超鏈接,此代碼首先會搜索一個與以http://或https://開頭,後跟字母、數字或特殊字符的URL相匹配的子字符串。一旦匹配到一個模式,.sub()方法就會用一個空字符串或’’替換它。

類似地,要刪除@提及,該代碼會使用正則表達式替換文本的相關部分。該代碼會使用re庫搜索@符號,後面跟著數字、字母或_,並用一個空字符串替換它們。

最後,您可以使用string庫刪除標點符號。

除此之外,您還將使用NLTK中內置的停止詞集來刪除停止詞,這個停止詞集需要單獨下載。

在一個Python交互式會話中執行以下命令來下載這個資源:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下載該資源後,退出交互式會話。

您可以使用.words()方法來獲得一個英語停止詞列表。要測試這個函數,讓我們在我們的示例推文上來運行它。在nlp_test.py文件的末尾添加以下行:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

保存並關閉該文件後,再次運行腳本以收到類似如下的輸出:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

注意,該函數刪除了所有的@提及、停止詞,並將這些單詞轉換為小寫。

在進行下一步的建模練習之前,我們使用remove_noise()函數來清理積極和消極的推文。註釋掉打印示例推文上的remove_noise()輸出的行,並將以下內容添加到nlp_test.py腳本中:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

現在您已經添加了清理示例推文的代碼,您可能想要比較一下一個示例推文的原始標記和清理後的標記。如果您想測試這個,將以下代碼添加到腳本文件中來比較示例推文列表中第500條推文的兩個版本:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

保存並關閉文件,然後運行該腳本。從輸出中您會看到標點符號和鏈接已經被刪除,單詞也已經被轉換為小寫了。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在文本預處理過程中可能會出現一些問題。例如,沒有空格的單詞(“iLoveYou”)將被視為一個單詞,而且將這些單詞分開會很困難。此外,該腳本會將“Hi”、“Hii”和“Hiiiii”當成不同的單詞看待,除非您編寫一些特定的東西來處理這個問題。對特定的數據的噪聲去除過程進行微調是很常見的。

現在您已經用實例查看了remove_noise()函數,請一定要註釋掉或者刪除腳本中的最後兩行,這樣您就可以向它添加更多的內容:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在這一步驟中,您從數據中移除了噪聲,以使分析更加有效。在下一個步驟中,您將對數據進行分析,從而找出您的示例數據集中最常見的單詞。

步驟5 -確定單詞密度

文本數據分析的最基本形式是提取單詞頻率。一個實體中的單個推文太小,無法找出單詞的分佈情況,因此,要對所有正面推文的單詞頻率進行分析。

下面的代碼段定義了一個名為get_all_words的生成器函數,該函數以一個推文列表作為參數,以提供一個將所有推文標記中的單詞結合起來的單詞列表。將以下代碼添加到您的nlp_test.py文件中:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

現在您已經編譯了推文示例中的所有單詞,您可以使用NLTK的FreqDist類找出最常見的單詞。將以下代碼添加到nlp_test.py文件中:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

.most_common()方法會列出數據中出現頻率最高的單詞。完成這些更改後保存並關閉文件。

當您現在運行文件時,您將會發現數據中最常見的詞語:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

從這個數據中,您可以看到emoticon實體構成了正面推文的一些最常見的部分。在繼續下一步驟之前,請確保您註釋掉了腳本中打印前10個標記的最後一行。

總結一下就是,您從nltk中提取了推文,對其進行標記化、規範化並進行了清理,以便在模型中使用。最後,您還查看了數據中標記的頻率,並檢查了前10個標記的頻率。

下一步,您將為情感分析準備數據。

步驟6 -為模型準備數據

情感分析是識別作者對所寫主題的一個態度的過程。您將創建一個訓練數據集來訓練一個模型。它是一個監督學習機器學習過程,要求您將每個數據集與一個“情感”相關聯來進行訓練。在本教程中,您的模型將使用“正面”和“負面”情感。

情感分析可用於將文本分類為各種情感。為了訓練數據集的簡單性和可用性,本教程僅使用正面和負面兩個類別來幫助您訓練您的模型。

模型是使用規則和方程對系統的描述。它可能是一個簡單的方程,根據身高預測一個人的體重。您將構建的情感分析模型將把推文與一個正面或負面情感聯繫起來。您需要將您的數據集分成兩部分。第一部分的目的是構建模型,而下一部分的目的是測試該模型的性能。

在數據準備步驟中,您將通過將標記轉換為字典形式來準備用於情緒分析的數據,然後將數據進行分割以用於訓練和測試目的。

將標記轉換為一個字典

首先,您將準備要輸入模型的數據。您將使用NLTK中的樸素貝葉斯分類器來執行建模練習。注意,該模型不僅需要一個推文中的單詞列表,還需要一個以單詞為鍵、以True為值的Python字典。下面的函數會創建一個生成器函數來更改已清理數據的格式。

添加以下代碼,將推文從一個已清理的標記列表轉換為以鍵作為標記、以True作為值的字典。對應的字典被存儲在positive_tokens_for_model和negative_tokens_for_model中。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

分割數據集以訓練和測試模型

接下來,您需要準備訓練NaiveBayesClassifier類的數據。添加以下代碼到文件中來準備數據:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

這段代碼給每條推文貼上一個Positive或Negative的標籤。然後,它通過連接正面和負面的推文來創建一個dataset。

默認情況下,該數據包含所有正面的推文,然後依次跟著所有負面的推文。在訓練模型時,您應該提供一個不包含任何偏差的您的數據樣本。為了避免偏差,您已經添加了使用random的.shuffle()方法來隨機排列數據的代碼。

最後,該代碼將打亂的數據按70:30的比例進行分割以分別用於訓練和測試。由於推文的數量是10000,您可以使用打亂的數據集的前7000條推文來訓練模型,而使用最後3000條推文來測試模型。

在此步驟中,您將清理後的標記轉換為一個字典形式,隨機打亂該數據集,並將其分割為訓練和測試數據。

步驟7 -構建和測試模型

最後,您可以使用NaiveBayesClassifier類來構建模型。使用.train()方法來訓練該模型,使用.accuracy()方法在測試數據上測試該模型。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

在添加代碼之後保存、關閉和執行腳本文件。代碼的輸出如下:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

準確度被定義為該模型能夠正確預測情感的測試數據集中推文的百分比。在測試集上能得到一個99.5%的準確度是相當不錯的。

在顯示信息性特徵的表格中,輸出中的每一行都顯示了訓練數據集中標籤為正面和負面的推文中一個標記出現的比率。數據中的第一行表明所有的推文中都包含標記:(,負面推文與正面推文之比為2085.6:1)。有趣的是,正面數據集中似乎有一個帶有:(的標記。您可以看到,文本中最具辨識度的兩個項目是表情符號。此外,像sad這樣的詞會導致負面情感,而welcome和glad則與正面情感相關。

接下來,您可以檢查模型對來自Twitter的隨機推文的執行情況。將這段代碼添加到文件中:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

這段代碼將允許您通過更新與custom_tweet變量相關聯的字符串來測試自定義推文。完成這些更改後保存並關閉文件。

運行該腳本來分析自定義文本。下面是例子中的自定義文本的輸出:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

您也可以檢查它是否正確地描述了正面推文:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下面是輸出:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

您已經測試了正面情感和負面情感,那我們再更新變量來測試更復雜的情感,比如諷刺。

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

下面是輸出:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

該模型將此示例歸類為正面。這是因為訓練數據不夠全面,無法將諷刺推文歸類為負面。如果您想要您的模型預測諷刺,您需要提供足夠的訓練數據來訓練它。

在這一步驟中,您構建並測試了模型。您還探索了它的一些限制,比如在特定的例子中不能檢測出諷刺。從本教程來說,您完成的代碼仍然還有些工作要做,因此下一個步驟將指導您根據Python的最佳實踐調整代碼。

步驟8 -清理代碼(可選)

雖然您已經完成了本教程,但還是建議您重新組織nlp_test.py文件中的代碼,以遵循最佳編程實踐。根據最佳實踐,您的代碼應該滿足以下標準:

  • 所有導入應該位於文件的頂部。來自同一個庫的導入應該歸類在一個單獨語句塊中。
  • 所有函數應該在導入之後進行定義。
  • 文件中的所有語句塊都應放置在一個 if __name__ == "__main__":condition下面.這可以確保您在另一個文件中導入該文件中的函數時,其中的語句塊不會被執行。

我們還將刪除本教程中註釋掉的代碼和lemmatize_sentence函數,因為詞形還原是由新的remove_noise函數來完成的。

下面是nlp_test.py清理後的版本:

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

如何使用自然語言工具包(NLTK)在Python3中執行情感分析

結論

本教程指導您在Python 3中使用nltk庫構建了一個基本的情感分析模型。首先,您通過標記化一條推文、對單詞進行規範化並移除噪聲,來對推文執行預處理。接下來,您可視化了數據中經常出現的項。最後,您構建了一個模型來將推文與一個特定的情感關聯起來。

一個監督學習模型的好壞取決於它的訓練數據。為了進一步強化該模型,您可以考慮添加更多的類別,如興奮和憤怒。在本教程中,通過構建一個基本模型,您只瞭解了一些皮毛。這裡有一個指南,詳細介紹了在進行情感分析時必須注意的各種注意事項。(地址:https://monkeylearn.com/sentiment-analysis/ )


英文原文:https://www.digitalocean.com/community/tutorials/how-to-perform-sentiment-analysis-in-python-3-using-the-natural-language-toolkit-nltk譯者:Nothing


分享到:


相關文章: