如何使用Neattext和Scikit-learn建立一个基于NLP的情感检测模型

327 阅读9分钟

如何使用Neattext和Scikit-learn建立一个基于NLP的情感检测模型

自然语言处理帮助计算机像人一样理解语音和书面文字。这使得机器能够计算出必要的反应。许多NLP的应用之一是文本中的情感检测。

情感检测模型是一种用于检测给定文本中感觉和态度类型的模型。它可能是一种快乐、悲伤、恐惧、愤怒、惊讶、厌恶或羞愧的感觉。

情感检测模型可以将一个文本分类为以下类别。通过使用文本中的情感检测,企业可以知道客户对其品牌和产品的感受。这有助于企业改善产品质量和服务提供。

在本教程中,我们将使用Neattext和Scikit-learn来建立我们的模型。Neattext是一个Python库,用于预处理我们的数据集。Neattext将通过去除停止词和其他噪音来清理文本数据集。

这使得模型在训练期间更容易使用数据集。我们将使用Scikit-learn来建立我们的模型。它包含分类所需的所有算法。这是一个从数据预处理到模型建立和测试的实用指南。

前提条件

读者必须了解以下内容才能跟上。

  • [Python]编程。
  • 如何建立[机器学习模型]。
  • 如何使用[Pandas]和[Numpy]。
  • 有一些[自然语言处理]的知识。

注意:在本教程中,我们将使用Google Colab来建立我们的模型。

探索我们的数据集

在本教程中,我们将使用一个数据集,其中包含各种带有不同情绪标签的文本。该数据集有八个情绪标签,命名如下:快乐、悲伤、恐惧、愤怒、惊讶、中性、厌恶和羞耻。该数据集将在训练阶段使用。然后,训练好的模型将被用来将给定的文本分类为情感标签。

下面是数据集的一个片段。

Dataset snip

要获得CSV格式的数据集,请点击这里

下载完数据集后,我们现在可以将其加载到我们的Google Colab笔记本中。

加载探索性数据分析包

我们导入两个探索性数据分析包,PandasNumpy 。我们将使用pandas来读取我们的CSV文件并将其加载到我们的Google Colab笔记本中。Numpy与数组一起工作,用来对我们的数据进行数学计算。

import pandas as pd
import numpy as np

我们使用pandas 来加载我们的数据集。

加载数据集

使用下面的命令来加载数据集。

df = pd.read_csv("emotion-dataset.csv")

要查看数据集的结构,使用这个命令。

df.head()

输出结果如下图所示。

Dataset structure

上面的图片显示,我们的数据集有两列:EmotionTextEmotion 列代表各种情感标签。Text 列显示了我们数据集中的所有文本。

为了显示每种情绪的值计数,运行下面的代码。它将给你每个emotion 标签的文本总数。

df['Emotion'].value_counts()

其输出结果如下所示。

Value count

我们现在可以开始使用Neattext清理我们的数据集。

开始使用Neattext

如前所述,Neattext是一个Python库,用于预处理我们的数据集。Neattext将通过去除停止词和噪音来清理文本数据集。

要安装Neattext,请运行这个命令。

!pip install neattext

我们导入neattext ,如下所示。

import neattext.functions as nfx

为了使用neattext ,我们列出了neattext 用于数据清理的所有方法和属性。

dir(nfx)

方法和属性的输出如下所示。

Methods and attributes

我们只对列表中的两个方法感兴趣,即remove_stopwordsremove_userhandles

删除用户手柄

数据集包含了一些不同用户的Twitter手柄。这些手柄是不必要的,被认为是我们数据集的噪音。我们使用remove_userhandles ,将它们从我们的数据集中删除。

df['Clean_Text'] = df['Text'].apply(nfx.remove_userhandles)

我们使用apply() 方法来添加remove_userhandles 。我们将清理后的数据集保存在一个新的列中,命名为Clean_Text

删除止损词

停止词是任何语言中所有常用词的列表。在训练过程中,停顿词携带的有用信息很少,对模型的影响也很小。这些词在训练中会导致模型的偏差。删除止损词可以消除不重要的词,使应用程序能够专注于必要的词。

常见的停顿词就像特定语言的文章。它们包括英语中的单词:theisandare

df['Clean_Text'] = df['Clean_Text'].apply(nfx.remove_stopwords)

在本节中,我们还使用apply() ,以增加remove_stopwords 。我们将清理后的数据集保存在一个新的列中,命名为Clean_Text

为了得到清洁数据集的输出,运行这个命令。

df

删除用户手柄和停止词后的数据集的输出如下所示。

Clean dataset

现在我们清理了我们的数据集,我们现在可以加载我们的机器学习包。

导入机器学习包

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_trainy_train

模型拟合

为了将管道阶段拟合到x_trainy_train ,运行这段代码。

pipe_lr.fit(x_train,y_train)

Pipeline 将自动运行以下阶段并产生以下输出。

Pipeline ouput

这个过程会产生最佳的模型,会得到最好的结果。随着时间的推移,该模型将自行改进,并给出更好的预测结果。

建立模型后,我们检查由我们的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 过程和模型构建自动化。

最后,我们用这个模型做了准确的预测。任何企业都可以采用这个模型,并使用它来监测客户的在线对话和评论。这给企业在如何提高他们的品牌形象方面带来了额外的优势。