使用 BERT 进行特征提取以进行文本分类

使用 BERT 进行特征提取以进行文本分类

使用 Pytorch 和 Hugging Face 从预训练模型中提取信息

目标

让我们从定义这篇动手文章的目的开始。我们希望构建一个模型,将一个或多个文档作为输入,并设法按内容对其进行分类。
一些类别例如:政治、旅游、体育等。
为此,我们希望使用预训练模型,例如 BERT。

使用 BERT 进行特征提取以进行文本分类


背景

BERT 是一种基于 Transformer 编码器的语言模型。如果您不熟悉变形金刚,我建议您阅读这篇精彩的文章

简而言之,伯特

  • 它将一个或多个句子的嵌入标记作为输入。
  • 第一个标记始终是称为[CLS]的特殊标记。
  • 这些句子由另一个称为[SEP]的特殊标记分隔。
  • 对于每个令牌,BERT 输出一个称为隐藏状态的嵌入。
  • Bert 接受了蒙面语言模型下一句预测任务的培训。

掩码语言模型 (MLM)中,输入词(或标记)被掩码,BERT 必须尝试找出被掩码的词是什么。对于下一句预测 (NSP)任务,BERT 输入两个句子,他必须弄清楚第二个句子在语义上是否跟从第一个句子。

对于像我们这样的分类问题,我们只对与初始标记 [CLS] 相关的隐藏状态感兴趣,它以某种方式比其他标记更好地捕获了整个句子的语义。所以我们可以使用这个嵌入作为我们在它之上构建的分类器的输入。

使用 BERT 进行特征提取以进行文本分类


从上图中可以看出,我们将使用更轻量级的 BERT 版本,称为DistilBERT。这个蒸馏模型比原始模型小 40% ,但在各种 NLP 任务上仍保持约 97% 的性能。
您可以注意到的另一件事是,BERT 的输入不是原始单词而是标记。BERT 简单地关联了一个对文本进行预处理的标记器,以便它对模型具有吸引力。单词通常被拆分为子词,此外还添加了特殊标记
[CLS]表示句子的开头,[SEP]分隔多个句子,以及[PAD]使每个句子具有相同数量的标记。

如果您想了解有关 Bert 或他的 wordpiece 标记器的更多信息,请联系芯媒。

数据集

我们将使用的数据集称为BBC 全文文档分类 ,可在 Kaggle 上公开访问。

该数据集包含 2225 条记录,共包含 5 个类别。我们要确定的五个类别是体育、商业、政治、科技和娱乐。

直接从 colab 下载 kaggle 数据集。(记得上传你的个人 kaggle 密钥)

我不会详细介绍如何读取这些数据并将其转换为数据框,但我假设您可以创建一个包含两列的 daframe:short_descriptioncategory。

编码标签

该数据集具有诸如:政治、体育等标签
我们需要通过简单地使用标签编码器
将这些标签转换为数字。

生成文本嵌入

为每个文本生成一个嵌入向量,该向量可以用作我们最终分类器的输入。与每个文本关联的向量嵌入只是 Bert 为 [CLS] 标记输出的隐藏状态。

让我们从HuggingFace导入模型和分词器开始。

现在我们必须对文本进行标记。请记住以这种方式定义填充,每个标记化的句子将具有相同的长度和截断,因此如果句子太长,它将被截断。最后一个参数是返回一个 PyTorch 张量。

对文本进行标记的结果将是一个字典,其中包含input_ids,即以数字表示的标记,以及告诉我们标记是否为 [PAD]的attention_mask 。

通过运行模型获取文本 ([CLS]) 隐藏状态。

构建分类器

达到这一点后,您可以通过将隐藏状态作为输入并要求它预测标签来使用您最喜欢的分类器。在这种情况下,我将使用 RandomForest。

这个分类器的性能不会很好,因为我们使用的数据很少,也没有对分类器做太多的工作。但出于好奇,我建议您将其与随机预测标签的虚拟分类器进行比较。

后续想法

在这篇动手文章中,我们看到了如何利用预训练模型的功能在很短的时间内创建一个简单的分类器。
请记住,我们训练的只是最终的分类器,即随机森林。
另一方面,Bert 仅用于推理以生成以某种方式捕获文本主要特征的嵌入,这就是我们说我们使用特征提取方法的原因。
但是我们可以训练 Bert 自己教他如何在我们的具体案例中创建更好的文本嵌入吗?当然!在下一篇文章中,将展示如何对(Distil)BERT 进行微调!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章