基于Prompt的MLM文本分类 bert4keras实现
本文主要介绍使用Prompt的MLM文本分类 bert4keras的代码实现,用以丰富bert4keras框架的例子 关于prompt的原理的文章网上有很多优秀的文章可以自行百度。
github地址
hgliyuhao/Prompt4Classification (github.com)
transformers,torch 实现的版本可以参考
基于Prompt的MLM文本分类_u013546508的博客-CSDN博客
数据介绍
剧烈运动后咯血,是怎么了? | 剧烈运动后为什么会咯血? | 1 |
剧烈运动后咯血,是怎么了? | 剧烈运动后咯血,应该怎么处理? | 0 |
每条数据是包含两句话 和一个标签 ,如果标签为1证明两句话意思相同 为0则证明意思不同
所以是一个分类任务
模型设计
使用mlm模型,将分类任务转换成一个填空任务,再根据填空的结果决定分类结果。
根据任务和数据特点设计Prompt:两句话意思【mask】同。
所以对应模型的输入是 两句话意思【mask】同 :text1 ;text2
对应的label 如果标签为1 label 为‘相’,标签为0 label 为 ‘不’
因为在预测的时候是使用生成模型,为了确定mask结果的任务,所以Prompt要位于句子开头
代码细节
由于需要使用mlm 要在引入模型的时候加入with_mlm=True
model = build_transformer_model(config_path,checkpoint_path,with_mlm=True,keep_tokens=keep_tokens, # 只保留keep_tokens中的字,精简原字表
)
下面重点说一下输入输出格式
class data_generator(DataGenerator):def __iter__(self, random=False):"""单条样本格式为输入:[CLS]两句话意思[MASK]同,text1,text2[SEP]输出:'相'或者'不'"""idxs = list(range(len(self.data)))if random:np.random.shuffle(idxs)batch_token_ids, batch_segment_ids, batch_a_token_ids = [], [], []for i in idxs:data = self.data[i]text = "两句话意思相同"text1 = data[0]text2 = data[1]label = data[2]final_text = text + ':' + text1 + ',' + text2 token_ids, segment_ids = tokenizer.encode(final_text, maxlen=maxlen)# mask掉'相'字token_ids[6] = tokenizer._token_mask_idif label == 0:a_token_ids, _ = tokenizer.encode('不')else:a_token_ids, _ = tokenizer.encode('相') batch_token_ids.append(token_ids)batch_segment_ids.append(segment_ids)batch_a_token_ids.append(a_token_ids[1:])if len(batch_token_ids) == self.batch_size or i == idxs[-1]:batch_token_ids = sequence_padding(batch_token_ids)batch_segment_ids = sequence_padding(batch_segment_ids)batch_a_token_ids = sequence_padding(batch_a_token_ids, 1)yield [batch_token_ids, batch_segment_ids], batch_a_token_idsbatch_token_ids, batch_segment_ids, batch_a_token_ids = [], [], []
token_ids[6] = tokenizer._token_mask_id 是将 "两句话意思相同" 转换成"两句话意思【mask】同"
batch_a_token_ids.append(a_token_ids[1:]) 这里(a_token_ids[1:] 是为了将cls 去掉
batch_a_token_ids = sequence_padding(batch_a_token_ids, 1) 这里是设置生成文本的长度,因为我们这个任务只需要预测结果为‘相’或者为‘不’所以 长度设置为1
效果
句对模型 | prompt | |
acc |
0.93656 |
0.90414 |
prompt的效果是不如传统的句对模型的
但是prompt的思想是很有趣的,在few-shot 或者少样本的任务中是值得尝试的
基于Prompt的MLM文本分类 bert4keras实现相关推荐
- 基于Prompt的MLM文本分类
简介 常规NLP做文本分类时常用Transfer Learning的方式,在预训练bert上加一个分类层,哪个输出节点概率最大则划分到哪一类别.而基于Prompt的MLM文本分类是将文本分类任务转化为 ...
- 基于Prompt的MLM文本分类-v2
自动寻找Prompt 实验版本好多参数可调 import os import torch import logging import datasets import transformers impo ...
- 【调研】基于Prompt的小样本文本分类调研:PET,LM-BFF,KPT,PTR
本篇博客一共要分享四篇prompt论文,它们分别提出了四个模型. 目录
- 基于深度学习的文本分类 3
基于深度学习的文本分类 Transformer Transformer是一种完全基于Attention机制来加速深度学习训练过程的算法模型,其最大的优势在于其在并行化处理上做出的贡献.换句话说,Tra ...
- 文本基线怎样去掉_ICML 2020 | 基于类别描述的文本分类模型
论文标题: Description Based Text Classification with Reinforcement Learning 论文作者: Duo Chai, Wei Wu, Qing ...
- 【项目实战课】NLP入门第1课,人人免费可学,基于TextCNN的新闻文本分类实战...
欢迎大家来到我们的项目实战课,本期内容是<基于TextCNN的新闻文本分类实战>. 所谓项目课,就是以简单的原理回顾+详细的项目实战的模式,针对具体的某一个主题,进行代码级的实战讲解,可以 ...
- ICML 2020 | 基于类别描述的文本分类模型
论文标题: Description Based Text Classification with Reinforcement Learning 论文作者: Duo Chai, Wei Wu, Qing ...
- 基于深度学习的文本分类1
基于深度学习的文本分类 与传统机器学习不同,深度学习既提供特征提取功能,也可以完成分类的功能.从本章开始我们将学习如何使用深度学习来完成文本表示. 现有文本表示方法的缺陷 在上一章节,我们介绍几种文本 ...
- Datawhale NLP入门:Task5 基于深度学习的文本分类2
Task5 基于深度学习的文本分类2 在上一章节,我们通过FastText快速实现了基于深度学习的文本分类模型,但是这个模型并不是最优的.在本章我们将继续深入. 基于深度学习的文本分类 本章将继续学习 ...
最新文章
- 33.搜索插件——autocomplete
- 《Android游戏开发详解》一导读
- linux内核结构介绍
- 深度学习—大厂笔试题
- 中根遍历二叉查找树所得序列一定是有序序列_数据结构考研学习笔记(九)树、森林...
- vc ado连接mysql_VC用Ado接口连接和使用数据库及注意事项
- Windows下的命令行。
- Saltstack之自定义grains
- 数独超难题目_号称世界上最难的一道数独题,你敢来挑战吗?据说答案只有一种...
- 2018Web前端面试题及答案大全
- CMD 命令 复制多级子目录特定文件
- U956(MTK6589系列)移植乐蛙教程
- js继承的几种实现方式
- 分布式Zookeeper-基础
- 银河麒麟V10(Kylin Linux V10)之DBeaver安装
- 如何去除Word中的波浪线?这三种方法很实用!
- Pytorch、Anaconda安装、Navidia版本更新
- 卡马克:用C++进行函数式编程
- 联想G480如何关闭数字小键盘
- ​LeetCode刷题实战450:删除二叉搜索树中的节点