by KuyiKing
只修改样本的问题(question)部分,使得修改后的问题:1)改变了询问主题,以使样本无答案;2)不改变询问主题,以增加问答对的丰富程度。
输入:问题字符串(string);输出:新问题字符串(string),使用的扩增方法名称(string)。根据扩增方法名称知晓问题的主旨是否改变。
- 下载开源的《现代汉语词典》文档;
- 使用规则对《现代汉语词典》正文进行抽取,获得名词、动词、形容词、副词四类词的列表;
- 使用开源的同义词、近义词词典,结合百度汉语的信息,对名词、动词、形容词、副词按如下格式生成四类词的.json格式近/反义词典文件:
{word_1: {"antonym": [ant_word_1, ant_word_2, ...],
"synonym": [syn_word_1, syn_word_2, ...]},
word_2: {"antonym": [ant_word_1, ant_word_2, ...],
"synonym": [syn_word_1, syn_word_2, ...]},
...
}
- 基于名词的特性,使用规则对《现代汉语词典》中名词的定义、释义、造句例子等进行信息提取,获得该名词对应的同义/近义词/短语,提取规则包含但不限于:
- 又称为……(标点)
- 简称为……(标点)
- 也叫……(标点)
- ……的别称(标点)
- 意/泛指……(标点)
- 又叫[作]……等(标点)
- 对……的称呼(标点)
- 见【……】
- 以名词为例说明使用近/反义词词典扩增问题的方式:输入当前问句,使用LTP库获取该问句中的所有名词,以0.5概率交替采用以下两种策略选择待替换的名词(注:最终版仅使用随机选取,因为偏正短语结合排序效率极低且效果提升不明显):
- 随机选取;
- 按包含该词的偏正短语长度排序,优先选取字数最多的短语里的那个名词。
- 使用待替换名词分别查询名词近义词词典与名词反义词词典,若该词在词典中,则随机选取词典中的近/反义词替换,这样就得到两个新样本,一个无答案(经反义词替换),一个是原答案(经近义词替换)。
- 若待替换名词未出现在词典中,则换问题中另外的名词重复上述过程。若已无名词,则返回原问题,并打印“未做扩增”。
- 下载开源的《大词林》图谱,选择其中的三元组(头实体,关系,尾实体)数据集作处理;
- 清洗三元组,例如将三元组中并列关系拆分、去除冗余符号与乱码等;
- 使用关键词(例如,“名”、“称”、“同义”等)粗筛三元组中的近/同义关系,再从中人工选出表示近/同义的关系类型,举例如下:
LST_REL = ["别名", "别称", "简称", "同义词", "本名", "艺名", "又称", "又名", "全称", "全名", "其他名称", "中文学名","学名", "古称", "其他译名", "俗称", "旧称", "中文简称", "亦称", "昵称", "另名", "泛称", "其他称呼", "真名", "曾用名", ...]
- 遍历三元组数据集,保留拥有近/同义关系的实体,生成近/同义实体词典:
{entity_1: [syn_entity_1, syn_entity_2, ...],
entity_2: [syn_entity_1, syn_entity_2, ...],
...
}
- 输入当前问句,使用LTP库与自研的NER模型获取该问句中的所有实体(实际为了扩展范围,获取的是所有名词),随机选取其中一个实体作为待替换实体;
- 替换操作类似基于词典扩增方法中的操作,不再赘述。
- 《大词林》还有实体间的上下文信息,但观察后发现效果不佳,因此未采纳上下位词词典。
- 构建基础字库:基于《现代汉语词典》、《大词林》、CN-DBPedia、7lore及其他零散汉字数据,利用开源的汉字笔画数字典作筛选,构建一个常用汉字字库。
- 构建形近字字典:下载、清洗、去重开源的形近字数据集,得到形近字字典。
- 构建音近字字典:使用pinyin库的多音字功能,遍历汉字字库,为每个字注上拼音,并将相同拼音的字聚合作为音近字。
- 构建结构分类字典:使用开源的结构分类数据,构建结构分类字典,结构分为上下、左右、上中下、左中右、包围、半包围、简笔等类型。
- 构建四角号码字典:基于汉字的四角号码信息聚合汉字,将结构相近的汉字视为形近字。
- 构建错别字字典:将上述各字典合并构建错别字字典,字典中格式如下:
{字1: {"number": 笔画数,
"similar_phone": [[音近字, 该字笔画数], ...],
"similar_form": [[形近字, 该字笔画数], ...]},
字2: {"number": 笔画数,
"similar_phone": [[音近字, 该字笔画数], ...],
"similar_form": [[形近字, 该字笔画数], ...]},
...}
- 错别字替换:输入问题,利用LTP识别出问题中的名词、成语、俗语、昵称等词汇,按照偏正短语长度和句中位置规律排序,从排在第一位的词中随机选择汉字,查询错别字字典。若查到该汉字,首先从与该字笔画数相同的相似字查起,随机选择一个相似字替换换;若无笔画相同的相似字,则按笔画递增1画、递减1画、递增2画、递减2画……的策略查询;若字典中无该汉字,则随机选择词中其他字查找;若该词汉字都差不到则选择下一个词……按该策略,当首次替换成功后停步,输出错别字替换后的问题。
- 查询数字:输入问题,利用LTP查询其中的数量词短语,从返回结果中随机选取一组,抽取出数词部分;若无结果,利用正则表达式匹配数字(因匹配不够精准,该方法后期未采用);若无结果,返回原问题并打印“未做扩增”。
- 识别数字:使用规则判断该数字是中文还是阿拉伯数字。
- 阿拉伯数字替换:阿拉伯数字是0-9的字符组合,以0.5概率采用如下方法随机替换(注:最终版详见代码):
- 随机打乱原数字顺序,头尾去掉0;
- 随机取其中1位,替换为0-9中除了该数的其他任意一个数。
- 汉字数字替换:汉字数字是一-九的字符组合,替换方式类似阿拉伯数字。