2021 CCF BDCI 千言-问题匹配鲁棒性评测

333 阅读4分钟

「这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战」。

一、2021 CCF BDCI 千言-问题匹配鲁棒性评测

竞赛地址: aistudio.baidu.com/aistudio/co…

问题匹配(Question Matching)任务旨在判断两个自然问句之间的语义是否等价,是自然语言处理领域一个重要研究方向。问题匹配同时也具有很高的商业价值,在信息检索、智能客服等领域发挥重要作用。

近年来,神经网络模型虽然在一些标准的问题匹配评测集合上已经取得与人类相仿甚至超越人类的准确性,但在处理真实应用场景问题时,性能大幅下降,在简单(人类很容易判断)的问题上无法做出正确判断(如下图),影响产品体验的同时也会造成相应的经济损失。

问题1问题2标签(Label)Model
婴儿吃什么蔬菜好婴儿吃什么绿色蔬菜好01
关于牢房的电视剧关于监狱的电视剧10
心率过有什么问题心率过有什么问题01
黑色裤子配什么上衣黑色上衣配什么裤子01

当前大多数问题匹配任务采用单一指标,在同分布的测试集上评测模型的好坏,这种评测方式可能夸大了模型能力,并且缺乏对模型鲁棒性的细粒度优劣势评估。本次评测关注问题匹配模型在真实应用场景中的鲁棒性,从词汇理解、句法结构、错别字、口语化、对话理解五个维度检测模型的能力,从而发现模型的不足之处,推动语义匹配技术的发展。本次竞赛主要基于千言数据集,采用的数据集包括哈尔滨工业大学(深圳)的LCQMC和BQ数据集、OPPO的小布对话短文本数据集以及百度的DuQM数据集,期望从多维度、多领域出发,全面评价模型的鲁棒性,进一步提升问题匹配技术的研究水平。

二、数据集合并

初始运行一次,后续不需要

1.解压缩数据集

!unzip -qoa data/data104940/train.zip

2.合并数据集

import pandas as pd
# 读取3个数据集的训练集
LCQMC_train = pd.read_csv('train/LCQMC/train', sep = '\t',   header=None)
OPPO_train = pd.read_csv('train/OPPO/train', sep = '\t',  header=None)
BQ_train = pd.read_csv('train/BQ/train', sep="\t", header=None,  error_bad_lines=False)

LCQMC_train=LCQMC_train.dropna()
OPPO_train=OPPO_train.dropna()
BQ_train=BQ_train.dropna()
BQ_train[2]=BQ_train[2].astype(int)
# 合并3个数据集的训练集
df_tmp = LCQMC_train.append(OPPO_train)
all_train = df_tmp.append(BQ_train)

# 另存
all_train.to_csv('all_train.csv', sep = '\t', index=None, header=None)
# 读取3个数据集的测试集
LCQMC_test = pd.read_csv('train/LCQMC/dev', sep = '\t', header=None)
OPPO_test = pd.read_csv('train/OPPO/dev', sep = '\t', header=None)
BQ_test = pd.read_csv('train/BQ/dev', sep="\t", header=None, error_bad_lines=False)

# 合并3个数据集的测试集
df_tmp = LCQMC_test.append(OPPO_test)
all_test = df_tmp.append(BQ_test)
all_test.dropna()

# 另存
all_test.to_csv('all_dev.csv', sep = '\t', index=None, header=None)

三、翻译测试

使用transformer_zh-en模型来做翻译

1.PaddleHub transformer_zh-en模块安装

transformer_zh-en

1.1 模型概述

transformer_zh-en包含6层的transformer结构,头数为8,隐藏层参数为512,参数量为64M。该模型在CWMT2021的数据集进行了预训练,加载后可直接用于预测, 提供了中文翻译为英文的能力。

1.2 概述

2017 年,Google机器翻译团队在其发表的论文Attention Is All You Need中,提出了用于完成机器翻译(Machine Translation)等序列到序列(Seq2Seq)学习任务的一种全新网络结构——Transformer。Tranformer网络完全使用注意力(Attention)机制来实现序列到序列的建模,并且取得了很好的效果。

transformer_zh-en包含6层的transformer结构,头数为8,隐藏层参数为512,参数量为64M。该模型在CWMT2021的数据集进行了预训练,加载后可直接用于预测, 提供了中文翻译为英文的能力。

关于机器翻译的Transformer模型训练方式和详情,可查看Machine Translation using Transformer。

如上为翻译示例,更多功能详见:www.paddlepaddle.org.cn/hubdetail?n…

 !hub install transformer_zh-en==1.0.1

2.翻译数据集

import pandas as pd
import paddlehub as hub
import warnings
warnings.filterwarnings("ignore")


def read_data(train_file, mode='train'):
    model = hub.Module(name='transformer_zh-en', beam_size=5)
    print(f'train file: , {train_file}')
    data = pd.read_csv(train_file, header=None, sep='\t')
    src_label=[]
    trg_labels=[]
    if mode == 'train' or mode == 'dev':
        data.columns = ["text_a","text_b", 'label']
        src_label=data['label'].tolist()   
    else:
        data.columns = ["text_a", "text_b",]
         
    print(50*'*')
    print('中文数据')
    print(data.head())
    print(50 * '*')

    src_texts_a=data['text_a'].tolist()
    src_texts_b=data['text_b'].tolist()
    # 每个输入样本的输出候选句子数量
    n_best = 1  
    # 使用GPU加速预测
    trg_texts_a = model.predict(src_texts_a, batch_size=2, n_best=n_best, use_gpu=True)
    trg_texts_b = model.predict(src_texts_b,  batch_size=2, n_best=n_best, use_gpu=True)

    for idx, st in enumerate(src_texts_a[:5]):
        print('-' * 30)
        print(f'src: {st}')
        print(f'trg: {trg_texts_a[idx]}\t {trg_texts_a[idx]}')
        
    if mode=='test':
        df = pd.DataFrame(trg_texts_a, trg_texts_b, index,columns=['text_a', 'text_b'])
        return df
    else:
        df = pd.DataFrame(ttrg_texts_a, trg_texts_b, data['label'] , index,columns=['text_a', 'text_b', 'label'])
        return df
dev = read_data('all_train.csv', mode='dev')
dev.to_csv('dev_en.csv')
train = read_data('all_train.csv', mode='train')
test = read_data('data/data104941/test_A', mode='train')

如上为翻译示例,更多功能详见:www.paddlepaddle.org.cn/hubdetail?n…