使用TF-IDF方法进行情感分析

使用TF-IDF方法进行情感分析

情感分析是“文本分类”的一种特殊情况,其中,根据文本数据可以预测用户对任何产品的意见或情感。

技术开发 编程 技术框架 技术发展

 

使用TF-IDF方法进行情感分析

情感分析是“文本分类”的一种特殊情况,其中,根据文本数据可以预测用户对任何产品的意见或情感。

文本分类是将诸如推文,评论,文章和博客之类的文本形式的数据分类为预定义类别的过程。情感分析是“文本分类”的一种特殊情况,其中,根据文本数据可以预测用户对任何产品的意见或情感。

在本教程中,您将学习如何开发情感分析模型,该模型将使用TF-IDF特征生成方法,并能够预测有关在美国运营的6家航空公司的用户情绪(即持有或表达的观点)通过分析用户推文。您将使用Python的   Scikit-Learn库   进行机器学习,以实现TF-IDF方法并训练我们的预测模型。

安装所需的库

在本教程中,您将使用必须预先安装的多个库。要安装它们 ,请在终端或CMD中使用 pip,如下所示:

pip install numpy

pip install pandas

pip install matplotlib

pip install seaborn

pip install nltk

注意:如果您使用的是Linux或Mac,则可能需要 在点子之前 使用 sudo  以避免权限问题。

导入库

由于我们将使用Python开发情感分析模型,因此您需要导入所需的库。下面的脚本可以做到这一点:

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 

 

在上面的脚本中,我们导入“ Numpy”,“ Pandas”,“ NLTK”和“ re”库。

加载数据集

下一步,加载将用于训练模型的数据集。正如我们之前所说,您将建立情感分析模型,以预测在美国运营的6家主要航空公司的公众情绪。可以通过Github链接免费获得该数据集。

注意:要了解如何自己创建此类数据集,可以查看我的其他教程“  刮鸣”和“执行情感分析”。

使用Pandas库的  read_csv  方法可以将数据集加载到“ tweets”数据帧(*)中。您可以使用在线URL,也可以下载文件并在计算机上使用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 是二维数据结构,因此数据以表格形式(即行和列)对齐。 通常,它是最常用的Pandas 对象。

要查看数据集的外观,请使用Pandas数据框的  head ()  方法,该方法将返回数据集的前5行,如下所示:

tweets.head()

image.png

同样,要查找数据集中的行数和列数,可以使用 shape  属性,如下所示:

tweets.shape

在输出中,你会看到 (14640 ,15 ),  这意味着我们的数据包括14640行和15列。但是,在这些列中,我们仅对由实际情感类别组成的“ airline_sentiment”列和包含推文实际文本的“ text”列感兴趣。

探索性数据分析

在本节中,您将学习如何将数据集可视化为图形。请注意,并非所有的Python IDE都支持显示这种图形。因此建议您使用Jupyter Notebook或Spyder。仅在Jupyter Notebook中,您需要添加此额外的行。

%matplotlib inline

因此,在构建实际模型之前,让我们对模型进行一些探索性数据分析。要以条形图的形式查看正面,负面和中立评论的数量,请在使用Python的Seaborn库绘制 countplot  方法的地方执行以下脚本。

import seaborn as sns

sns.countplot(x='airline_sentiment', data=tweets)

image.png

从输出中,您可以看到负面评论的数量远高于正面和中立评论的数量。

同样,要查看获得最多评论的航空公司,请执行以下脚本。

sns.countplot(x='airline', data=tweets)

image.png

从输出中,您可以看到“联合”航空公司获得的评论数量最多,而“维珍美国航空”获得的评论数量最少。

最后,让我们看看每个航空公司收到的每种类型的评论数量。为此,您可以再次使用 seaborn库中的 countplot方法。

 sns.countplot(x='airline', hue="airline_sentiment", data=tweets)

image.png 

您可以看到,几乎所有航空公司的负面评论数量都大于正面和中立评论。

探索性数据分析部分已经足够,让我们转到数据预处理部分。

数据预处理

首先,让我们将数据集分为特征和标签集。在功能集中,我们仅将推文的文本用作功能。相应的标签将是该推文的情绪。文本列是数据集中的第10列(列索引从pandas中的0开始),并包含推文的文本。同样,“ airline_sentiment”是第一列,其中包含情感。使用熊猫数据框的“ iloc”方法创建特征集X和标签集y,如下所示。

X = tweets.iloc[:, 10].values  

y = tweets.iloc[:, 1].values

我们的数据集包含许多特殊字符和空白。您需要删除它们才能获得干净的数据集。下面的脚本可以做到这一点:

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)

 

让我们看看上面的脚本中发生了什么。我们基本上是使用不同类型的正则表达式来执行文本预处理。正则表达式 re 。sub (r '\ W' ,'' ,str (X [ tweet ] ))    从我们的tweet中删除所有特殊字符。

删除特殊字符时,剩下的单个字符没有任何意义。例如,当您从单词“ Julia's”中删除特殊字符时,您将剩下“ Julia”和“ s”。此处的“ s”没有意义。正则表达式  re 。sub (r '\ s + [a-zA-Z] \ s +' ,'' ,processing_tweet )   除去开头的所有单个字符。要从句子开头删除单个字符,请使用regex re 。使用sub (r '\ ^ [a-zA-Z] \ s +' ,'' ,processing_tweet )     。

接下来,由于删除了特殊字符和单个空格,因此在文本中出现了多个空格。要删除这些多个空格并将其替换为单个空格,请使用 re 。子(- [R '\ S +' ,'' ,processed_tweet ,标志= 重。我)   正则表达式。

在某些情况下,数据集为字节格式。在这种情况下,字符“ b”会附加在字符串的开头。使用re 删除前导“ b” 。sub (r '^ b \ s +' ,`` ,processing_tweet )   正则表达式。最后一步,将您的文本转换为小写字母,以保持一致性。

用于文本到数字特征生成的TF-IDF方案

机器学习和深度学习等统计方法可以很好地与数值数据配合使用。但是,自然语言由单词和句子组成。因此,在构建情感分析模型之前,需要将文本转换为数字。已经开发了几种将文本转换为数字的方法。单词袋,N-gram和Word2Vec模型就是其中一些。

在本文中,我们将使用带TF-IDF方案的单词袋方法,以将文本转换为数字。Python的Sklearn库带有内置的功能来实现TF-IDF方法,您将在后面看到。在这里,我们将简要介绍TF-IDF方法。

言语包

在单词袋方法中,形成了所有文档中所有唯一单词的词汇表。该词汇表用作特征向量。假设您在我们的语料库S1,S2和S3中具有三个文档:

S1 =“外面很冷”

S2 =“天气很冷”

S3 =“我在外面”

使用以上三个句子形成的词汇表将是:

[是,寒冷,外面,天气,我,是]

该单词词汇将用于从句子中创建特征向量。让我们看看它是如何完成的。S1的特征向量为:

S1 = [1,1,1,1,0,0,0,0]

基本上,特征向量是通过查找词汇中的单词是否也位于句子中来创建的。如果在词汇表和句子中都找到一个单词,则在该位置输入一个,否则将输入零。因此,对于S1,词汇表中的前四个单词出现在句子S1中,您的开头有四个,然后是四个零。

同样,S2和S3的特征向量为:

S2 = [0,1,1,0,1,1,0,0]

S3 = [0,0,0,1,0,0,1,1]

特遣部队

现在,您知道单词袋方法的工作原理。现在让我们看一下TF-IDF与单词袋的关系。

在一个简单的单词袋中,每个单词都具有同等的重要性。TF-IDF背后的思想是,在一个文档中出现频率较高而在其他文档中出现频率较低的单词应给予更高的重视,因为它们对于分类更有用。

TF-IDF是两个术语的乘积:TF和IDF。

术语频率等于单词在特定文档中出现的次数。计算公式为:

TF  = (频率的一个字中的文件)/ (总字在所述文档)  

特定单词的反文档频率等于文档总数除以包含该特定单词的文档数量。计算整个对数的对数以减少除法的影响。计算公式为:

IDF = 日志((总数的文档)/ (数的文档包含的词))

例如,在S1中,单词“ outside”的TF将为1/4 = 0.25。同样,S1中单词“ outside”的IDF将为Log(3/2)= 0.176。TF-IDF值为0.25 x 0.176 = 0.044。

这些是复杂的计算。幸运的是,您不必进行所有这些计算。该 TfidfVectorizer   从类   sklearn 。feature_extraction 。文本  模块可用于创建包含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   指定要为其创建特征向量的最常出现的单词数。出现频率较低的单词在分类中不起作用。因此,我们在数据集中仅保留2000个最频繁出现的单词。该 min_df   的5个规定值的单词必须出现至少5个文件。同样, max_df   值为0.7%表示单词出现的比例不得超过70%的文档。选择70%作为阈值的基本原理是,超过70%的文档中出现的单词太常见了,不太可能在情感分类中起任何作用。

最后,要将数据集转换为相应的TF-IDF特征向量,您需要  在TfidfVectorizer   类上调用 fit_transform方法, 并将其传递给我们经过预处理的数据集。

将数据划分为训练集和测试集

在建立实际的情感分析模型之前,将您的数据集划分为训练和测试集。该模型将在训练集上进行训练,并在测试集上进行评估。以下脚本将数据分为训练集和测试集。

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)

练和评估文本分类模型

我们将数据分为训练集和测试集,下一步是在训练集上训练模型并在测试集上评估其性能。现在,使用 sklearn   中的 RandomForestClassifier 。集成  模块来训练您的模型。您可以使用您选择的任何其他分类器。要训练模型,您需要在分类器对象上调用“ fit”方法,并将其传递给训练功能集和训练标签集,如下所示:

from sklearn.ensemble import RandomForestClassifier

text_classifier = RandomForestClassifier(n_estimators=100, random_state=0)  

text_classifier.fit(X_train, y_train)

要对测试集进行预测,您需要将测试集传递给“ predict”方法,如下所示:

predictions = text_classifier.predict(X_test)

最后,要评估您开发的分类模型,可以将混淆矩阵,分类报告和准确性用作性能指标。可以使用sklearn中的类来计算这些指标 。指标   模块,如下所示:

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))

结果

[[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

 

我们的分类器的准确度达到75.47%。

完整的代码

这是本教程的完整代码:

image.png

结论

情感分析是自然语言过程中的主要任务之一。要将统计技术应用于情感分析,您需要将文本转换为数字。在本文中,您了解了如何使用TF-IDF方法从文本创建数字特征向量。我们的情感分析模型对情感预测的准确性达到了75%左右。我建议您尝试使用支持向量机和神经网络分类器来训练您的模型,并查看您达到了多少精度。

技术开发 编程 技术框架 技术发展