Skip to content

Latest commit

 

History

History
87 lines (79 loc) · 6.4 KB

README.md

File metadata and controls

87 lines (79 loc) · 6.4 KB

预训练数据扩增思路介绍

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中除了该数的其他任意一个数。
  • 汉字数字替换:汉字数字是一-九的字符组合,替换方式类似阿拉伯数字。