Awesome
以2019年数据智能创新应用大赛——基于Adversarial Attack的问题等价性判别比赛为背景
基于Adversarial Attack的问题等价性判别比赛][https://www.biendata.com/competition/2019diac/]
首先,对主办方提供的数据集进行增强,增强的途径主要有以下两种:
一. 生成对抗样本,提升模型的鲁棒性
Idea:由于现实情况中包含较多的对抗样本(如错别字等),因此要想提高模型的鲁棒性,最为有效的方法就是在训练集里面添加对抗样本。主要的方法有同音字替换和近义词替换。之所以不先对对抗样本进行纠错,在输入模型进行判断是因为现有的纠错工作的效果不理想。具体步骤如下:
首先,从训练集中随机抽取一定比例的样本进行增强。之后随机选取两种增强办法中的一种对样本进行增强,并且只对样本中的某个问题(q1或者q2)进行同音字或者同义词替换。这两种替换的方法如下:
近义词替换
工具:HanLP,cilin.txt(同义词词林)
(1) 利用HanLP.segment(),对选中的文本进行分词
(2) 根据分词的长度,确定替换的词的数目keynum
(3) 利用 HanLP.extractKeyword()提取keynum个关键词keywordList,并依次对keywordlist中的关键词进行同义词替换
(4) 根据cilin.txt构建同义词表
(5) 对每个关键词执行如下替换规则(规则可更改)
如果该词在同义词表中,则选择同义词表中离该词最近的同义词进行替换
如果该词不在同义词表中,则不进行替换
同音字替换
工具:HanLP,same_pinyin.txt(同音字词典),chinese-words.txt(字频表)
(1) 利用HanLP.segment(),对选中的文本进行分词
(2) 根据分词的长度,确定替换的词的数目keynum
(3) 利用 HanLP.extractKeyword()提取keynum个关键词keywordList,并依次对keywordlist中的关键词中所有字集合进行同音字替换
(4) 根据same_pinyin.txt和chinese-words.txt构建同音字词典和字频表
(5) 替换规则为:将待替换的字替换为该字的同音字,并且该同音字为所有同音字中出现频率最高(根据字频表判断)
二. 第二种对数据进行增强的办法,就是尽可能地提取两个问题的模式串,以辅助模型进行分类
Idea:由于样本中的问题长度都较短,且在现实情况中存在较多对抗样本,进一步增加了等价性判断的难度。因此需要对每个样本中包含的信息进行扩充,以提升模型的训练效果。
提取样本中两个问题的相同词汇和不同词汇
Idea:通过相同词和不同词汇提升模型的预测能力
增强前的样本:[q11,q21,label]
增强后的样本:[q11,q21,q12,q22,q3,label],其中q12为q11与q21中不相同的词汇;q22为q21与q11中不相同的词汇;q3为q11和q21中相同的词汇
使用通配符替换样本中两个问题相同的名词性词汇
增强前的样本:[q11,q21,label]
增强后的样本:[q11,q21,q12,q22,label],其中q12为q11的pattern;q22为q21的pattern
工具:HanLP(同义词词林)
(1) 同样的需要先对样本中的两个问题进行分词,并标注词性,选中的函数为HanLP.segment(),该函数能一个文本进行分词,并进行词性标注
(2) 确定要将替换成通配符(如A,B,C…等)的句子成分,主要包括名词和代词(具体如下),不对动词进行替换,因为对动词进行替换后对句子的结构破坏较大
替换的词性如下:
"n", "nb", "nba", "nbc", "nbp", "nf", "ng", "nh", "nhd", "nhm", "ni", "nic", "nis", "nit", "nl", "nm","nmc", "nnd", "nnt","nr", "nr1", "nr2", "nrf", "nri", "ns", "nsf", "nt", "ntc", "ntcb", "ntcf", "ntch","nth", "nto","nts", "ntu", "nx", "nz", "rr","r","rz"
我们还统计了训练集中出现的一些不影响问题等价性判断的成分,如请问、谢谢了、问一下等,这些词汇存储在otherwords.txt中,使用方法可参考tongji.py中的re_replace()
文件
data_process_2.py 包含生成包含不同数据集的函数,具体函数看代码的相关注释(主要有近义词替换,同音字替换,样本翻转,两个问题相同和不同词汇提取,使用通配符代替相同的名词性词语以获取句式的pattern
data_process_2_1.py包含各种预处理函数
tongji.py:该函数主要想找测试集的leak,通过查找测试集和训练集中的相同样本,以及通过A->C,B->C规则查找,但是最后发现用处不大
stopwords.txt:停用词表
same_pinyin.txt:相同拼音的词,其中第二列表示同音同调,同音异调
otherwords.txt: 人工统计数据集中包含的礼貌用语,这些词语对文本的相似性没用作用,甚至有干扰作用,如:请问,谢谢等词语
cilin.txt:哈工大的同义词林
chinese-words.txt:中文字频表
运行代码:
根据生成数据集的格式不同,调用不同的生成函数
python data_process_2.py
# 获得最终版本的数据,数据格式为[q11,q21,q12,q22,q31,label],并从原始训练集里切5000条数据作为测试集数据增强加到了10000条q12:q1中与q2不同的词汇q22:q2中与q1不同的词汇q31:q1与q2相同的词汇。
# 并且对10%的正样本进行近义词替换/同音字替换