赞
踩
来源 | Natural Language Processing for Beginners
作者 | AI Publishing
翻译 | 悉尼没睡醒
校对 | gongyouliu
编辑 | auroral-L
全文共2355字,预计阅读时间30分钟。
第十二章 使用最先进的NLP技术BERT Transformers进行文本分类
1. 介绍
2. 为什么要使用 BERT ?
3. BERT 文本分类步骤
4. BERT 标记化和嵌入
5. 使用 BERT 进行文本分类
1. 介绍
尽管词嵌入和循环神经网络(如 LSTM)已被证明对于各种自然语言处理任务(如文本分类)非常有效,但基于 LSTM 和 CNN 的文本分类系统仍存在一些问题。
使用 LSTM,数据只能在一个方向以顺序方式读取。虽然双向 LSTM 通过向前和向后读取数据解决了这个问题,但文本仍然是顺序处理而不是并行处理。这就是Transformer模型发挥作用的地方。Transformer 模型依靠注意力机制并行处理整个文本文档。
在注意力机制中,不是按顺序处理文本,而是并行处理文本,这允许注意力系统以并行方式为文本的重要部分分配权重。
到目前为止,已经开发了几种Transformer模型。但是,在本章中,你将学习 BERT,它代表 Google 开发的(Bidirectional Encoder Representations from Transformers)。
2. 为什么要使用 BERT?
你应该想到的一个问题是,为什么我们要使用 BERT 而不是传统的词嵌入和基于 LSTM 的神经网络?
这个问题的答案是 BERT 模型能够生成捕获本地上下文的单词表示。例如,对于词嵌入,即使我们谈论“apple Iphone”或将 apple 作为水果,“apple”一词的表示也是相同的。使用 BERT,将生成不同的单词表示。此外,BERT 模型将单词分为词干和叶片段。例如,“Judgmental”一词被视为两个独立的标记 “Judgement”和“al”,这使得词的表示更加灵活。
3. BERT 文本分类步骤
通常,BERT 模型用于生成文本表示,然后你可以将其与 LSTM 或 CNN 网络一起使用来构建文本分类或任何其他类型的模型。但是,BERT 还包含序列分类模型,也可用于对文本进行分类。
使用BERT序列模型进行文本分类涉及的步骤如下:
1. 第一步,你必须生成 BERT tokens。为此,你可以使用 BERT Tokenizer。
2. 第二步是将数据转换成BERT模型可以使用的格式,并使用BERT进行词嵌入。
3.为BERT创建一个序列分类模型。
4. 训练序列分类模型。
5. 在测试集上评估模型。
4. BERT Tokenization和嵌入
在本节中,你将看到如何使用 BERT 分词器执行分词。BERT 模型需要 3 维格式的数据,其中包含输入 id、注意力掩码和Token类型 id。本节稍后将详细介绍这些属性。
你将使用 Hugging Face 中的转换器库。可以通过以下脚本安装转换器库。
! pip install transformers
接下来,为了标记(tokenize )文本,我们需要从transformers模块中导入 BertTokenizer 类,如下所示:
快速的方法是为分词器加载预训练的词嵌入。以下脚本创建一个带有预训练嵌入的 BERT 分词器对象。接下来,我们定义一个示例句子并将最大句子长度设置为 25。
要对句子进行分词,你可以使用 BERT 分词器的 tokenize() 方法,如下所示。此外,对于 BERT,每个句子都应以“[CLS]”标签为前缀,并以“[SEP]”标签结尾,如下所示:
以下输出显示了一个标记化的句子。
接下来,你需要将文本标记转换为整数格式。为此,你可以使用 BERT 标记器的 convert_tokens_to_ids() 方法,如下所示:
示例输入句子中单词的 id 如下。
我们需要对输入的句子应用填充,以便所有的句子都具有相同的长度。以下脚本计算示例句子的填充长度。由于最大句子长度设置为25,输入句子包含16个token,pad长度为9,如下图:
以下脚本在输入 ids 令牌 ids 的末尾添加 9 个 0。
注意掩码是一个由 0 和 1 组成的列表,其中 1 被添加到包含原始对象的位置,而 0 被添加到填充(paddings)索引。
如果输入中有两个句子,则token类型 ID 用于将输入句子与输出句子分开。第一个句子的索引加零,而另一个句子的索引加1。由于我们只有一个句子,因此我们只会为令牌类型 id 创建一个全 0 的列表。
最后,为了为 BERT 模型创建一个完整的输入,创建了一个包含令牌 ID、token类型 ID 和注意力掩码的字典,如下所示。
你可以简单地使用 BertTokenizer 对象的 encode_plus 函数,而不是手动创建正确格式的输入数据,如下所示:
以下输出类似于我们手动准备 BERT 输入数据时实现的输出。
5. 使用 BERT 进行文本分类
在前面的章节中,你看到了如何使用机器学习和简单的 LSTM 进行文本分类。在本节中,我们将使用 BERT 将 IDMB 电影评论分类为正面或负面评论。
以下脚本导入所需的模块并确保正在使用 Google Colab 的 GPU。请记住,BERT 转换器需要大量时间来训练。因此,请始终尝试在 GPU 甚至 TPU 上执行它们。
以下脚本导入包含我们数据的 Google Drive。
同样,以下脚本导入 IDMB 数据集并显示其标题。
我们需要清洗文本评论,因为它包含 HTML 标签和特殊字符。以下方法定义了 clean_text() 方法,该方法用于清洗文本评论。
以下脚本清洗文本评论并将情绪列中的正面和负面情绪分别替换为 1 和 0。
以下是数据清洗和将情感值转换为 1 和 0 后数据集的外观。
现在让我们从 Hugging Face 安装Transformer库。
使用以下脚本从transformer库中导入 TFBertForSequenceClassification 和 BertToknizer 类。
以下脚本将数据划分为训练集和测试集。
上面的输出显示,40,000 条评论将用于训练,而 10,000 条评论将用于测试分类模型。让我们创建一个 BertTokenizer 类的对象。
正如标记化部分所述,BERT 模型的输入是 3 维的,由输入 id、token类型 id 和注意力掩码组成。下面定义了 text_to_bert_input() 方法,该方法接受纯文本并返回输入 id、token 类型 id 和注意力掩码的列表。
max_length 为 128,这意味着只有每个评论的前 128 个词将用于分类。
以下脚本调用 text_to_bert_input() 方法并将训练集和测试集转换为可用作 BERT 模型输入的格式。
由于我们使用 TensorFlow 后端来训练 BERT 模型,因此我们需要将输入数据转换为张量。以下脚本为训练集和测试集执行此操作。
接下来,你需要定义分类模型。使用 Hugging Face 的转换器库,你可以使用 TFBertForSequenceClassificaion 类来创建文本分类模型。定义损失、优化器和评估指标的过程类似于任何其他 TensorFlow 模型。以下脚本创建 BERT 文本分类模型并在输出中显示模型摘要。
最后,你可以在模型对象上调用 fit 来训练 BERT序列分类模型。
输出显示,使用 BERT 分类器仅在一个 epoch 后就达到了 89.69 的最大准确率。在第8章第1节中,使用随机森林算法预测IMDB数据集的电影情感,达到了83.5的测试准确率。在第 10 章第 2 节中,使用卷积神经网络对 IMBD 评论进行分类,其准确率80.78%。
通过 BERT 实现的准确度高于两种模型的基线,仅使用序列的前 128 个单词。
进一步阅读——BERT
要研究有关用于文本分类的词 BERT 的更多信息,请参阅这些链接:
https://bit.ly/3imHI9w
https://bit.ly/2BrBPYghttps://bit.ly/31Jsg1d
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。