如何使用Neattext和Scikit-learn建立一个基于NLP的情感检测模型
自然语言处理帮助计算机像人一样理解语音和书面文字。这使得机器能够计算出必要的反应。许多NLP的应用之一是文本中的情感检测。
情感检测模型是一种用于检测给定文本中感觉和态度类型的模型。它可能是一种快乐、悲伤、恐惧、愤怒、惊讶、厌恶或羞愧的感觉。
情感检测模型可以将一个文本分类为以下类别。通过使用文本中的情感检测,企业可以知道客户对其品牌和产品的感受。这有助于企业改善产品质量和服务提供。
在本教程中,我们将使用Neattext和Scikit-learn来建立我们的模型。Neattext是一个Python库,用于预处理我们的数据集。Neattext将通过去除停止词和其他噪音来清理文本数据集。
这使得模型在训练期间更容易使用数据集。我们将使用Scikit-learn来建立我们的模型。它包含分类所需的所有算法。这是一个从数据预处理到模型建立和测试的实用指南。
前提条件
读者必须了解以下内容才能跟上。
- [Python]编程。
- 如何建立[机器学习模型]。
- 如何使用[Pandas]和[Numpy]。
- 有一些[自然语言处理]的知识。
注意:在本教程中,我们将使用Google Colab来建立我们的模型。
探索我们的数据集
在本教程中,我们将使用一个数据集,其中包含各种带有不同情绪标签的文本。该数据集有八个情绪标签,命名如下:快乐、悲伤、恐惧、愤怒、惊讶、中性、厌恶和羞耻。该数据集将在训练阶段使用。然后,训练好的模型将被用来将给定的文本分类为情感标签。
下面是数据集的一个片段。

要获得CSV格式的数据集,请点击这里。
下载完数据集后,我们现在可以将其加载到我们的Google Colab笔记本中。
加载探索性数据分析包
我们导入两个探索性数据分析包,Pandas 和Numpy 。我们将使用pandas来读取我们的CSV文件并将其加载到我们的Google Colab笔记本中。Numpy与数组一起工作,用来对我们的数据进行数学计算。
import pandas as pd
import numpy as np
我们使用pandas 来加载我们的数据集。
加载数据集
使用下面的命令来加载数据集。
df = pd.read_csv("emotion-dataset.csv")
要查看数据集的结构,使用这个命令。
df.head()
输出结果如下图所示。

上面的图片显示,我们的数据集有两列:Emotion 和Text 。Emotion 列代表各种情感标签。Text 列显示了我们数据集中的所有文本。
为了显示每种情绪的值计数,运行下面的代码。它将给你每个emotion 标签的文本总数。
df['Emotion'].value_counts()
其输出结果如下所示。

我们现在可以开始使用Neattext清理我们的数据集。
开始使用Neattext
如前所述,Neattext是一个Python库,用于预处理我们的数据集。Neattext将通过去除停止词和噪音来清理文本数据集。
要安装Neattext,请运行这个命令。
!pip install neattext
我们导入neattext ,如下所示。
import neattext.functions as nfx
为了使用neattext ,我们列出了neattext 用于数据清理的所有方法和属性。
dir(nfx)
方法和属性的输出如下所示。

我们只对列表中的两个方法感兴趣,即remove_stopwords 和remove_userhandles 。
删除用户手柄
数据集包含了一些不同用户的Twitter手柄。这些手柄是不必要的,被认为是我们数据集的噪音。我们使用remove_userhandles ,将它们从我们的数据集中删除。
df['Clean_Text'] = df['Text'].apply(nfx.remove_userhandles)
我们使用apply() 方法来添加remove_userhandles 。我们将清理后的数据集保存在一个新的列中,命名为Clean_Text 。
删除止损词
停止词是任何语言中所有常用词的列表。在训练过程中,停顿词携带的有用信息很少,对模型的影响也很小。这些词在训练中会导致模型的偏差。删除止损词可以消除不重要的词,使应用程序能够专注于必要的词。
常见的停顿词就像特定语言的文章。它们包括英语中的单词:the 、is 、and 和are 。
df['Clean_Text'] = df['Clean_Text'].apply(nfx.remove_stopwords)
在本节中,我们还使用apply() ,以增加remove_stopwords 。我们将清理后的数据集保存在一个新的列中,命名为Clean_Text 。
为了得到清洁数据集的输出,运行这个命令。
df
删除用户手柄和停止词后的数据集的输出如下所示。

现在我们清理了我们的数据集,我们现在可以加载我们的机器学习包。
导入机器学习包
from sklearn.linear_model import LogisticRegression
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
从上面的代码中,我们已经导入了以下内容。
-
LogisticRegression是一种用于分类和回归的算法。我们将使用它来进行情感分类。 -
机器学习模型对原始文本的理解有问题,它们对数字的工作很好。机器无法处理原始文本数据,必须将其转换为数字矩阵。
CountVectorizer,将原始文本转换为数字矩阵。这个过程取决于整个文本中每个单词的频率。在这个过程中,CountVectorizer从文本中提取重要特征。它们在训练期间被用作模型的输入。 -
在分割数据集的过程中,
train_test_split方法很重要。它将数据集分成两组,一组是train set,另一组是test set。这取决于用户指定的百分比。 -
在预测过程中,计算我们模型的准确度得分时,
accuracy_score,这一点很重要。
特征和标签在机器学习中很重要。在本节中,我们将指定我们的特征和标签。
模型特征和标签
特征是指从数据集中提取的属性和变量。这些提取的特征在训练期间被用作模型的输入,使模型学习成为可能。我们的特征存在于Clean_Text 列。
标签是输出或目标变量。我们的标签是Emotion 列,这就是模型的预测结果。
Xfeatures = df['Clean_Text']
ylabels = df['Emotion']
数据集的拆分
我们需要将我们的数据集分成训练集和测试集。该模型将从训练集中学习。我们将使用测试集来评估模型的性能,衡量模型的知识能力。
我们指定test_size=0.3 。这将把我们的数据集分成用于训练的70% 和用于测试的30% 。
为了使我们的模型训练过程更快、更自动化,我们将使用一个机器学习管道。机器学习管道将机器学习的工作流程自动化,如模型拟合和训练。
这样做可以节省开发人员的时间,减少模型错误。机器学习管道是许多开发者采用的一种新方法,因为它能产生没有错误的高质量模型。
为了使用这种管道方法,我们需要导入Pipeline 包。
管线方法
我们使用以下代码导入Pipeline 。
from sklearn.pipeline import Pipeline
要使用Pipeline ,我们需要指定我们想要自动化的机器学习阶段。在本教程中,我们有两个想要自动化的过程。第一阶段是CountVectorizer 过程。这个阶段将原始文本数据集转换为机器可以理解的数字矩阵。
第二阶段是使用LogisticRegression 算法的模型训练过程。在这个阶段,模型从数据集中学习。在训练过程中,它理解模式,获得知识,并利用这些知识进行预测。
两个管道阶段的初始化如下。
pipe_lr = Pipeline(steps=[('cv',CountVectorizer()),('lr',LogisticRegression())])
在初始化这两个阶段后,我们需要将这些阶段融入我们的数据集。我们将使用训练集数据集,它被指定为x_train 和y_train 。
模型拟合
为了将管道阶段拟合到x_train 和y_train ,运行这段代码。
pipe_lr.fit(x_train,y_train)
Pipeline 将自动运行以下阶段并产生以下输出。

这个过程会产生最佳的模型,会得到最好的结果。随着时间的推移,该模型将自行改进,并给出更好的预测结果。
建立模型后,我们检查由我们的Pipeline 产生的准确率分数,以评估模型的性能。
计算准确率得分
要检查准确率得分,请运行这个命令。
pipe_lr.score(x_test,y_test)
输出结果如下所示。
0.8200421536692853
当准确率得分以百分比表示时,它变成了82.0% 。这是在第一阶段训练后的高精确度。通过不断的训练,模型将提高准确率得分。准确度得分越高,模型的预测效果就越好。
我们的模型现在已经被完全训练和测试。我们现在可以使用这个模型来进行预测。
进行一次预测
我们的模型应该能够将一个给定的文本分类为情感标签。让我们使用下面显示的样本文本来进行预测。
sample1 = "This chocolate was very sweet it made me happy"
要进行实际的预测,请运行这段代码。
pipe_lr.predict([sample1])
我们使用predict 方法来预测我们的样本文本。预测结果显示如下。
array(['joy'], dtype=object)
预测的结果是joy 。这就是正确的预测。这表明我们的模型可以准确预测。它可以被采用并部署到生产中。
总结
在本教程中,我们学习了如何使用Neattext和Scikit-learn建立一个情感检测模型。我们首先使用Neattext清理我们的数据集。在用于训练之前,数据集必须处于正确的状态。
我们探索了不同的机器学习包和算法的使用方法。我们使用逻辑回归算法来建立我们的情绪检测模型。我们还引入了一个被称为机器学习管道的概念。管道方法使我们的工作更容易。它使CounterVectorizer 过程和模型构建自动化。
最后,我们用这个模型做了准确的预测。任何企业都可以采用这个模型,并使用它来监测客户的在线对话和评论。这给企业在如何提高他们的品牌形象方面带来了额外的优势。