如何用Spacy和Scikit-Learn进行情感分析

1,029 阅读11分钟

用Spacy和Scikit-Learn进行情感分析

情感分析是自然语言处理和文本分析的一个子集,用于检测文本中的积极或消极情绪。

情感分析帮助企业了解人们如何评价他们的业务以及他们对不同商品或服务的感受。

评估是利用其网站上的评论,以及监测在线对话进行的。

情绪分析被用来分析客户的反馈。它帮助企业确定客户对其产品是满意还是沮丧。

企业利用这些信息来改变他们的产品,以满足客户的需求。

在本教程中,我们将使用Spacy来建立我们的情感分析模型。我们将使用三个数据集:IMDBAmazon ,和Yelp

这些数据集包含被标记为正面或负面的评论。

此外,数据集包含来自IMDB数据集的电影评论,来自亚马逊数据集的产品评论,以及来自Yelp数据集的本地企业和社交网站评论。

前提条件

  1. 对[Python]有良好的理解。
  2. 有一些[机器学习]的知识。
  3. 具备一些[自然语言处理]的工作知识。

简介

根据模型的目标,有不同类型的情感分析。

  • 注重给定文本的极性的模型:正面、中性和负面。
  • 关注文本中的感觉和情绪的模型。
  • 关注客户的意图和紧迫性的模型。

根据这些目标,它们被进一步划分为以下几组。

  1. 标准情绪分析。
  2. 细粒度的情绪分析。
  3. 情感检测。
  4. 基于方面的情绪分析。
  5. 意图检测。

标准情绪分析

它检测一个给定文本的极性,要么是积极的,要么是消极的,要么是中性的。

例如。

  • "我喜欢使用你们的产品"。其极性是Positive.
  • "你的产品有很多问题"。极性是Negative.
  • "我愿意接受关于你的产品的进一步帮助"。极性是Neutral.

细致的情绪分析

它专注于给定文本的极性,但增加了更多的选项或类别,如。

  • 非常积极
  • 积极的
  • 中性
  • 负面的
  • 非常消极

举例来说。

  • "这是有史以来最好的产品"。其极性是Very Positive.
  • "这个产品很恶心"。极性是Very Negative.

情感检测

这种类型检测给定文本中的情绪和情感。例如,情绪可以是快乐或愤怒。

例如。

  • "这个产品让我的工作更轻松"。这表明Happiness.
  • "它毁了我的日程安排,给我带来痛苦"。这表明Anger.

基于方面的情感分析

基于方面的情感分析(ABSA)是一种文本分析技术,它按方面对数据进行分类,并确定归属于每个方面的情感。

基于方面的情感分析可以通过将特定的情感与产品或服务的不同方面联系起来分析客户反馈。

方面是一个产品或服务的属性或组成部分。比如说。"一个新产品的用户体验","查询或投诉的响应时间",或 "新软件的整合难度"。

方面情感分析很重要,因为它可以帮助公司对客户数据进行分类和分析,使客户支持任务等流程自动化,并从客户评论中获得强大的洞察力。

意图检测

这着重于客户的目标和给定语句背后的意图。这被应用于聊天机器人系统,以提供更好的答案和帮助。

比如说。

  • "这个应用程序一直在崩溃。我应该怎么做?"。这表明 "需要援助"。

在本教程中,我们将建立一个standard sentiment analysis 模型。

使用的数据集

如前所述,我们正在使用三个数据集。IMDB数据集、亚马逊数据集和Yelp数据集。

这些数据集包含不同产品或服务的评论。这些评论被标记为1 ,以显示一个positive ,或0 ,以显示一个negative 的评论。

我们的数据集是文本格式的,这很容易被我们的模型阅读和使用。

下面是三个文本格式的数据集的剪影。

Amazon dataset snip

IMDB dataset snip

Yelp dataset snip

下载完这三个数据集后,让我们把它们加载到我们的机器中。

加载数据集

我们使用Pandas 包来加载我们的数据集。Pandas是用来进行数据处理和分析的。

import pandas as pd

让我们使用Pandas 来读取我们的三个数据集,如下图所示。

df_yelp = pd.read_table('yelp_labelled.txt')
df_imdb = pd.read_table('imdb_labelled.txt')
df_amz = pd.read_table('amazon_cells_labelled.txt')

由于我们有三个不同的数据集,我们必须把它们串联起来。

frames = [df_yelp,df_imdb,df_amz]

添加标题

我们的数据集没有标头。我们需要将我们的数据集分成两列,并给它们起标题名称。

它将有两列。第一列名为Message ,将包含实际的评论文本,而另一列名为Target ,将包含10 的标签。

for colname in frames:
    colname.columns = ["Message","Target"]

让我们打印列的名称,如下所示。

for colname in frames:
    print(colname.columns)

输出结果是,如下图所示。

Index(['Message', 'Target'], dtype='object')
Index(['Message', 'Target'], dtype='object')
Index(['Message', 'Target'], dtype='object')

由于我们合并了三个数据集,我们需要给我们的数据集分配键来区分它们。该数据集属于三个组Yelp,IMDB, 和Amazon

keys = ['Yelp','IMDB','Amazon']

用键来合并或串联我们的数据集

我们在上节中创建了三个键。Yelp,IMDB, 和Amazon 。然后,我们将键的列表添加到我们的数据集。

由于我们已经合并了三个数据集,这些键使模型能够知道每个数据集的归属地。这使得我们的模型在训练阶段容易理解和使用数据集。

df = pd.concat(frames,keys=keys)

要查看合并后的钥匙和数据集的输出,请使用这个命令。

df.head()

Output

上面的输出显示了添加到我们的数据集的键。该输出还显示了两个额外的列,MessageTarget ,标记为01

现在我们已经准备好了数据集,我们现在可以从数据集中删除停止词。

删除停顿词

停顿词是一种语言中的一组常用词。它们的分类能力较低,因为它们不是唯一的,使模型有偏差。

我们使用Spacy去除停顿词。首先,让我们把Spacy安装到我们的机器上。

因为我们在本教程中使用的是Google Colab,所以我们用这个命令来安装Spacy。

!pip install -U spacy

安装完Spacy后,让我们导入这个库。

import spacy
from spacy.lang.en.stop_words import STOP_WORDS
nlp = spacy.load('en')

在上面的代码中,我们已经导入了以下内容。

Spacy

这是我们将用于情感分析的库

停止词

这个包是用来删除数据集中的停顿词的。

我们还使用spacy.load('en') ,指定使用的语言为英语。

让我们列出我们的数据集中的所有止损词。

stopwords = list(STOP_WORDS)

让我们来删除这些停顿词。

for word in stopwords:
    if word.is_stop == False and not word.is_punct:

上面的代码片段删除了数据集中的停顿词。在循环浏览数据集之后,它还使用word.is_punct 删除了所有的标点符号。

加载机器学习包

让我们导入所有用于建立我们模型的包。我们将使用Scikit-learn 来建立模型。

import CountVectorizer,TfidfVectorizer from sklearn.feature_extraction.text
import accuracy_score from sklearn.metrics
import train_test_split from sklearn.model_selection
import TransformerMixin from sklearn.base
import LinearSVC from sklearn.svm
import Pipeline from sklearn.pipeline

在上面的代码中,我们已经导入了以下内容。

  1. CountVectorizer
  2. TfidfVectorizer
  3. 准确率_score
  4. train_test_split
  5. 变换器混合器
  6. 线性SVC
  7. 输送线

计数器

这个软件包用于将我们数据集中的文本转化为向量中的数值。与文本相比,这些数字值可以被模型更快速地访问。

TfidfVectorizer

TF-IDF(frequency-inverse document frequency)是一个统计指标,用于评估一个词在文档集合中的相关程度。

如果一个词在一个给定的文件中很常见,在其他文件中也很常见,这表明它在进行预测时的力量较小。

相反,如果一个词在一个文件中是唯一的,这表明它在分类和预测分析中具有更大的力量。

准确度_分数

这个包用来计算模型在进行预测时的准确性。

train_test_split

用于将我们的数据集分成训练集和测试集。

TransformerMixin

这是在训练阶段用来将模型融入数据集。它确保我们的模型能够学习到数据集中的模式。

LinearSVC

这是用于建立模型的支持向量机算法。它使用LinearSVC方法将我们的模型与数据拟合,并产生最佳拟合效果。

管线

管道是机器学习的一个重要方面。它将一些功能自动化,如CountVectorizerTfidfVectorizerTransformerMixinLinearSVC

这使得模型建立过程更快、更容易,因为所有的阶段都被捆绑在一起,成为一个单元过程。

让我们从TransformerMixin 开始使用这些导入的包。

为了实现数据转换器,我们需要创建一个自定义类。

自定义转化器类

class transformers(TransformerMixin):
    def data_transform(X_train, Y_train):
        return [clean_text(text) for text in X]
    def model_fit(X=text, y=text_set,):
        return text
    def set_params(best_params, set=True):
        return {}

def text_cleaning(text):
    return clean_text.label().lower_case()

上面的transformers 类有以下功能。

data_transform

它使用X_trainY_train 检查数据集中的参数。然后将它们转换为模型能够理解的结构。

model_fit

它将模型拟合到数据集中。这使得模型能够通过理解数据集中的模式来学习。

set_params

这个方法检索所有转换和优化的参数,以产生一个优化的模型。

文本清理(text_cleaning

这个函数清理我们的数据集,并将所有的文本转换为小写。

让我们进入下一个阶段。

矢量化和分类器

在矢量化中,我们使用CountVectorizer ,将我们的文本数据集转换为数字向量。

分类器是用于建立模型的算法。在这种情况下,我们使用的是LinearSVC

这是支持向量机算法所使用的分类方法。

vectorizer = CountVectorizer(tokenizer = spacy_tokenizer, ngram_range=(1,1))
classifier = LinearSVC()

TfidfVectorizer方法

这是用来检查一个给定的词在我们的数据集中的使用频率。

tfvectorizer = TfidfVectorizer(tokenizer = spacy_tokenizer)

特征和标签

特征是我们数据集中的独立变量,在建立我们的模型时被用作输入。在我们的案例中,Message 列将是我们的特征。

标签是我们想要预测的东西。在我们的案例中,我们试图预测一个特定评论的情绪。positive 所以输出可以是1 ,也可以是0 ,也可以是negative

在我们的案例中,Target 列将是标签。

X = df['Message']
ylabels = df['Target']

数据集的拆分

我们把我们的数据集分成训练集和测试集。本教程使用数据集的75% 作为训练集,25% 作为测试集,如下图所示。

X_train, X_test, y_train, y_test = train_test_split(X, ylabels, test_size=0.25, random_state=42)

让我们建立我们的管道来自动完成所有这些过程。

创建管道

该管道将清理我们的数据集,将我们的文本向量化为数值,最后将我们的评论分类为positivenegative

pipe = Pipeline([("cleaner", predictors()),
                 ('vectorizer', vectorizer),
                 ('classifier', classifier)])

让我们用我们的管道来把我们的模型装入训练数据集,如图所示。

pipe.fit(X_train,y_train)

训练之后,输出如图所示。

Pipeline(memory=None,
     steps=[('cleaner', <__main__.predictors object at 0x7fee6cac3f98>), ('vectorizer', CountVectorizer(analyzer='word', binary=False, decode_error='strict',
        dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
        lowercase=True, max_df=1.0, max_features=None, min_df=1,
        ng...ax_iter=1000,
     multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
     verbose=0))])

现在让我们计算一下我们的模型的准确度分数。

准确率得分

print("Accuracy: ",pipe.score(X_train,y_train))

输出如下图所示。

Accuracy:  0.9849726775956285

这表明我们的模型的准确率为98.497% 。这是一个很好的分数,表明我们的模型有较高的机会做出正确的预测。

进行预测

我们现在使用我们的模型来看看我们是否能将一篇评论归类为positivenegative

pipe.predict(["I recommend this movie to watch, it's great"])

预测的输出如图所示。

array([1])

输出是1 ,这是一个positive 的评论。

让我们尝试另一个样本文本。

example = ["I love this product so much",
 "What an inferior item! I will purchase a new one",
 "I feel happy when using your product!"]

让我们看看预测的结果。

array([1, 0, 1])

这表明,数组中的第一句话是positive ,第二句话是negative ,最后一句话是positive

在这个例子中,所有这些情况都是真的。这表明我们的模型可以做出准确的预测。

总结

在本教程中,我们已经学习了用Spacy和Scikit-learn进行情感分析。我们首先学习了情感分析和它对企业的重要性。

我们还讨论了情感分析的不同类型。在本教程中,我们重点讨论了标准情感分析。

然后,我们转向数据集清洗,并使用最终的数据集来建立我们的情感分析模型。

接下来,我们执行了建立模型所需的所有步骤,最后使用管道方法来自动完成模型建立中涉及的所有过程。

最后,我们使用我们的模型进行预测。例如,我们的模型能够将一篇评论归类为positivenegative

使用上述步骤,读者应该能够使用Spacy和Scikit-learn建立一个情感分析模型。