> For the complete documentation index, see [llms.txt](https://kerasnoone.gitbook.io/garnet/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kerasnoone.gitbook.io/garnet/shi-jian-ji-qiao/shu-ju-zeng-qiang/wen-ben-shu-ju-zeng-qiang.md).

# 文本数据增强

## NLP中数据增强的应用场景

### 样本数量较少

无论训练任何任务, 任何模型, 都需要一定数量训练样本的保证. 缺少训练样本的场景, 可以使用数据增强快速补充训练样本.

### 样本不均衡

在分类任务中经常遇到样本不平衡的问题, 样本数量很少的类别, 往往得不到充分的训练, 处于欠拟合的状态, 线上预测也不会得到很高的概率分数. 此时可以通过数据增强不足正样本的数量, 降低正负样本不平衡的比例, 最终提升模型的泛化能力.

### 提高模型的鲁棒性

通过数据增强丰富语料中信息表达的多样性, 使模型更加关注文本的语义信息, 降低局部噪声的影响, 最终提升模型的鲁棒性

## NLP数据增强技术

### 回译

回译技术就是使用先进的翻译系统(Google)将语言A的文本先翻译成语言B, 然后再翻译回语言A从而实现样本增强的目的.

回译技术效果如此好得益于机器翻译模型的强大, **根本原因是迁移学习**. 我们通过回译技术把翻译模型学到的语义, 语法, 句法等知识转移到了新生成的样本上, 为当前自然语言处理任务引入了新的信息和知识来源.

回译技术还存在**多样性**和**噪音**平衡的选择问题. 例如为了进一步丰富增强样本的多样性, 可以将样本从语言A翻译成语言B, 再翻译成语言C, 再将语言C翻译回语言A, 得到新样本. 毫无疑问, 这样得到的样本进一步丰富了, 但多个翻译模型也累积了更多的噪声, 可能会对原始文本的语义造成伤害.

### 词替换

#### EDA

EDA(Easy Data Augmentation)是论文[A Survey of Data Augmentation Approaches for NLP](https://arxiv.org/abs/2105.03075)中提出来的, 综合了四种简单操作的数据增强技术. 包含:

* 同义词替换(SR, Synonyms Replace): 不考虑停用词, 在句子中随机抽取N个词, 然后从同义词词典中随机抽取同义词, 并进行替换
* 随机插入(RI, Randomly Insert): 不考虑停用词, 随机抽取一个词, 然后在该词的同义词集合中随机选择一个, 插入原句子中的随机位置. 该过程可以重复N次
* 随机交换(RS, Randomly Swap): 句子中, 随机选择两个词, 位置交换. 该过程可以重复N次
* 随机删除(RD, Randomly Delete): 句子中的每个词, 以概率p随机删除

这种方法比较粗糙, 可能不会带来整体效果的提升, 甚至引入过多的噪音. 更详细的EDA说明参考原论文, 或下面的文章:

* [NLP中一些简单的数据增强技术](https://zhuanlan.zhihu.com/p/63182132)

代码可以参考:

* [EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks](https://github.com/jasonwei20/eda_nlp)

#### 基于 Word Embedding 的替换

基于Word Embedding的替换技术其实和同义词典的方法是一致的, 只是这里维护的不是显式的字典, 而这种方法是将所有字词映射到embedding向量空间中, 通过向量的距离来判断词之间是否相似, 进而决定两个词是否是同义词.

![](/files/-MdokfyWruDGkbLn8y6c)

#### 基于 Masked LM 的替换

使用Word2Vec等技术得到的Word Embedding无法解决**一词多义**的问题, 同一个词在不同的上下文中, 蕴含的意思有非常大的差异. 因此使用同一个embedding向量表征就会出现较大的误差.

而BERT这类模型, 使用Masked LM学习token的表征, 融合了上下文的信息, 得到动态的表征. 在文本增强中使用时, 将某个token使用`[mask]`token进行替代, 预测这个位置的token在词库中的概率分布, 按概率采样.

![](/files/-MdokfyYTmCB-t5CmWBr)

这种方法因为考虑了上下文信息, 所以生成的文本更符合语法规范.

### 规则

#### 随机打乱语句顺序

将文本中的语句顺序打乱从而生成新的样本.

#### 操纵语法树

操纵语法树技术的思想是通过解析并生成原始语句的依赖树, 然后使用规则对原来的语句进行复述从而生成新数据.

下面时一个将主动语态句子转换为被动语态的例子:

![](/files/-Mdokfy_XfGveeI_MWaN)

### 生成式

#### SimBERT

[鱼与熊掌兼得：融合检索和生成的SimBERT模型](https://kexue.fm/archives/7427)

## 参考资料

* [广告行业中那些趣事系列13：NLP中超实用的样本增强技术](https://mp.weixin.qq.com/s?__biz=MzU1NjYyODQ4NA==\&mid=2247484195\&idx=1\&sn=23ab2206cead176da5cf31e1ea9cb18c\&chksm=fbc36c48ccb4e55e3bce36fadfe979408e8bf3ffeb82cdc7faabbece551050b19669a6ee90d5\&scene=21#wechat_redirect)
