本次竞赛将基于选词填空的任务形式,提供大规模的成语填空训练语料。在给定若干段文本下,选手需要在提供的候选项中,依次选出填入文本中的空格处最恰当的成语。
我们做这个工作的动机主要包含两个方面。
一是当前的机器阅读理解的语料大多是英文的,有的是基本的实体填空,也有的是针对英文中的语言现象设置问题,而汉语作为博大精深的语种,现在却少有机器阅读理解相关的语料,比较著名的是讯飞每年都在办的中文机器阅读理解评测,因此在中文领域继续进行探索是有必要的。
二是在中文领域,有一些中文特有的语言现象还没有得到充分挖掘。我们注意到,有别于在英文中也频繁出现的名词、实体或动词等词语,成语是汉语中独特的一类词。它们在形式上简洁、内涵上丰富,寥寥数字便包含深刻的哲理。考虑到很多成语来自于历史故事或寓言,它们的字面含义与真实意义可能并不一样甚至大相径庭,是典型的非合成性的多词表达,如何让机器能理解这样一类词应该是一个值得思考和探究的问题。
基于上述原因,我们采用了完形填空的任务形式,根据人工实验的结果,构建了一份大规模、高质量的成语填空数据集,分析了选项设计与几种基本的成语表示方法的影响,并评估了一流基线模型的性能。
总地来说,我们的工作在理论研究和应用上的贡献有两方面:
1. 提出了一份全新的、大规模的中文完形填空数据集,进一步丰富了中文领域的机器阅读理解的资源;
2. 据我们所知,这是首个将成语这一汉语中独特的语言现象融入机器阅读理解中的工作,为研究成语的使用场景、理解成语提供了高质量语料,也能够帮助成语学习者(包括青少年的本土学习者与汉语的第二语言学习者等)理解成语使用的方法、检测学习效果。
数据格式
在完形填空的任务设置下,我们为问题提供了候选项。设计候选项的意义有二,一是在给定的成语表下,很可能会有多个同义的成语符合语境,这样会导致评估困难,二是成语之中近义词的现象普遍存在,通过合理地设计候选项能够使问题具有一定的难度。
在 ChID 数据集的每条数据中,给定了一段文本,这段文本中的成语被替换成了空格(占位符)。对于每个空格,都有一组固定长度(7 个)的候选成语,其中包含一个(唯一的)正确答案、三个与正确答案相似的干扰项与三个从词表中随机采样的选项。下面我们将介绍候选项构造的方法。
候选项构造
我们根据网上找到的一份高质量的成语大全 [1] 提供的成语词表,首先基于 Tencent AI Lab 开源的中文语料,保留了有预训练词向量的成语,然后经过筛选与归一化后,得到了包含 3,848 个条目的成语词表。利用词向量的之间的余弦相似度,我们进行了人工实验,评估了成语之间的相似度与语义相关性之间的关联。
根据实验结果,当相似度大于 0.8 时,两成语有很大的概率是同义词;相似度在 0.65 到 0.8 之间时,则两成语更可能是近义词;而当相似度低于 0.7 时,两成语则几乎不会是同义词。为了能挑选出既具有迷惑性,又不影响正确答案的唯一性的干扰项,我们将 0.7 设为阈值,对于每个空格,根据原始的成语,分两步操作:
1. 在移除与答案的相似度大于 0.7 的成语之后,挑选出相似度最高的 10 个词,从这 10 个词里随机采样 3 个作为相似的干扰项;
2. 从剩下的成语中,随机采样 3 个作为一般的干扰项。
由此,就可以对每个空格设计出具有一定难度、又尽可能保证了正确答案唯一性的候选项。
数据集划分与统计
为了让数据集覆盖多种类型的文体和领域,我们从网上搜集了散文、小说的语料,从清华大学自然语言处理实验室开源的中文文本分类数据集 THUCNews [2] 搜集了新闻语料。基于原始语料,我们以段落为单位,将文本中的成语替换为空格,通过合并短段落、忽略长段落来保证段落长度在合适的范围内。最终,我们共得到 580,807 条数据,共有 728,713 个空格。
值得一提的是,我们划分了域内和域外数据,域内数据进一步划分为训练集、开发集和测试集,域外数据构成域外集。域内数据由小说和新闻的语料构成,域外数据由散文的语料构成。域内数据和域外数据的区别主要在于两方面:
域外数据的文段更长、每条数据的文本的空格数更多。在文本长度方面,域内数据平均 99 个词而域外数据是 127 个词;在平均空格数方面,域内数据平均 1.25 个空而域外数据是 1.49 个空。
域外数据中低频成语更多。根据词频统计的结果,词频低于 100 的词频成语在域内数据出现了 10.7%,而域外数据中则出现了 20.2%;词频高于 400 的高频成语在域内数据出现了 44.5%,而域外数据中出现了 31.4%。
这两点使得域外数据难度更大,并对模型的泛化能力提出了更高的要求。
除了给出开发集、测试集和域外集的分数(模型自动实验、人工实验等)外,我们补充进行了两组拓展实验:
候选项设计对任务难度的影响。原先的 6 个干扰项包含 3 个相似词和 3 个一般词,我们将测试集中的干扰项全部替换为 6 个相似成语或者 6 个随机采样的一般成语,以观察选项设计的影响。
成语表示方法对模型性能的影响。为了验证成语的非合成性,除了将一个成语当作一个独立的词向量,我们还考虑两种表示方法:用组成成语的四个字的向量取平均作为成语表示,这是为了模仿基于字面意思来理解成语的方法;在四个字的向量拼接成一个长向量后,将其通过一个带非线性激活函数的 MLP,这是为了效仿合成性假设,即成语的表示是它的组成字的合成函数。
我们改编了三种 SOTA 基线模型,分别是 Language Model、Attentive Reader 和 Stanford Reader。实验结果可以总结如下:
1. 候选项设计方法极大影响了任务的难度。无论是模型性能还是人工实验,相似的干扰项越多,得分就越低。此外,较多的相似干扰项也使得人工标注的一致性降低,这表明人工实验的难度有所增加;
2. 人工实验的结果远好于模型,并且人类具有更强的泛化能力。人与模型最小的分数差是在测试集上(14.6),而最大的分数差是在域外集上(23.3)。同时,人在测试集与域外集上的分数很接近(87.1 和 86.2),但模型却有很大的差异(72.4 和 62.9),这表明模型并不能很好地泛化到包含更多低频成语的域外集上;
3. 成语表示方法是理解成语的关键。能够看到将成语表示为独立的语义单元比基于合成性假设的表示效果更好,而后者又显著地优于基于字面含义的理解。这说明一个好的模型不仅应该有合适的模型结构,也要有好的表示成语的方法。
域内/域外的划分
划分域内数据和域外数据的依据,是在三种文体上进行数据统计时,我们发现散文文体的文本长度和成语分布都与小说和新闻显著不同,而小说和新闻则没有太大的差别。我们认为这些统计上的差异体现出了文体特征的不同,因此将散文化为单独的域外集,用以测试模型的泛化能力。
比赛采用不同的题型
在比赛中,每条数据提供了一系列文段(不是孤立的文段),并且需要从一组给定的固定长度的候选成语中选择答案。但正如论文中所述,原始的 ChID 数据集为每个空格都提供了一组候选项(既不是整个文段,更不是一组段落),因此并没有在空格之间建立了联系。
由于原始 ChID 数据集规模较大,可以充分训练神经网络模型,从而在测试中获得高分。然而,同样是由于语料库规模过大,选项设计的规律有可能会被当作选择答案的线索,这就相当于作弊的行为,在这种情况下,模型并不能真正理解成语的含义。为了避免选项构成中可能存在的规律性,我们在比赛中重新设计了题型,这也提出了更具挑战性的问题。
基线模型不够充足
在论文评审中也有人提出:我们得出模型的泛化能力不如人类这一结论,应该在诸如 BERT 等最新的、非常强的基线模型上进行进一步的验证。但遗憾的是,当时由于时间原因,我们没来得及给出以 BERT 为基线模型的实验结果。但在比赛中,我们提供了 BERT 的基线模型分数以及相关代码,在比赛的后续阶段,我们还会公布 BERT 在测试集与域外集的分数。大家将会看到,即使是 BERT 这样的强模型,在域外集的分数也要明显地低于域内测试集的分数,由于比赛中的数据划分与论文中的描述完全一致,因此这样的结果可以作为论文中结论的间接佐证。
竞赛网站(biendata.com/competition/idiom)提供了基于 RNN 的代码,论文也提供了关于代码的描述。
程序结构
在完形填空的任务设置下,我们为问题提供了候选项。设计候选项的意义有二,一是在给定的成语表下,很可能会有多个同义的成语符合语境,这样会导致评估困难,二是成语之中近义词的现象普遍存在,通过合理地设计候选项能够使问题具有一定的难度。
1. Models/
2. - __init__.py
3. - AR.py
4. - BasicModel.py
5. - LM.py
6. - SAR.py
7. DataManager.py
8. Flags.py
9. idiomList.txt
10. judge.py
11. main.py
12. utils.py
RNN-based Baseline 的主要代码文件如下:
main.py : 主程序,控制模型的训练与测试
DataManager.py : 数据读取与预处理
Models/ :
BasicModel.py : 模型的基本方法
AR/LM/SAR : 三个 RNN-baseline 模型
Flags.py 是参数设置, utils.py 是额外的功能与方法
本章介绍 PyTorch 版本的 BERT 完成“成语理解大赛”的 baseline。
下载地址:
https://biendata.com/competition/idiom/data/
程序结构
1. pytorch_pretrained_bert/
2. - __init__.py
3. - __main__.py
4. - convert_tf_checkpoint_to_pytorch.py
5. - file_utils.py
6. - modeling.py
7. - optimization.py
8. - tokenization.py
9. idiomList.txt
10. run.sh
11. run_child.py
在 BERT-based Baseline 中, run_chid.py 是主程序,内含数据读取、数据预处理、特征提取、模型的训练与测试等内容。
pytorch_pretrained_bert 文件夹是 hugging-face 封装好的包,可以直接调用运行。
准备
我们的代码修改自 PyTorch BERT [3]。模型基于一个简单的多选择框架,它会匹配候选成语的嵌入(词向量)与空格位置的输出向量
在下载代码 [4] 后,你需要预训练中文 BERT 作为启动。在这里,我们使用了 Chinese BERT with Whole Word Masking (Cui Y et al.) [5] 这篇论文的预训练模型,提高针对中文任务的模型能力。
训练和预测
请把所有文件放进正确的路径中(可以直接下载整个代码包)。
中文 BERT 的 PyTorch 版本的权重需要放入 chinese_wwm_pytorch 文件夹。然后可以在命令行运行 run.sh :
1. bash run.sh
run.sh 的格式如下:
1. python run_chid.py \
2. --vocab_file ./chinese_wwm_pytorch/vocab.txt \
3. --bert_config_file ./chinese_wwm_pytorch/bert_config.json \
4. --init_checkpoint ./chinese_wwm_pytorch/pytorch_model.bin \
5. --do_train \
6. --do_predict \
7. --train_file ../data/train.txt \
8. --train_ans_file ../data/train_answer.csv \
9. --predict_file ../data/dev.txt \
10. --train_batch_size 32 \
11. --predict_batch_size 128 \
12. --learning_rate 2e-5 \
13. --num_train_epochs 10.0 \
14. --max_seq_length 256 \
15. --output_dir ./output_model
在你成功训练自己的模型后,你可以直接删除 --do_train \ ,用来预测验证集上的结果。生成的结果会保存为 ./output_model/prediction.csv 。
Our codes are adapted from PyTorch BERT [3].
竞赛和 baseline 代码地址请点击“阅读原文”。
🔍
现在,在「知乎」也能找到我们了
进入知乎首页搜索「PaperWeekly」
点击「关注」订阅我们的专栏吧
关于PaperWeekly
PaperWeekly 是一个推荐、解读、讨论、报道人工智能前沿论文成果的学术平台。如果你研究或从事 AI 领域,欢迎在公众号后台点击「交流群」,小助手将把你带入 PaperWeekly 的交流群里。
▽ 点击 | 阅读原文 | 查看比赛