使用 Python 進行社交媒體情感分析入門

2019-05-14 00:30:00

學習自然語言處理的基礎知識並探索兩個有用的 Python 包。

自然語言處理(NLP)是機器學習的一種,它解決了口語或書面語言和計算機輔助分析這些語言之間的相關性。日常生活中我們經歷了無數的 NLP 創新,從寫作幫助和建議到實時語音翻譯,還有口譯。

本文研究了 NLP 的一個特定領域:情感分析。重點是確定輸入語言的積極、消極或中性性質。本部分將解釋 NLP 和情感分析的背景,並探討兩個開源的 Python 包。第 2 部分將演示如何開始構建自己的可延伸情感分析服務。

在學習情感分析時,對 NLP 有一個大體了解是有幫助的。本文不會深入研究數學本質。相反,我們的目標是闡明 NLP 中的關鍵概念,這些概念對於將這些方法實際結合到你的解決方案中至關重要。

自然語言和文字資料

合理的起點是從定義開始:“什麼是自然語言?”它是我們人類相互交流的方式,溝通的主要方式是口語和文字。我們可以更進一步,只關注文字交流。畢竟,生活在 Siri、Alexa 等無處不在的時代,我們知道語音是一組與文字無關的計算。

資料前景和挑戰

我們只考慮使用文字資料,我們可以對語言和文字做什麼呢?首先是語言,特別是英語,除了規則還有很多例外,含義的多樣性和語境差異,這些都可能使人類口譯員感到困惑,更不用說計算機翻譯了。在小學,我們學習文章和標點符號,通過講母語,我們獲得了尋找直覺上表示唯一意義的詞的能力。比如,出現諸如 “a”、“the” 和 “or” 之類的文章,它們在 NLP 中被稱為停止詞,因為傳統上 NLP 演算法是在一個序列中找到這些詞時意味著搜尋停止。

由於我們的目標是自動將文字分類為情感類,因此我們需要一種以計算方式處理文字資料的方法。因此,我們必須考慮如何向機器表示文字資料。眾所周知,利用和解釋語言的規則很複雜,輸入文字的大小和結構可能會有很大差異。我們需要將文字資料轉換為數位資料,這是機器和數學的首選方式。這種轉變屬於特徵提取的範疇。

在提取輸入文字資料的數位表示形式後,一個改進可能是:給定一個文字輸入體,為上面列出的文章確定一組向量統計資料,並根據這些資料對文件進行分類。例如,過多的副詞可能會使撰稿人感到憤怒,或者過度使用停止詞可能有助於識別帶有內容填充的學期論文。誠然,這可能與我們情感分析的目標沒有太大關係。

詞袋

當你評估一個文字陳述是積極還是消極的時候,你使用哪些上下文來評估它的極性?(例如,文字中是否具有積極的、消極的或中性的情感)一種方式是隱含形容詞:被稱為 “disgusting”(噁心) 的東西被認為是消極的,但如果同樣的東西被稱為 “beautiful”(漂亮),你會認為它是積極的。從定義上講,俗語給人一種熟悉感,通常是積極的,而髒話可能是敵意的表現。文字資料也可以包括表情符號,它帶有固定的情感。

理解單個單詞的極性影響為文字的詞袋bag-of-words(BoW)模型提供了基礎。它分析一組單詞或詞彙表,並提取關於這些單詞在輸入文字中是否存在的度量。詞彙表是通過處理已知極性的文字形成稱為標記的訓練資料。從這組標記資料中提取特徵,然後分析特徵之間的關係,並將標記與資料關聯起來。

“詞袋”這個名稱說明了它的用途:即不考慮空間位置或上下文的的單個詞。詞彙表通常是由訓練集中出現的所有單詞構建的,訓練後往往會被修剪。如果在訓練之前沒有清理停止詞,那麼停止詞會因為其高頻率和低語境而被移除。很少使用的單詞也可以刪除,因為缺乏為一般輸入範例提供的資訊。

但是,重要的是要注意,你可以(並且應該)進一步考慮單詞在單個訓練資料範例之外的情形,這稱為詞頻term frequency(TF)。你還應該考慮輸入資料在所有訓練範例中的單詞計數,通常,出現在所有文件中的低頻詞更重要,這被稱為逆文字頻率指數inverse document frequency(IDF)。這些指標一定會在本主題系列的其他文章和軟體包中提及,因此了解它們會有所幫助。

詞袋在許多文件分類應用程式中很有用。然而,在情感分析中,當缺乏情境意識的問題被利用時,事情就可以解決。考慮以下句子:

  • 我們不喜歡這場戰爭。
  • 我討厭下雨天,好事是今天是晴天。
  • 這不是生死攸關的問題。

這些短語的情感對於人類口譯員來說是有難度的,而且通過嚴格關注單個詞彙的範例,對於機器翻譯來說也是困難的。

在 NLP 中也可以使用稱為 “n-grams” 的單詞分組。一個二元組考慮兩個相鄰單詞組成的組而不是(或除了)單個詞袋。這應該可以緩解諸如上述“不喜歡”之類的情況,但由於缺乏語境意思,它仍然是個問題。此外,在上面的第二句中,下半句的情感語境可以被理解為否定前半部分。因此,這種方法中也會丟失上下文線索的空間區域性性。從實用角度來看,使問題複雜化的是從給定輸入文字中提取的特徵的稀疏性。對於一個完整的大型詞彙表,每個單詞都有一個計數,可以將其視為一個整數向量。大多數文件的向量中都有大量的零計數向量,這給操作增加了不必要的空間和時間複雜度。雖然已經提出了許多用於降低這種複雜性的簡便方法,但它仍然是一個問題。

詞嵌入

詞嵌入Word embedding是一種分散式表示,它允許具有相似含義的單詞具有相似的表示。這是基於使用實值向量來與它們周圍相關聯。重點在於使用單詞的方式,而不僅僅是它們的存在與否。此外,詞嵌入的一個巨大實用優勢是它們關注於密集向量。通過擺脫具有相應數量的零值向量元素的單詞計數模型,詞嵌入在時間和儲存方面提供了一個更有效的計算範例。

以下是兩個優秀的詞嵌入方法。

Word2vec

第一個是 Word2vec,它是由 Google 開發的。隨著你對 NLP 和情緒分析研究的深入,你可能會看到這種嵌入方法。它要麼使用一個連續的詞袋continuous bag of words(CBOW),要麼使用一個連續 skip-gram 模型。在 CBOW 中,一個單詞的上下文是在訓練中根據圍繞它的單詞來學習的。連續 skip-gram 學習傾向於圍繞給定的單詞學習單詞。雖然這可能超出了你需要解決的問題,但是如果你曾經面對必須生成自己的詞嵌入情況,那麼 Word2vec 的作者就提倡使用 CBOW 方法來提高速度並評估頻繁的單詞,而 skip-gram 方法更適合嵌入稀有單詞更重要的嵌入。

GloVe

第二個是用於詞表示的全域性向量Global Vectors for Word Representation(GloVe),它是斯坦福大學開發的。它是 Word2vec 方法的擴充套件,試圖通過將經典的全域性文字統計特徵提取獲得的資訊與 Word2vec 確定的本地上下文資訊相結合。實際上,在一些應用程式中,GloVe 效能優於 Word2vec,而在另一些應用程式中則不如 Word2vec。最終,用於詞嵌入的目標資料集將決定哪種方法最優。因此,最好了解它們的存在性和高階機制,因為你很可能會遇到它們。

建立和使用詞嵌入

最後,知道如何獲得詞嵌入是有用的。在第 2 部分中,你將看到我們通過利用社群中其他人的實質性工作,站到了巨人的肩膀上。這是獲取詞嵌入的一種方法:即使用現有的經過訓練和驗證的模型。實際上,有無數的模型適用於英語和其他語言,一定會有一種模型可以滿足你的應用程式,讓你開箱即用!

如果沒有的話,就開發工作而言,另一個極端是培訓你自己的獨立模型,而不考慮你的應用程式。實質上,你將獲得大量標記的訓練資料,並可能使用上述方法之一來訓練模型。即使這樣,你仍然只是在理解你輸入文字資料。然後,你需要為你應用程式開發一個特定的模型(例如,分析軟體版本控制訊息中的情感價值),這反過來又需要自己的時間和精力。

你還可以對針對你的應用程式的資料訓練一個詞嵌入,雖然這可以減少時間和精力,但這個詞嵌入將是特定於應用程式的,這將會降低它的可重用性。

可用的工具選項

考慮到所需的大量時間和計算能力,你可能想知道如何才能找到解決問題的方法。的確,開發可靠模型的複雜性可能令人望而生畏。但是,有一個好訊息:已經有許多經過驗證的模型、工具和軟體庫可以為我們提供所需的大部分內容。我們將重點關注 Python,因為它為這些應用程式提供了大量方便的工具。

SpaCy

SpaCy 提供了許多用於解析輸入文字資料和提取特徵的語言模型。它經過了高度優化,並被譽為同類中最快的庫。最棒的是,它是開源的!SpaCy 會執行標識化、詞性分類和依賴項註釋。它包含了用於執行此功能的詞嵌入模型,還有用於為超過 46 種語言的其他特徵提取操作。在本系列的第二篇文章中,你將看到它如何用於文字分析和特徵提取。

vaderSentiment

vaderSentiment 包提供了積極、消極和中性情緒的衡量標準。正如 原論文 的標題(《VADER:一個基於規則的社交媒體文字情感分析模型》)所示,這些模型是專門為社交媒體文字資料開發和調整的。VADER 接受了一組完整的人類標記過的資料的訓練,包括常見的表情符號、UTF-8 編碼的表情符號以及口語術語和縮寫(例如 meh、lol、sux)。

對於給定的輸入文字資料,vaderSentiment 返回一個極性分數百分比的三元組。它還提供了一個單個的評分標準,稱為 vaderSentiment 複合指標。這是一個在 [-1, 1] 範圍內的實值,其中對於分值大於 0.05 的情緒被認為是積極的,對於分值小於 -0.05 的被認為是消極的,否則為中性。

第 2 部分中,你將學習如何使用這些工具為你的設計新增情感分析功能。