在图像领域,有不少数据增强的办法,用来对数据进行增强,比如图片旋转,图片的裁剪,随机噪声等。而在文本领域,同样有很多针对文本的预处理方法和数据增强的方法。这些方法在提高模型的泛化能力上起到很重要的作用,在各种比赛中也经常被使用到。
文本预处理
停用词过滤。无论中文还是英文,都可以进行停用词的过滤。但是,停用词过滤并不是效果都好的,需要根据具体情况来决定。
特殊字符的处理。比如:’°’, ‘€’, ‘™’, ‘›’, ‘♥’, ‘←’等特殊字符,可以在预处理时候过滤掉。至于如何发现文本数据中是否包含某些特殊字符。。。
词表vocab的构建。通常在进行自然语言任务时,我们需要根据预料来构建一个词表,该词表相当于一个word/char 到token的映射,便于我们将文本序列映射成一个整数序列。那么在构建这个词表时,通常只考虑频率超过某个阈值的词,或者是过滤掉频率小于某个阈值的词。一方面,可以控制词表的大小,另一方面频率太低的词语义表示也不是很清晰(没有大量预料来通过word2vec等工具来训练出其语义)。
OOV词处理。当已经给出了预训练词向量时,如果OOV词数量比较少,则可以直接作为unknown词进行处理,如果OOV词数量太多,根据频率为其生成随机词向量。
数字的替换。数字通常会很稀疏,并且在大多数NLP任务中不是那么重要,这个时候,可以将数字隐射成一个固定的标签,比如:13 -> “##“;14 -> “##“;144 -> “###“; 年份也可以给其一个固定的标签,比如:“2018-11-12”->“_date_”,然后再给映射后的标签生成随机向量。这样可以把数字,时间等映射成固定的向量。当然,这么做的前提条件是你的任务对这些数字并不敢兴趣。
中文方面,可以字转拼音。繁体转简体等。
英文方面,可以做词干抽取和词性还原等操作。
关于截断补齐。阶段补齐长度通常可以通过文本的长度分布来确定一个合理的值。截断补齐又分为从前面截断和从后面截断,需要根据具体情况而定。甚至可以两种截断方式都采用,最后将两种结果结合起来,得到最终的结果。
手工特征的归一化。此处需要了解常用的归一化方法。
emoji。处理文本中出现的表情。
文本预处理技术https://github.com/Deffro/text-preprocessing-techniques
文本中,有高频词,对应也有低频词。低频词的一般处理都是直接舍弃。因为出现频率较低,在训练过程中它对文本语义产生的影响也较小。另一方面,直接舍弃低频词也可以在一定程度上节省空间。
数据增强
文本领域的数据增强比较少见,但是在竞赛过程中也不乏见到一些比较脑洞的思路。做数据增强有几个目的,第一个是在数据量较小的时候可以增加数据量,防止因为数据量太小而带来的过拟合问题,其次,可以在模型的输入端引入一定的数据扰动,使得可以在数据层面产生多样性,提高泛化能力。当然,缺点也是存在的,通常样本增强是随机进行的,因此不可避免的产生一些噪声数据。
随机shuffle。也就是随机的打乱文本数据。这种方法很明显打乱了文本的位置信息,通常也不会取得很好的效果。模型将会降级为词袋模型。
随机删除。随机丢掉文本中一定数量的词。如果丢掉了关键词怎么办?
利用对偶学习(微软)进行数据增强。假设原始预料为中文,则可以先将中文翻译为英文,然后再将英文翻译回中文,以此来增加数据量和数据的差异性。微软在提出对偶学习的时候,一个考虑就在于希望通过较少的数据就可以将机器学习模型训练好。
随机的字符插入。
同义词替换。需要准备同义词词典,比如利用wordnet,翻译成中文,然后替换。
构建图来增加数据量。要求在训练集中问题重复出现的频次较高。
其他思考
在进行数据增强是,如何判断数据质量?增加多少增强的数据比较合理?有没有什么衡量指标可以做到。