目录
1 文本匹配任务简介
文本相似度
2 基于Transfromers的解决方案
本质是一个二分类,可以用于解决A和B之间是否相似的问题
现在我们思考一下,如果要判断A和集合{B,C,D}中哪个句子更类似怎么办?若仍然使用二分类方法,假如我们得到A和B、C都是相似的,但这样子的后果就是无法判断B与C哪个与A更相似。因此我们可以使用回归方法,得到A和集合{B,C,D}中每个句子的相似性得分,然后取最大值即可。
3 数据集
选用simCLUE / train_pair_1w.json作为数据集
4 基于交互策略的实战流程
4.1 导包
4.2 加载数据集
4.3 划分数据集
4.4 数据集预处理
这里要对sentence1和sentence2共同进行处理
方式一:使用二分类方法,label要由字符串类型强制转换为int类型
import torch
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")
def process_function(examples):
tokenized_examples = tokenizer(examples["sentence1"], examples["sentence2"], max_length=128, truncation=True)
tokenized_examples["labels"] = [int(label) for label in examples["label"]]
return tokenized_examples
tokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets["train"].column_names)
tokenized_datasets
方式二:使用回归方法,label要由字符串类型强制转换为float类型,因为最后得到的要是一个浮点数表示分数
import torch
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")
def process_function(examples):
tokenized_examples = tokenizer(examples["sentence1"], examples["sentence2"], max_length=128, truncation=True)
tokenized_examples["labels"] = [float(label) for label in examples["label"]]
return tokenized_examples
tokenized_datasets = datasets.map(process_function, batched=True, remove_columns=datasets["train"].column_names)
tokenized_datasets
4.5 创建模型
方式一:二分类
不明确指定情况下,num_labels默认为2,损失函数采用交叉熵损失函数
方式二:回归,num_labels=1,损失函数采用均方误差损失函数
如下:
4.6 创建评估函数
方式一:二分类
使用argmax从相似得分和不相似得分这两个类别的得分中找到得分最大的一个下标
方式二:回归
通过得到A和B的相似性得分score(我们训练的标签就是0或1,拟合的就是这个值,所以就不用再过sigmod了,因此score可能会超过1,范围并不在(0,1)之间),然后与阈值作比较得到标签
4.7 创建TrainingArguments
4.8 创建Trainer
4.9 模型训练
4.10 模型评估
4.11 模型预测
句子对的输入方式和单条句子并不一样,注意区分。
方式一:二分类
方式二:回归
function_to_apply="none"
: 表示不对模型的原始输出进行任何后处理。模型将直接返回预测结果,而不经过任何转换或处理。使用这个是因为我们之前没用到sigmod或者该任务pipeline源码没有针对回归做一个很好的判断,可能有一定的错误。