赛题背景
在开放领域的搜索场景下得到的网页数据会非常复杂,其中往往存在着网页文档质量参差不齐、长短不一,问题答案分布零散、长度较长等问题,给答案抽取和答案置信度计算带来了较大挑战。
本赛题希望从答案抽取和答案检验两个方面调研真实网络环境下的文档级机器阅读理解技术,以求进一步提升深度智能问答效果,给用户提供更好的搜索体验。
代码链接:https://aistudio.baidu.com/aistudio/projectdetail/5013840
比赛链接:https://aistudio.baidu.com/aistudio/competition/detail/660/0/introduction
任务2:任务概述
子任务1涉及的答案抽取过程主要依赖答案片段与搜索query间语义相关性,却无法保证答案片段本身的正确性与可靠性。
因此,在答案抽取之后需要设计答案验证方法,从抽取的多个答案片段中选择出大众认可度最高的高置信度答案进行最后的展示。
给定一个搜索问题q和其对应的文档集合D,子任务2希望将所有文档基于其包含的答案观点一致性进行聚类,得到每个query下包含用户最公认答案的文档集合,保证深度智能问答系统最终答案的可信度。
任务2:任务定义
给定搜索问题集Q,对于每个问题q搜索得到的网页文档集合Dq,任务要求参评系统将其中包含的答案聚类。聚类结果中属于同一子集的答案应观点一致且语义相似,属于不同子集的答案应观点不同或语义矛盾。对于每个集合,我们将其答案认可度定义为包含的答案来自不同文档的数量(避免一个答案在同一文档中反复提及),要求参赛系统返回认可度最高的答案集合所对应的文档集合。
我们鼓励参赛者将本任务转化为一个答案语义推理任务(也可自由选择其他合理方案)。给定一个搜索query,对于两个答案片段ai,aj,当ai和aj与query相关的答案语义相同,或存在蕴含关系,则称ai和aj是答案语义一致的,应被划分到同一答案集合;若ai和aj与query相关的答案语义无关,或存在矛盾关系,则称ai和aj是答案语义不一致的,应被划分到不同的答案集合。
任务2:数据集
本任务提供的数据将支持完成同一query下不同答案的语义推理任务。训练集和验证集都包含搜索问题集Q,网页文档集合D,答案集合A以及相同query下答案对之间的语义一致性关系(支持、中立、反对),详细的数据格式可参考下文的数据样例。
为在测试时模拟实际的深度智能问答场景,测试集不提供答案集合A,参赛者需要利用子任务1中设计的系统完成答案抽取工作后再进行语义一致性计算。最终参评系统应返回认可度最高的答案集合所对应的文档集合。
训练集对约20万组答案对进行了语义一致性标注;验证集包含约1万组答案对一致性标注;训练集和验证集均可由答案一致性标注得到认可度最高的答案集合和对应文档集合;测试集仅提供query和文档集合。数据的主要特点为:
- 文档和答案长度普遍较长,存在大量混淆信息,语义计算困难
- 答案集合内部可能存在复杂的一致性关系
数据样例 问题q:备孕偶尔喝冰的可以吗 篇章d1:备孕能吃冷的食物吗 炎热的夏天让很多人都觉得闷热...,下面一起来看看吧! 备孕能吃冷的食物吗 在中医养生中,女性体质属阴,不可以贪凉。吃了过多寒凉、生冷的食物后,会消耗阳气,导致寒邪内生,侵害子宫。另外,宫寒是肾阳虚的表现,不会直接导致不孕。但宫寒会引起妇科疾病,所以也不可不防。因此处于备孕期的女性最好不要吃冷的食物。 备孕食谱有哪些 ... 答案a1:在中医养生中,女性体质属阴,不可以贪凉。吃了过多寒凉、生冷的食物后,会消耗阳气,导致寒邪内生,侵害子宫。另外,宫寒是肾阳虚的表现,不会直接导致不孕。但宫寒会引起妇科疾病,所以也不可不防。因此处于备孕期的女性最好不要吃冷的食物。 篇章d2:病情分析:备孕通常不能喝冰饮料,避免影响胎儿健康。患者正处于备孕准备阶段,男性和女性患者都需要注意饮食不要太辛辣和刺激,不推荐冷冻和冷饮。... 答案a2:备孕通常不能喝冰饮料,避免影响胎儿健康。 篇章d3:备孕期间能喝冰水?备孕期间能喝冰水吗:这个应该不会有影响的 在线咨询... 答案a3:这个应该不会有影响的 答案对一致性:支持; 答案对一致性:反对; 答案对一致性:反对
答案聚类结果:{a1, a2},其认可度=2; {a3},其认可度=1; 认可度最高答案集合为{a1, a2},所属的文档集合为{d1, d2}。
train/dev/test开头的文件分别是训练、开发、测试集数据
xxx_query_doc.json是提供的query和若干doc 每个query一行,使用json格式存储,第一级包含query和docs两个字段,docs为列表,每一项是一个doc,包含title、url、doc_text、doc_id四个字段,doc_text是doc的正文,doc_id是doc的编号标识
xxx_answer_nli_data.tsv是答案关系标注数据 每一行包含六列,用制表符tab分割,分别是query、url1、answer1、url2、answer2、label label为1表示两个答案为相互支持关系、语义一致,为0表示两个答案未中立或反对关系 该数据可供训练模型,判断答案关系,用于支持最终任务 测试集不包含该部分数据
xxx_label.tsv是答案检验任务所对应标注 每个query一行,每行包含两列,用制表符tab分割,第一列为query,第二列为认可度最高答案所属的文档集合,使用英文逗号连接的doc_id,测试集不包含该部分数据
任务2:评价指标
对于每个query,计算模型预测的认可度最高答案所属文档集合和标注最高认可度文档集合的准确、召回、F1值,取所有测试数据的平均F1值作为最终指标。
任务2:方案介绍
任务2本质是一个问题聚类的问题,但可以借助任务1的数据来完成。我们可以从文本相似度的角度来解决。
步骤1:读取数据
train_query_doc = pd.read_json('data_task2/train_query_doc.json',lines=True) test_query_doc = pd.read_json('data_task2/test_query_doc.json',lines=True) dev_query_doc = pd.read_json('data_task2/dev_query_doc.json',lines=True)
train_answer_nli_data = pd.read_csv('data_task2/train_answer_nli_data.tsv', sep='t', header=None)
dev_answer_nli_data = pd.read_csv('data_task2/dev_answer_nli_data.tsv', sep='t', header=None)
train_label = pd.read_table('data_task2/train_label.tsv', names=['query','doc_ids'])
dev_label = pd.read_table('data_task2/dev_label.tsv', names=['query','doc_ids'])
步骤2:计算query相似度
from sklearn.feature_extraction.text import TfidfVectorizer
# 生成提交结果with open('subtask2_test_pred.txt','w') as up:forrowintest_query_doc.itertuples():
text = [row.query] + [x['title'] + x['doc_text']forxinrow.docs]
text = [' '.join(list(x))forxintext]
doc_id = np.array([x['doc_id']forxinrow.docs])
tfidf = TfidfVectorizer(token_pattern=r"(?u)bw+b")
query_mat = tfidf.fit_transform(
text
)
query_mat = query_mat.toarray()
doc_id = doc_id[np.dot(query_mat[0], query_mat.T)[1:] > 0.2]
doc_id = list(doc_id)
doc_id =','.join(doc_id)
up.write(row.query +'t'+doc_id+'n')
任务2:改进方向
- 使用有监督标签搭建文本匹配模型。
- 使用BERT搭建文本相似度计算逻辑。