千言数据集:文本相似度——BERT完成NSP任务

本文介绍BERT模型及其NextSentencePrediction任务,并通过实例演示如何使用BERT解决文本相似度问题,包括数据处理、模型训练及预测。

以下学习笔记来源于 Coggle 30 Days of ML(22年1&2月)
链接:https://coggle.club/blog/30days-of-ml-202201

比赛链接:https://aistudio.baidu.com/aistudio/competition/detail/45/0/task-definition

了解BERT和NSP

BERT

BERT的全称为Bidirectional Encoder Representation from Transformers,是一个预训练的语言表征模型。它强调了不再像以往一样采用传统的单向语言模型或者把两个单向语言模型进行浅层拼接的方法进行预训练,而是采用新的masked language model(MLM),以致能生成深度的双向语言表征。在多个NLP任务中取得非常好的结果。

Next Sentence Prediction(NSP)

一些如问答、自然语言推断等任务需要理解两个句子之间的关系,而MLM任务倾向于抽取token层次的表征,因此不能直接获取句子层次的表征。为了使模型能够有能力理解句子间的关系,BERT使用了NSP任务来预训练,简单来说就是预测两个句子是否连在一起。具体的做法是:对于每一个训练样例,我们在语料库中挑选出句子A和句子B来组成,50%的时候句子B就是句子A的下一句(标注为IsNext),剩下50%的时候句子B是语料库中的随机句子(标注为NotNext)。接下来把训练样例输入到BERT模型中,用[CLS]对应的C信息去进行二分类的预测。
(参考自https://zhuanlan.zhihu.com/p/98855346)

使用BERT完成NSP任务

NSP简单来说就是预测两个句子是否连在一起,对于文本相似度任务中的两个句子text1和text2,若其相似,我们可以认为text2是text1的next sentence,反之则不是。千言数据集的文本相似度数据有bq、lcqmc和pawsx,我们分别读取这些数据并训练对应数据的模型,最后使用模型预测对应的测试数据集并提交结果(可以尝试将所有训练数据合在一起训练后预测测试数据,目前还没有试,不知道效果如何)。

导入基本库

import pandas as pd
import torch
from sklearn.model_selection import train_test_split
from torch.utils.data import Dataset, DataLoader, TensorDataset
import numpy as np
import pandas as pd
import random
import re

读取数据

#读取tsv文件的方法
def read_tsv(input_file,columns):
    with open(input_file,"r",encoding="utf-8") as file:
        lines = []
        for line in file:
            if len(line.strip().split("\t")) != 1:
                lines.append(line.strip().split("\t"))
        df = pd.DataFrame(lines)
        df.columns = columns
    return df

bq_train=read_tsv('./bq_corpus/train.tsv',['text1','text2','label'])
lcqmc_train=read_tsv('./lcqmc/train.tsv',['text1','text2','label'])
pawsx_train=read_tsv('./paws-x-zh/train.tsv',['text1','text2','label'])

bq_test=read_tsv('./bq_corpus/test.tsv',['text1','text2'])
lcqmc_test=read_tsv('./lcqmc/test.tsv',['text1','text2'])
pawsx_test=read_tsv('./paws-x-zh/test.tsv',['text1','text2'])

自定义DataSet

#数据集读取
class QYanDataSet(Dataset):
    def __init__(self,encodings,labels):
        self.encodings=encodings
        self.labels=labels
    #读取单个样本
    def __getitem__(self,idx):
        item={
   
   key:torch.tensor(val[idx
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值