一种解决bert长文本匹配的方法

引言

bert提出来后打开了迁移学习的大门,首先通过无监督的语料训练通用的语言模型,然后基于自己的语料微调(finetune)模型来达到不同的业务需求。我们知道bert可以支持的最大token长度为512,如果最大长度超过512,该怎么样处理呢?下面这边论文提供一种简单有效的解决思路。

Simple Applications of BERT for Ad Hoc Document Retrieval

201903发表

1. 摘要

bert大招很好用,但是其最大长度为512以及其性能这两个缺点给我们的线上部署提出了挑战。我们在做document级别的召回的时候,其文本长度远超bert可以处理的长度,本文提出了一种简单并且有效的解决思路。将长的document分解成多个短的句子,每个句子在bert上独立推断,然后将这些句子的得分聚合得到document的得分。

2. 论文细节以及实验结果

2.1 长文本匹配解决思路

作者先以短文本匹配任务-社交媒体的帖子来做召回实验,通过query来召回相关的帖子,一般帖子的长度是较短的文本,在bert可以处理的范围内。实验的评价指标为两个平均召回(AP)和top30的召回率(P30),下表是最近的深度模型在这个数据集上的结果。


我觉得上述实验数据主要说一点:

bert在短文本匹配类型的任务上效果很好,性能SOTA

长文本的docment匹配一般解决方法:

  • 直接截断,取top长度,丢失了后面的数据;
  • 片段级递归机制,解决长文本依赖,如Transformer-XL,一定程度上可以解决长依赖问题(看递归长度),但模型稍复杂;
  • 基于抽取模型,抽取长文本docment的关键句子作为doc的摘要,然后基于此摘要进行匹配模型训练,这样只考虑了摘要,没有考虑其他句子,比较片面;
  • 将长文本划分为多个短句子,选择匹配度最高的来做匹配,同样没有考虑其他句子。

本文的方法

针对新闻语料的长文本召回问题,本文首先利用NLTK工具将长文本分为短的句子,不同于考虑最匹配的句子,本文考虑top n个句子。最终长文本docment的匹配得分计算公司如下:


其中S_doc是原始的长文本得分(文本得分),例如BM25得分,S_i表示第i个top的基于bert句子的匹配得分(语义得分),其中参数a的参数范围[0,1],w1的值为1,wi参数范围[0,1],基于gridsearch去调参,获得一个比较好的性能。

 

2.2 实验结果

finetune的数据

我们的原始的微调数据是查询query和长文本document的关系,而我们将长文本拆分为n个短句子后,不是所有的句子和当前的query是强相关的(正样本),因此我们不能简单依赖现在的长文本数据了。本论文的解决方法是基于外部语料,基于QA或者Microblog数据,首先bert基于通用的无监督语料学习到了词语以及句子的表征,所以基于少量的数据微调也可以获得较好的效果,因此本文选择外部相关的语料进行微调。具体效果如下表,我们发现长文本的匹配基于本文的方法可以取得比较好的效果。

3. 总结与问题

总结

  • 本文提出一种加权的短句子得分方法来解决长文本匹配得分问题;
  • 该方法在该论文实验数据集上可以取得SOTA的效果,方法简单有效;

思考

  • 论文中微调的数据使用外部数据,微调的模型没有很好拟合当前的数据,是不是可以从分割的短句子中进行正负样本的采样,这样微调的数据也是从长文本中得出;
  • 论文中如果选取的top n,如果n过大的话,调参有点复杂,n过大感觉可以取top3调参,然后后面平均。

参考文献

Simple Applications of BERT for Ad Hoc Document Retrieval

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BERT中文问答系统是一种基于BERT预训练模型的自然语言处理技术,用于回答中文问答系统中的问题。其主要思想是将问题和文本段落作为输入,然后使用BERT模型对其进行编码,最后使用softmax函数计算每个文本段落与问题的匹配程度,从而选择最佳答案。 以下是BERT中文问答系统的实现步骤: 1.准备数据集:将问题和文本段落组成的数据集进行预处理,将其转换为BERT模型可以接受的格式。 2.加载预训练模型:使用huggingface transformers库加载预训练的BERT模型。 3.对输入进行编码:使用BERT模型对问题和文本段落进行编码,得到它们的向量表示。 4.计算匹配程度:使用softmax函数计算每个文本段落与问题的匹配程度,从而选择最佳答案。 5.输出答案:输出匹配程度最高的文本段落作为答案。 以下是一个使用BERT中文问答系统回答问题的例子: ```python from transformers import BertTokenizer, BertForQuestionAnswering import torch # 加载预训练模型和分词器 model = BertForQuestionAnswering.from_pretrained('bert-base-chinese') tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') # 输入问题和文本段落 question = "什么是BERT中文问答系统?" text = "BERT中文问答系统是一种基于BERT预训练模型的自然语言处理技术,用于回答中文问答系统中的问题。" # 对输入进行编码 input_ids = tokenizer.encode(question, text) tokens = tokenizer.convert_ids_to_tokens(input_ids) # 获取答案 start_scores, end_scores = model(torch.tensor([input_ids])) start_index = torch.argmax(start_scores) end_index = torch.argmax(end_scores) answer = ''.join(tokens[start_index:end_index+1]).replace('##', '') # 输出答案 print(answer) # 输出:一种基于BERT预训练模型的自然语言处理技术,用于回答中文问答系统中的问题。 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值