使用TF-IDF方法進(jìn)行情感分析
情感分析是“文本分類”的一種特殊情況,其中,根據(jù)文本數(shù)據(jù)可以預(yù)測用戶對任何產(chǎn)品的意見或情感。
文本分類是將諸如推文,評論,文章和博客之類的文本形式的數(shù)據(jù)分類為預(yù)定義類別的過程。情感分析是“文本分類”的一種特殊情況,其中,根據(jù)文本數(shù)據(jù)可以預(yù)測用戶對任何產(chǎn)品的意見或情感。
在本教程中,您將學(xué)習(xí)如何開發(fā)情感分析模型,該模型將使用TF-IDF特征生成方法,并能夠預(yù)測有關(guān)在美國運(yùn)營的6家航空公司的用戶情緒(即持有或表達(dá)的觀點(diǎn))通過分析用戶推文。您將使用Python的 Scikit-Learn庫 進(jìn)行機(jī)器學(xué)習(xí),以實(shí)現(xiàn)TF-IDF方法并訓(xùn)練我們的預(yù)測模型。
安裝所需的庫
在本教程中,您將使用必須預(yù)先安裝的多個(gè)庫。要安裝它們 ,請?jiān)诮K端或CMD中使用 pip,如下所示:
pip install numpy
pip install pandas
pip install matplotlib
pip install seaborn
pip install nltk
注意:如果您使用的是Linux或Mac,則可能需要 在點(diǎn)子之前 使用 sudo 以避免權(quán)限問題。
導(dǎo)入庫
由于我們將使用Python開發(fā)情感分析模型,因此您需要導(dǎo)入所需的庫。下面的腳本可以做到這一點(diǎn):
import numpy as np
import pandas as pd
import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
import numpy as np
import pandas as pd
import re
import nltk
nltk.download('stopwords')
from nltk.corpus import stopwords
在上面的腳本中,我們導(dǎo)入“ Numpy”,“ Pandas”,“ NLTK”和“ re”庫。
加載數(shù)據(jù)集
下一步,加載將用于訓(xùn)練模型的數(shù)據(jù)集。正如我們之前所說,您將建立情感分析模型,以預(yù)測在美國運(yùn)營的6家主要航空公司的公眾情緒??梢酝ㄟ^Github鏈接免費(fèi)獲得該數(shù)據(jù)集。
注意:要了解如何自己創(chuàng)建此類數(shù)據(jù)集,可以查看我的其他教程“ 刮鳴”和“執(zhí)行情感分析”。
使用Pandas庫的 read_csv 方法可以將數(shù)據(jù)集加載到“ tweets”數(shù)據(jù)幀(*)中。您可以使用在線URL,也可以下載文件并在計(jì)算機(jī)上使用CSV文件的本地路徑。
tweets = pd.read_csv("https://raw.githubusercontent.com/kolaveridi/kaggle-Twitter-US-Airline-Sentiment-/master/Tweets.csv")
tweets = pd.read_csv("https://raw.githubusercontent.com/kolaveridi/kaggle-Twitter-US-Airline-Sentiment-/master/Tweets.csv")
(*) DataFrame 是二維數(shù)據(jù)結(jié)構(gòu),因此數(shù)據(jù)以表格形式(即行和列)對齊。 通常,它是最常用的Pandas 對象。
要查看數(shù)據(jù)集的外觀,請使用Pandas數(shù)據(jù)框的 head () 方法,該方法將返回?cái)?shù)據(jù)集的前5行,如下所示:
tweets.head()

同樣,要查找數(shù)據(jù)集中的行數(shù)和列數(shù),可以使用 shape 屬性,如下所示:
tweets.shape
在輸出中,你會(huì)看到 (14640 ,15 ), 這意味著我們的數(shù)據(jù)包括14640行和15列。但是,在這些列中,我們僅對由實(shí)際情感類別組成的“ airline_sentiment”列和包含推文實(shí)際文本的“ text”列感興趣。
探索性數(shù)據(jù)分析
在本節(jié)中,您將學(xué)習(xí)如何將數(shù)據(jù)集可視化為圖形。請注意,并非所有的Python IDE都支持顯示這種圖形。因此建議您使用Jupyter Notebook或Spyder。僅在Jupyter Notebook中,您需要添加此額外的行。
%matplotlib inline
因此,在構(gòu)建實(shí)際模型之前,讓我們對模型進(jìn)行一些探索性數(shù)據(jù)分析。要以條形圖的形式查看正面,負(fù)面和中立評論的數(shù)量,請?jiān)谑褂肞ython的Seaborn庫繪制 countplot 方法的地方執(zhí)行以下腳本。
import seaborn as sns
sns.countplot(x='airline_sentiment', data=tweets)

從輸出中,您可以看到負(fù)面評論的數(shù)量遠(yuǎn)高于正面和中立評論的數(shù)量。
同樣,要查看獲得最多評論的航空公司,請執(zhí)行以下腳本。
sns.countplot(x='airline', data=tweets)

從輸出中,您可以看到“聯(lián)合”航空公司獲得的評論數(shù)量最多,而“維珍美國航空”獲得的評論數(shù)量最少。
最后,讓我們看看每個(gè)航空公司收到的每種類型的評論數(shù)量。為此,您可以再次使用 seaborn庫中的 countplot方法。
sns.countplot(x='airline', hue="airline_sentiment", data=tweets)
您可以看到,幾乎所有航空公司的負(fù)面評論數(shù)量都大于正面和中立評論。
探索性數(shù)據(jù)分析部分已經(jīng)足夠,讓我們轉(zhuǎn)到數(shù)據(jù)預(yù)處理部分。
數(shù)據(jù)預(yù)處理
首先,讓我們將數(shù)據(jù)集分為特征和標(biāo)簽集。在功能集中,我們僅將推文的文本用作功能。相應(yīng)的標(biāo)簽將是該推文的情緒。文本列是數(shù)據(jù)集中的第10列(列索引從pandas中的0開始),并包含推文的文本。同樣,“ airline_sentiment”是第一列,其中包含情感。使用熊貓數(shù)據(jù)框的“ iloc”方法創(chuàng)建特征集X和標(biāo)簽集y,如下所示。
X = tweets.iloc[:, 10].values
y = tweets.iloc[:, 1].values
我們的數(shù)據(jù)集包含許多特殊字符和空白。您需要?jiǎng)h除它們才能獲得干凈的數(shù)據(jù)集。下面的腳本可以做到這一點(diǎn):
processed_tweets = []
for tweet in range(0, len(X)):
# Remove all the special characters
processed_tweet = re.sub(r'\W', ' ', str(X[tweet]))
# remove all single characters
processed_tweet = re.sub(r'\s+[a-zA-Z]\s+', ' ', processed_tweet)
# Remove single characters from the start
processed_tweet = re.sub(r'\^[a-zA-Z]\s+', ' ', processed_tweet)
# Substituting multiple spaces with single space
processed_tweet= re.sub(r'\s+', ' ', processed_tweet, flags=re.I)
# Removing prefixed 'b'
processed_tweet = re.sub(r'^b\s+', '', processed_tweet)
# Converting to Lowercase
processed_tweet = processed_tweet.lower()
processed_tweets.append(processed_tweet)
end(processed_tweet)
讓我們看看上面的腳本中發(fā)生了什么。我們基本上是使用不同類型的正則表達(dá)式來執(zhí)行文本預(yù)處理。正則表達(dá)式 re 。sub (r '\ W' ,'' ,str (X [ tweet ] )) 從我們的tweet中刪除所有特殊字符。
刪除特殊字符時(shí),剩下的單個(gè)字符沒有任何意義。例如,當(dāng)您從單詞“ Julia's”中刪除特殊字符時(shí),您將剩下“ Julia”和“ s”。此處的“ s”沒有意義。正則表達(dá)式 re 。sub (r '\ s + [a-zA-Z] \ s +' ,'' ,processing_tweet ) 除去開頭的所有單個(gè)字符。要從句子開頭刪除單個(gè)字符,請使用regex re 。使用sub (r '\ ^ [a-zA-Z] \ s +' ,'' ,processing_tweet ) 。
接下來,由于刪除了特殊字符和單個(gè)空格,因此在文本中出現(xiàn)了多個(gè)空格。要?jiǎng)h除這些多個(gè)空格并將其替換為單個(gè)空格,請使用 re 。子(- [R '\ S +' ,'' ,processed_tweet ,標(biāo)志= 重。我) 正則表達(dá)式。
在某些情況下,數(shù)據(jù)集為字節(jié)格式。在這種情況下,字符“ b”會(huì)附加在字符串的開頭。使用re 刪除前導(dǎo)“ b” 。sub (r '^ b \ s +' ,`` ,processing_tweet ) 正則表達(dá)式。最后一步,將您的文本轉(zhuǎn)換為小寫字母,以保持一致性。
用于文本到數(shù)字特征生成的TF-IDF方案
機(jī)器學(xué)習(xí)和深度學(xué)習(xí)等統(tǒng)計(jì)方法可以很好地與數(shù)值數(shù)據(jù)配合使用。但是,自然語言由單詞和句子組成。因此,在構(gòu)建情感分析模型之前,需要將文本轉(zhuǎn)換為數(shù)字。已經(jīng)開發(fā)了幾種將文本轉(zhuǎn)換為數(shù)字的方法。單詞袋,N-gram和Word2Vec模型就是其中一些。
在本文中,我們將使用帶TF-IDF方案的單詞袋方法,以將文本轉(zhuǎn)換為數(shù)字。Python的Sklearn庫帶有內(nèi)置的功能來實(shí)現(xiàn)TF-IDF方法,您將在后面看到。在這里,我們將簡要介紹TF-IDF方法。
言語包
在單詞袋方法中,形成了所有文檔中所有唯一單詞的詞匯表。該詞匯表用作特征向量。假設(shè)您在我們的語料庫S1,S2和S3中具有三個(gè)文檔:
S1 =“外面很冷”
S2 =“天氣很冷”
S3 =“我在外面”
使用以上三個(gè)句子形成的詞匯表將是:
[是,寒冷,外面,天氣,我,是]
該單詞詞匯將用于從句子中創(chuàng)建特征向量。讓我們看看它是如何完成的。S1的特征向量為:
S1 = [1,1,1,1,0,0,0,0]
基本上,特征向量是通過查找詞匯中的單詞是否也位于句子中來創(chuàng)建的。如果在詞匯表和句子中都找到一個(gè)單詞,則在該位置輸入一個(gè),否則將輸入零。因此,對于S1,詞匯表中的前四個(gè)單詞出現(xiàn)在句子S1中,您的開頭有四個(gè),然后是四個(gè)零。
同樣,S2和S3的特征向量為:
S2 = [0,1,1,0,1,1,0,0]
S3 = [0,0,0,1,0,0,1,1]
特遣部隊(duì)
現(xiàn)在,您知道單詞袋方法的工作原理?,F(xiàn)在讓我們看一下TF-IDF與單詞袋的關(guān)系。
在一個(gè)簡單的單詞袋中,每個(gè)單詞都具有同等的重要性。TF-IDF背后的思想是,在一個(gè)文檔中出現(xiàn)頻率較高而在其他文檔中出現(xiàn)頻率較低的單詞應(yīng)給予更高的重視,因?yàn)樗鼈儗τ诜诸惛杏谩?/span>
TF-IDF是兩個(gè)術(shù)語的乘積:TF和IDF。
術(shù)語頻率等于單詞在特定文檔中出現(xiàn)的次數(shù)。計(jì)算公式為:
TF = (頻率的一個(gè)字中的文件)/ (總字在所述文檔)
特定單詞的反文檔頻率等于文檔總數(shù)除以包含該特定單詞的文檔數(shù)量。計(jì)算整個(gè)對數(shù)的對數(shù)以減少除法的影響。計(jì)算公式為:
IDF = 日志((總數(shù)的文檔)/ (數(shù)的文檔包含的詞))
例如,在S1中,單詞“ outside”的TF將為1/4 = 0.25。同樣,S1中單詞“ outside”的IDF將為Log(3/2)= 0.176。TF-IDF值為0.25 x 0.176 = 0.044。
這些是復(fù)雜的計(jì)算。幸運(yùn)的是,您不必進(jìn)行所有這些計(jì)算。該 TfidfVectorizer 從類 sklearn 。feature_extraction 。文本 模塊可用于創(chuàng)建包含TF-IDF值的特征向量??聪旅娴哪_本:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidfconverter = TfidfVectorizer(max_features=2000, min_df=5, max_df=0.7, stop_words=stopwords.words('english'))
X = tfidfconverter.fit_transform(processed_tweets).toarray()
屬性 max_features 指定要為其創(chuàng)建特征向量的最常出現(xiàn)的單詞數(shù)。出現(xiàn)頻率較低的單詞在分類中不起作用。因此,我們在數(shù)據(jù)集中僅保留2000個(gè)最頻繁出現(xiàn)的單詞。該 min_df 的5個(gè)規(guī)定值的單詞必須出現(xiàn)至少5個(gè)文件。同樣, max_df 值為0.7%表示單詞出現(xiàn)的比例不得超過70%的文檔。選擇70%作為閾值的基本原理是,超過70%的文檔中出現(xiàn)的單詞太常見了,不太可能在情感分類中起任何作用。
最后,要將數(shù)據(jù)集轉(zhuǎn)換為相應(yīng)的TF-IDF特征向量,您需要 在TfidfVectorizer 類上調(diào)用 fit_transform方法, 并將其傳遞給我們經(jīng)過預(yù)處理的數(shù)據(jù)集。
將數(shù)據(jù)劃分為訓(xùn)練集和測試集
在建立實(shí)際的情感分析模型之前,將您的數(shù)據(jù)集劃分為訓(xùn)練和測試集。該模型將在訓(xùn)練集上進(jìn)行訓(xùn)練,并在測試集上進(jìn)行評估。以下腳本將數(shù)據(jù)分為訓(xùn)練集和測試集。
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)
練和評估文本分類模型
我們將數(shù)據(jù)分為訓(xùn)練集和測試集,下一步是在訓(xùn)練集上訓(xùn)練模型并在測試集上評估其性能。現(xiàn)在,使用 sklearn 中的 RandomForestClassifier 。集成 模塊來訓(xùn)練您的模型。您可以使用您選擇的任何其他分類器。要訓(xùn)練模型,您需要在分類器對象上調(diào)用“ fit”方法,并將其傳遞給訓(xùn)練功能集和訓(xùn)練標(biāo)簽集,如下所示:
from sklearn.ensemble import RandomForestClassifier
text_classifier = RandomForestClassifier(n_estimators=100, random_state=0)
text_classifier.fit(X_train, y_train)
要對測試集進(jìn)行預(yù)測,您需要將測試集傳遞給“ predict”方法,如下所示:
predictions = text_classifier.predict(X_test)
最后,要評估您開發(fā)的分類模型,可以將混淆矩陣,分類報(bào)告和準(zhǔn)確性用作性能指標(biāo)??梢允褂胹klearn中的類來計(jì)算這些指標(biāo) 。指標(biāo) 模塊,如下所示:
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
print(confusion_matrix(y_test,predictions))
print(classification_report(y_test,predictions))
print(accuracy_score(y_test, predictions))
結(jié)果
[[1719 108 43]
[ 325 243 46]
[ 134 62 248]]
precision recall f1-score support
negative 0.79 0.92 0.85 1870
neutral 0.59 0.40 0.47 614
positive 0.74 0.56 0.64 444
micro avg 0.75 0.75 0.75 2928
macro avg 0.70 0.62 0.65 2928
weighted avg 0.74 0.75 0.74 2928
0.7547814207650273
我們的分類器的準(zhǔn)確度達(dá)到75.47%。
完整的代碼
這是本教程的完整代碼:

結(jié)論
情感分析是自然語言過程中的主要任務(wù)之一。要將統(tǒng)計(jì)技術(shù)應(yīng)用于情感分析,您需要將文本轉(zhuǎn)換為數(shù)字。在本文中,您了解了如何使用TF-IDF方法從文本創(chuàng)建數(shù)字特征向量。我們的情感分析模型對情感預(yù)測的準(zhǔn)確性達(dá)到了75%左右。我建議您嘗試使用支持向量機(jī)和神經(jīng)網(wǎng)絡(luò)分類器來訓(xùn)練您的模型,并查看您達(dá)到了多少精度。
