本文介绍: 这是一个关于 NLP 和分类项目博客。NLP 是自然语言处理,目前需求量很大。让我们了解如何利用 NLP。我们将通过编码来理解流程概念。我将在本博客介绍 BagOfWords 和 n-gram 以及朴素贝叶斯分类模型。这个博客的独特之处(这使得它很长!)是我已经展示了如何根据我们手中的数据集为我们选择正确模型。那么,让我们开始吧。

一、说明

        这是一个关于 NLP 和分类项目博客。NLP 是自然语言处理,目前需求量很大。让我们了解如何利用 NLP。我们将通过编码来理解流程概念。我将在本博客介绍 BagOfWords 和 n-gram 以及朴素贝叶斯分类模型。这个博客的独特之处(这使得它很长!)是我已经展示了如何根据我们手中的数据集为我们选择正确模型。那么,让我们开始吧。

当编码时出现我们的需求时,我们将导入所需的库。首先,让我们导入 pandasnumpy、matplotlib、seaborn、regex 和 random 库,这些库都被广泛使用

我从 Kaggle 下载了电影评论数据集。电影数据集是情感分类学习最常用的数据集。我还将在一个单独的博客中向您展示实时项目的情绪分类。现在让我们继续我们的学习吧。

现在,请记住,标记为 1 的情绪是积极的,标记为 0 的情绪是消极的。这就是它的标签方式,当您从网站下载它时,您将获得此信息。现在我们将开始稍微探索一下数据集。

数据集不包含空数据。对我们好!让我们继续看看正面和负面反馈的数量。

负面评论4318条,正面评论4170条。由于两种类型的反馈的存在几乎相同,因此我们不会在数据集中执行采样。但是,如果我们进行采样,我们可能会获得更高的准确性。让我们绘制情绪数字

        现在我们进入有趣的部分了!处理文本。我将首先向您展示词袋方法。那么它是什么?
当我们使用文本数据时,我们没有在结构化表格数据中看到的功能。因此,我们需要一些措施来从文本数据中获取特征。如果我们可以从一个句子中取出每个单词,并获得某种度量,通过它我们可以找出该单词是否存在于另一个句子中及其重要性,该怎么办?通过称为“词袋模型”的过程,这当然是可能的。也就是说,我们的电影评论数据集中的每个句子都被视为一个词袋,因此每个句子被称为一个文档。所有文档共同构成一个语料库。

        如果这听起来让您感到困惑,请不要担心!这个解释会让事情变得更清楚 -我们将首先创建一个包含语料库中使用的所有唯一单词的字典(这意味着数据集中存在的所有文档评论)。在计算字数时,我们不考虑像 the、an、is 等语法,因为这对于理解文本上下文没有任何重要意义。然后,我们将所有文档(个人评论转换向量,该向量将表示特定文档中字典中单词的存在。BoW 模型中可以通过三种方式来识别单词的重要性 –

        计数向量模型将计算整个句子中单词出现的次数。直观地理解会更好,所以假设我们有以下语句
review1 = ‘电影非常非常好’
review2 = ‘电影令人失望’
        在计数向量模型中,评论将这样显示 –

        词频模型 – 在此模型中,每个文档(或句子)中每个单词的频率是相对于整个文档中观察到的单词总数来计算的。它的计算公式为 –
TF = 第 i 个文档中单词出现的次数 / 第 i 个文档中单词的总数

        术语频率-逆文档频率模型 – TFIDF 衡量特定句子中单词的重要性。句子中某个单词的重要性与其在文档中出现的次数成正比,与整个语料库中同一单词的出现频率成反比。它的计算公式为 –
TF-IDF = TF x ln (1+N/Ni),其中 N 是语料库中的文档总数,Ni 是包含单词 i 的文档。

这代表我们的数据集中存在 48618 个独特特征。这是因为我们没有清除不需要的文本。我们最终会这样做。让我们继续前进!

正如我们所看到的,这些是特征名称,而不是它的向量形式。我们必须将特征转换成向量形式。

从形状中我们可以看出,所有 8488 个文档都由 48618 个特征(即唯一词)表示。对于文档中出现的单词,对应的特征将携带该单词在文档中出现的次数。如果该单词不存在,则该特征的值为 0。结果我们发现向量数据中有很多 0。为了知道特征向量中存在的 0 的数量,请执行以下操作

我们的特征向量中的非零值太少了!大部分都是零!您可以将稀疏矩阵可视化如下 –

现在我们将再次从头开始,即我们将再次调用 countvectorizer,但这次使用 stop_words 的附加参数,这将阻止停用词出现在计数向量中 –

之前,特征数量为 48618 个,现在为 48473 个。略有减少。我们需要减少更多。让我们先看看一些功能名称 –

如果我们研究这些特征,我们会发现有许多非英语单词和数字正在污染数据集。让我们把它们清理干净——

现在最好将评论句子中的所有单词转为小写,然后删除停用词,因为由于大小写的差异,向量化器倾向于创建两个向量来表示 hello 和 HELLO。

句子现在是 df[‘text’] 的干净形式。让我们在从句子中删除停用词后应用 counvectorizer 并观察特征的差异。

特征从 48473 减少到 47672。差别不大!让我们看看该功能及其计数一次 –

正如我们所看到的,有些评论并不具有任何此类意义。我们将摆脱那些。我们先来了解一下词干分析器和词形还原的含义。

让我们首先使用词干分析器。有两种算法 – PorterStemmer 和 LancasterStemmer

这里我们可以看到特征从 47672 减少到 32342。现在让我们使用词形还原。我们将使用 WordNetLemmatizer 算法

这里,我们将使用 PorterStemmer 进行词干提取。也许您可以使用词形还原而不是 PorterStemmer 来找出您得到的结果有什么不同!好吧,现在让我们创建一个函数,它将完成我们迄今为止看到的所有这些任务,并给出句子的最终结果

让我们分割数据集,现在我们将使用分类来进行情感分析。我们在这里使用朴素贝叶斯分类 –

我们将构建两种类型的朴素贝叶斯分类器并比较准确性。首先是 GaussianNB –

我们的模型经过训练。现在让我们来做一下预测——

好的!现在让我们检查一下准确性 –

有 194 个假阴性,结果不太好!我们模型的准确度很低。这可能是一些奇怪评论的结果。让我们检查训练集的准确性以检查是否过度拟合 –

显然,该模型过于拟合。现在让我们在处理数据之前应用另一个 NB 分类模型 –

行显示数据中的实际标签,列显示预测标签。由此,我们可以看到有 111 个正面陈述被错误地归类为负面,即 False Negative。有 50 个否定陈述被归类为表示误报的肯定陈述。这表明 BernaulliNB 可能是该数据集的更好模型。

使用该模型,测试精度也显着提高!让我们检查一下是否过度拟合 –

过度拟合仍然存在,尽管比以前减少了很多。我们来看看完整的分类报告——

现在我们可以想一些办法来进一步提高准确性。我们可以做什么?让我们尝试更改 BagOfWord 模型。到目前为止我们一直在使用 CountVectorizer,让我们使用 tf idf 矢量化器并看看差异 –

因此,我们看到对于该数据集,最好使用 BernoulliNB 模型,而不是高斯模型。此外,模型性能不会随着矢量类型的变化而发生显着变化。因此,我们现在将使用除 BogOfWords 之外的其他形式的词向量化并查看变化。

BoW模型忽略句子结构或句子中的单词序列。n-grams 模型可以解决这个问题。单词的含义可能会根据其前面或后面的单词而变化。例如,在“我不高兴”这句话中,这个不高兴应该被视为一个单元,而不是两个单独的单词。n-gram 解决了这个问题,它是 n 个单词的连续序列。当两个连续的单词被视为一个单元时,它被称为二元组,对于三个连续的单词被视为一个单元,它被称为三元组,依此类推。现在让我们使用 n-gram —

在途中您可以看到误报和漏报的数量减少了!

更改矢量化器类型并使用 Bernaulli 后,我们能够达到 82.4% 的精度。我们的准确率从 62.5% 跃升至 82.4%。可能存在一点过度拟合。因此,让我们先尝试清理数据集 –

现在让我们执行矢量化器和分类器 –

正如我们在尝试所有方法后所看到的,我们得出的准确率为 82.3%,训练数据的准确率为 89.8%。这表明模型中仍然存在一点过度拟合。我们可以尝试 GridSearchCV 来获取模型的最佳参数。但我会继续使用 82.3% 的准确率,这对于我们获得的训练准确率来说非常好。

让我们用完整的未见过的数据来测试模型。

正如我们所看到的,根据我们的数据输入,负面和正面的预测正确的,这对于我们的模型来说是看不到的。现在您可以使用上述过程创建您自己的文本分析模型。快乐编码:)

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注