在Python中理解和实现文本分类的综合指南 | 数盟

原文链接:https://www.analyticsvidhya.com/blog/2018/04/a-comprehensive-guide-to-understand-and-implement-text-classification-in-python/

介绍

在不同商业问题中广泛使用的自然语言处理任务之一是“文本分类”。文本分类的目标是自动将文本文档分类为一个或多个定义的类别。文本分类的一些例子是:

了解社交媒体的观众情绪,

检测垃圾邮件和非垃圾邮件,

自动标记客户查询和

将新闻文章分类为定义的主题。

目录

在本文中,我将解释关于文本分类和逐步过程以在python中实现它。

文本分类是监督机器学习任务的一个例子,因为包含文本文档及其标签的带标签的数据集用于训练分类器。端到端文本分类管道由三个主要组件组成:

1.数据集准备: 第一步是数据集准备步骤,其中包括加载数据集和执行基本预处理的过程。然后将数据集分成火车和验证集。

2.特征工程: 下一步是特征工程,其中原始数据集被转换成可用于机器学习模型的平坦特征。这一步还包括从现有数据创建新功能的过程。

3.模型训练: 最后一步是模型构建步骤,其中机器学习模型在标记数据集上进行训练。

4.提高文本分类器的性能:在本文中,我们还将看看提高文本分类器性能的不同方法。

注意:本文不深入讲述NLP任务。如果你想修改基础知识并回到这里,你可以随时阅读这篇文章。

准备好你的机器

让我们一步步实现基本组件,以便在python中创建文本分类框架。首先,导入所有必需的库。

您需要必要的库来运行此代码 – 您可以将它们安装在各自的官方链接中

熊猫

Scikit学习

XGBoost

TextBlob

Keras

#用于数据集准备,特征工程,模型培训的库

1.数据集准备

对于本文的目的,我是亚马逊评论的使用数据集,可以在此链接下载。数据集由3.6M文本评论及其标签组成,我们将仅使用一小部分数据。要准备数据集,请将下载的数据加载到包含两列(文本和标签)的熊猫数据框中。(来源

接下来,我们将把数据集分成训练集和验证集,以便我们可以训练和测试分类器。此外,我们将编码我们的目标列,以便它可以用于机器学习模型。

2.特色工程

下一步是特征工程步骤。在这一步中,将原始文本数据转换为特征向量,并使用现有数据集创建新特征。为了从我们的数据集中获得相关特征,我们将实施以下不同的想法。

2.1计数矢量作为特征

2.2 TF-IDF矢量作为特征

单词级别

N-gram水平

人物级别

2.3词嵌入作为特征

2.4基于文本/ NLP的特征

2.5主题模型作为特征

让我们仔细看看这些想法的实现。

2.1计数矢量作为特征

计数向量是数据集的矩阵符号,其中每行表示来自语料库的文档,每列表示来自语料库的术语,并且每个单元格表示特定文档中特定术语的频率计数。

2.2 TF-IDF矢量作为特征

TF-IDF分数表示文档和整个语料库中术语的相对重要性。TF-IDF分数由两部分组成:第一部分计算标准化术语频率(TF),第二部分是逆文档频率(IDF),计算方式为文集中文档数量除以编号的对数具体条款出现的文件。

TF(t)=(期限t在文件中出现的次数)/(文件中的期限总数)
IDF(t)= log_e(文件总数/包含期限t的文件数量)

TF-IDF矢量可以在不同级别的输入令牌(单词,字符,n元组)中生成,

一个。单词级别TF-IDF:  表示不同文档中每个术语的tf-idf分数的矩阵
b。N-gram等级TF-IDF:  N-grams是N个术语的组合。这个矩阵表示N-grams的tf-idf分数
c。字符级别TF-IDF:  代表语料库中字符级别n-gram的tf-idf分数的矩阵

2.3文字嵌入

单词嵌入是使用密集矢量表示来表示单词和文档的一种形式。向量空间中单词的位置是从文本中学习的,并且基于单词在使用时围绕单词的位置。可以使用输入语料库本身对词嵌入进行训练,也可以使用预先训练的词嵌入(例如Glove,FastText和Word2Vec)来生成词嵌入。他们中的任何一个都可以下载并用作传输学习。人们可以在这里阅读更多关于文字嵌入的知识  。

snnipet展示了如何在模型中使用预先训练的词嵌入。有四个基本步骤:

加载预训练词嵌入

创建一个标记器对象

将文本文档转换为令牌序列并填充它们

创建令牌及其各自嵌入的映射

您可以从这里下载预先训练的词嵌入

2.4基于文本/ NLP的功能

还可以创建一些额外的基于文本的功能,这有时对改进文本分类模型有帮助。一些例子是:

文档的字数 – 文档中的单词总数

文档字符数 – 文档中的字符总数

文档的平均字密度 – 文档中使用的单词的平均长度

完整论文中的Puncutation Count – 文档中标点符号的总数

完整论文中的大写字母计数 – 文档中大写字母的总数

在完整论文中标题字数 – 文件中正确的案例(标题)字的总数

词性标签的频率分布:

名词Count

动词数

形容词计数

副词计数

代数计数

这些功能是高度实验性的,只能根据问题陈述使用。

2.5主题模型作为功能

主题建模是一种从包含集合中最佳信息的文档集合中识别单词组(称为主题)的技术。我已经使用潜在Dirichlet分配来生成主题建模特征。LDA是一个从固定数量的话题开始的迭代模型。每个主题都被表示为一个词的分布,然后每个文档被表示为主题分布。虽然令牌本身没有意义,但由主题提供的单词的概率分布提供了文档中包含的不同想法的意义。人们可以在这里阅读更多关于话题模型

让我们看看它的实现:

 3.模型建立

文本分类框架的最后一步是使用上一步创建的特征来训练分类器。机器学习模型有很多不同的选择,可以用来训练最终模型。为此,我们将实施以下不同的分类器:

朴素贝叶斯分类器

线性分类器

支持向量机

套袋模型

提升模型

浅神经网络

深度神经网络

卷积神经网络(CNN)

长期短期模型(LSTM)

门控复发单元(GRU)

双向RNN

递归卷积神经网络(RCNN)

深度神经网络的其他变体

让我们实现这些模型并理解他们的细节。以下函数是可用于训练模型的效用函数。它接受训练数据的分类器,feature_vector,训练数据的标签和有效数据的特征向量作为输入。使用这些输入,训练模型并计算准确性分数。

 3.1朴素贝叶斯

使用具有不同特征的sklearn实现实现朴素贝叶斯模型

朴素贝叶斯是一种基于贝叶斯定理的分类技术,在预测变量中具有独立性假设。朴素贝叶斯分类器假定类中特定特征的存在与此处任何其他特征的存在无关  

3.2线性分类器

实现线性分类器(Logistic回归)

Logistic回归通过使用logistic / sigmoid函数估计概率来度量分类因变量与一个或多个自变量之间的关系。在这里可以阅读更多有关逻辑回归的内容

 3.3实现SVM模型

支持向量机(SVM)是一种有监督的机器学习算法,可用于分类或回归挑战。该模型提取了分离两个类的最佳超平面/线。人们可以在这里阅读更多

 3.4套袋模型

实现随机森林模型

随机森林模型是一种集合模型,特别是装袋模型。它们是基于树型模型系列的一部分。人们可以在这里阅读关于套袋和随机森林的更多信息

3.5增强模型

实施Xtereme梯度增强模型

增强模型是基于树的模型的另一种集成模型的一部分。Boosting是一种主要用于减少偏见的机器学习集成元算法,也是监督式学习中的变异,以及一系列将弱学习者转换为强大学习者的机器学习算法。一个弱学习者被定义为一个分类器,它只与真实分类稍有关联(它可以比随机猜测更好地标注示例)。在这里阅读更多关于这些模型

3.6浅神经网络

神经网络是一种数学模型,其设计与生物神经元和神经系统类似。这些模型用于识别标记数据中存在的复杂模式和关系。浅层神经网络主要包含三种类型的层 – 输入层,隐藏层和输出层。在这里阅读更多关于神经网络

3.7深度神经网络

深度神经网络是更复杂的神经网络,其中隐藏层执行比简单S形或Relu激活更复杂的操作。不同类型的深度学习模型可以应用于文本分类问题。

3.7.1卷积神经网络

在卷积神经网络中,输入层上的卷积被用来计算输出。这导致了本地连接,输入的每个区域都连接到输出中的神经元。每个图层应用不同的过滤器并组合其结果。

在这里阅读更多有关卷积神经网络的内容

3.7.2递归神经网络 – LSTM

与前馈神经网络中激活输出仅在一个方向上传播不同,神经元的激活输出在递归神经网络中在两个方向上(从输入到输出和从输出到输入)传播。这在神经网络架构中产生循环,其充当神经元的“记忆状态”。这种状态使神经元能够记住迄今为止学到的东西。

RNN中的记忆状态优于传统的神经网络,但称为消失梯度的问题与它们有关。在这个问题中,当学习大量图层时,网络很难学习和调整早期图层的参数。为了解决这个问题,已经开发了称为LSTM(长期短期记忆)模型的新型RNN。

阅读更多关于LSTMs的  信息

def create_rnn_lstm ():

3.7.3循环神经网络 – GRU

门控循环单元是另一种形式的递归神经网络。让我们在网络中添加一层GRU,而不是LSTM。

def create_rnn_gru ():

3.7.4双向RNN

RNN图层也可以包裹在双向图层中。让我们将GRU层包裹在双向层中。

def create_bidirectional_rnn ():

3.7.5递归卷积神经网络

一旦基本体系结构尝试完毕,就可以尝试这些层的不同变体,例如循环卷积神经网络。另一种变体可以是:

分层注意网络

注意力序列模型的顺序

双向递归卷积神经网络

有更多层数的CNN和RNN

def create_rcnn ():