【NLP】使用Transformer模型进行文本分类

作者 | Eric Fillion

编译 | VK
来源 | Towards Data Science

f46d7b9ae479ac59c3d00fb74b28e1cc.png

文本分类是NLP最常见的应用。与大多数NLP应用一样,Transformer模型近年来在该领域占据主导地位。

在本文中,我们将讨论如何使用Python包(我是名为Happy Transformer的主要维护者)实现和训练文本分类Transformer模型,该包只需几行代码。

Happy Transformer构建在Hugging Face的transformers库之上,允许程序员只需几行代码即可实现和训练Transformer模型。

预训练模型

在Hugging Face的模型网络上,有100种预训练文本分类模型可供选择。

因此,我建议,在你花费太多时间担心模型训练之前,先看看是否有人已经为你的特定应用程序对模型进行了微调。

例如,我已经制作了关于如何实现用于情绪分析和仇恨语音检测的预训练Transformer模型的内容。

在本教程中,我们将实现一个名为finbert的模型,该模型由一家名为Prosus的公司创建。该模型检测金融数据的情绪。

安装

Happy Transformer在PyPI上可用,因此我们可以用一行代码安装它。

pip install happytransformer

实例化

让我们导入一个名为HappyTextClassification的类,我们将使用它加载模型。

from happytransformer import HappyTextClassification

从这里,我们可以使用HappyTextClassification类为模型实例化一个对象。

第一个position参数指定模型的类型。例如,“BERT”、“ROBERTA”和“ALBERT”都是有效的模型名称。第二个position参数表示模型的名称,可以在模型的网页上找到。最后一个参数是一个名为“num_labels”的参数,它指定模型拥有的类的数量。在本例中,模型有三个标签:“正”、“中性”和“负”

重要提示:实例化模型时不要忘记设置num_labels。否则,可能会发生错误。

happy_tc = HappyTextClassification("BERT", "ProsusAI/finbert", num_labels=3)

用法

我们可以‌使用“classify_text”方法,只需一行代码即可开始对文本进行分类

result = happy_tc.classify_text("Tesla's stock just increased by 20%")

让我们把结果打印出来,以便更好地理解它。

print(result)

Output: TextClassificationResult(label=’positive’, score=0.929110586643219)

如你所见,‌输出是一个数据类,有两个变量:“label”和“score”。

label是一个字符串,用于指示输入被分类到哪个类。“score”变量指定模型将答案分配为浮点数的概率。我们不能孤立这两个变量。

print(result.label) 
print(result.score)

Result:

positive

0.929110586643219

下面是另一个示例。

result = happy_tc.classify_text("The price of gold just dropped by 5%") 
print(result.label)
print(result.score)

Output:

negative

0.8852565288543701

训练-NLP情绪分析

现在我们来讨论训练。我们将训练一个模型来检测与NLP相关的文本情感。我们将仅使用两个示例进行训练—当然,这还不足以可靠地训练模型。但是,这只是为了示范。

我们必须创建一个包含两列的CSV文件:文本和标签。文本列包含我们希望分类的文本。“标签”列将标签类型包含为大于或等于0的整数。下表给出了训练CSV的示例。

2c97b067c5d2df163706942f7e944de0.png

下面是生成上述CSV文件的代码:

import csv

cases= [("Wow I love using BERT for text classification", 0), ("I hate NLP", 1)]

with open("train.csv", 'w', newline='') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(["text", "label"])
        for case in cases:
            writer.writerow([case[0], case[1]])

首先,我们将安装DistilBERT的普通版本作为起点。还有其他模型可以使用,如 BERT, ALBERT, RoBERTa等。更多型号请访问Hugging Face的模型网络:https://huggingface.co/models。

happy_tc = HappyTextClassification(model_type="DISTILBERT", model_name="distilbert-base-uncased", num_labels=2)

然后,我们可以使用新实例化的类简单地调用方法“train”。

happy_tc.train("train.csv")

就这样!我们刚刚训练了模型。我们现在可以使用它,就像我们在上一节中所做的那样。例如,你现在可以像以前一样调用“happy_tc.classify_text”,并将使用新的微调模型。

自定义参数

通过使用一个名为“TCTrainArgs”的类,我们可以轻松地修改学习参数,例如epoch数、学习率等。

from happytransformer import TCTrainArgs

现在,我们可以使用TCTrainArgs类创建一个对象来包含训练参数。可以修改的参数列表:https://happytransformer.com/text-classification/finetuning/。让我们将默认的训练次数从3增加到5。

args = TCTrainArgs(num_train_epochs=5)

让我们像以前一样调用happy_tc的train方法,但这次将args对象传递到该方法的args参数中。

happy_tc.train("train.csv", args=args)

好了,我们修改了学习参数!

评价

HappyTextGeneration对象有一个内置方法,允许你快速评估模型。

首先,按照训练中讨论的格式格式化数据,然后调用“.eval”方法。为了简单起见,让我们使用训练文件进行评估。

result = happy_tc.eval("train.csv") 
print(result)

Result: EvalResult(loss=0.2848379611968994)

然后我们可以像这样分离损失变量:

print(result.loss)

Output: 0.2848379611968994

我建议你将整体数据的一部分用于训练,另一部分用于评估。然后,在训练前后评估你的模型。如果损失减少,则表示你的模型已学习。

你还可以创建数据的第三部分,用于运行实验,以找到最佳的学习参数

结论

就这样!你刚刚学习了如何实现和训练文本分类Transformer模型。使用Happy Transformer只需几行就可以完成这么多工作!。

相关文章

本文中的代码:

https://colab.research.google.com/drive/1Jq3o8whsgEL994noS14qyv98jt5We-pU?usp=sharing

cf3f67fd8a9ef2546a7c86a7f7ca3d35.png

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载机器学习及深度学习笔记等资料打印机器学习在线手册深度学习笔记专辑《统计学习方法》的代码复现专辑
AI基础下载黄海广老师《机器学习课程》视频课黄海广老师《机器学习课程》711页完整版课件

本站qq群554839127,加入微信群请扫码:

222bdd78022ef09406c8bf52f7d8d4fb.png

  • 3
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 文本分类 #### 数据预处理 要求训练集和测试集分开存储,对于中文的数据必须先分词,对分词后的词用空格符分开,并且将标签连接到每条数据的尾部,标签和句子用分隔符\分开。具体的如下: * 今天 的 天气 真好\积极 #### 文件结构介绍 * config文件:配置各种模型的配置参数 * data:存放训练集和测试集 * ckpt_model:存放checkpoint模型文件 * data_helpers:提供数据处理的方法 * pb_model:存放pb模型文件 * outputs:存放vocab,word_to_index, label_to_index, 处理后的数据 * models:存放模型代码 * trainers:存放训练代码 * predictors:存放预测代码 #### 训练模型 * python train.py --config_path="config/textcnn_config.json" #### 预测模型 * 预测代码都在predictors/predict.py中,初始化Predictor对象,调用predict方法即可。 #### 模型的配置参数详述 ##### textcnn:基于textcnn的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * num_filters:卷积核的数量 * filter_sizes:卷积核的尺寸 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm:基于bilstm的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidden_sizes:lstm的隐层大小,列表对象,支持多层lstm,只要在列表中添加相应的层对应的隐层大小 * batch_size:批样本大小 * sequence_length:序列长度 * vocab_size:词汇表大小 * num_classes:样本的类别数,二分类时置为1,多分类时置为实际类别数 * keep_prob:保留神经元的比例 * l2_reg_lambda:L2正则化的系数,主要对全连接层的参数正则化 * max_grad_norm:梯度阶段临界值 * train_data:训练数据的存储路径 * eval_data:验证数据的存储路径 * stop_word:停用词表的存储路径 * output_path:输出路径,用来存储vocab,处理后的训练数据,验证数据 * word_vectors_path:词向量的路径 * ckpt_model_path:checkpoint 模型的存储路径 * pb_model_path:pb 模型的存储路径 ##### bilstm atten:基于bilstm + attention 的文本分类 * model_name:模型名称 * epochs:全样本迭代次数 * checkpoint_every:迭代多少步保存一次模型文件 * eval_every:迭代多少步验证一次模型 * learning_rate:学习速率 * optimization:优化算法 * embedding_size:embedding层大小 * hidd

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值