{"id":13754382,"url":"https://github.com/zhanlaoban/EDA_NLP_for_Chinese","last_synced_at":"2025-05-09T22:32:13.105Z","repository":{"id":38421929,"uuid":"177537544","full_name":"zhanlaoban/EDA_NLP_for_Chinese","owner":"zhanlaoban","description":"An implement of the paper of EDA for Chinese corpus.中文语料的EDA数据增强工具。NLP数据增强。论文阅读笔记。","archived":false,"fork":false,"pushed_at":"2022-05-31T05:46:50.000Z","size":23,"stargazers_count":1368,"open_issues_count":17,"forks_count":240,"subscribers_count":16,"default_branch":"master","last_synced_at":"2025-04-09T07:02:57.993Z","etag":null,"topics":["chinese","chinese-data-augmentation","data-augmentation","easy-data-augmentation","eda","text-classification"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/zhanlaoban.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-03-25T07:39:48.000Z","updated_at":"2025-04-03T08:36:42.000Z","dependencies_parsed_at":"2022-08-09T04:00:26.668Z","dependency_job_id":null,"html_url":"https://github.com/zhanlaoban/EDA_NLP_for_Chinese","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhanlaoban%2FEDA_NLP_for_Chinese","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhanlaoban%2FEDA_NLP_for_Chinese/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhanlaoban%2FEDA_NLP_for_Chinese/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/zhanlaoban%2FEDA_NLP_for_Chinese/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/zhanlaoban","download_url":"https://codeload.github.com/zhanlaoban/EDA_NLP_for_Chinese/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253335989,"owners_count":21892768,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chinese","chinese-data-augmentation","data-augmentation","easy-data-augmentation","eda","text-classification"],"created_at":"2024-08-03T09:01:57.748Z","updated_at":"2025-05-09T22:32:08.091Z","avatar_url":"https://github.com/zhanlaoban.png","language":"Python","funding_links":[],"categories":["其他_NLP自然语言处理"],"sub_categories":["其他_文本生成、文本对话"],"readme":"# EDA_NLP_for_Chinese\r\n\r\n中文EDA实现。本工具是论文[《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》](https://arxiv.org/abs/1901.11196)的中文版本实现。  \r\n原作者虽给出了针对英文语料数据增强的代码实现，但不适合中文语料。我经过对原论文附上的代码的修改，现在推出这个适合中文语料的数据增强EDA的实现。\r\n\r\n\r\n\r\n# Usage\r\n\r\n1. 先将需要处理的语料按照下面的例子处理好成固定的格式：\r\n```\r\n0\t今天天气不错哦。\r\n\r\n1\t今天天气不行啊！不能出去玩了。\r\n\r\n0\t又是阳光明媚的一天！\r\n```\r\n\r\n\r\n即，标签+一个制表符\\t+内容\r\n\r\n2. 命令使用例子：\r\n\r\n`$python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05`\r\n\r\n这里：\r\n\r\ninput参数：需要进行增强的语料文件\r\n\r\noutput参数：输出文件\r\n\r\nnum_aug参数：每一条语料将增强的个数\r\n\r\nalpha参数：每一条语料中改动的词所占的比例\r\n\r\n\r\n\r\n具体使用方法同英文语料情况。请参考[eda_nlp](https://github.com/jasonwei20/eda_nlp)。\r\n\r\n\r\n\r\n# Chinese stopwords\r\n\r\n| 词表名                         | 词表文件            |\r\n| ------------------------------ | ------------------- |\r\n| 中文停用词表                   | cn_stopwords.txt    |\r\n| 哈工大停用词表                 | hit_stopwords.txt   |\r\n| 百度停用词表                   | baidu_stopwords.txt |\r\n| 四川大学机器智能实验室停用词库 | scu_stopwords.txt   |\r\n\r\n\r\n\r\n# Reference\r\n\r\n- 原仓库：[eda_nlp](https://github.com/jasonwei20/eda_nlp)。感谢原作者的付出。Thanks to the author of the paper.\r\n\r\n\r\n\r\n# Acknowledgments\r\n\r\n- [jieba分词](https://github.com/fxsjy/jieba)\r\n- [Synonyms](https://github.com/huyingxi/Synonyms)\r\n- [stopwords](https://github.com/goto456/stopwords)\r\n\r\n\r\n\r\n\r\n\r\n# 原论文阅读笔记  \r\n\r\n[《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》](https://arxiv.org/abs/1901.11196)\r\n\r\n\r\n# 简介\r\n\r\n\r\n在这篇论文中，作者提出所谓的EDA，即简单数据增强(easy data augmentation)，包括了四种方法：**同义词替换、随机插入、随机交换、随机删除**。作者使用了CNN和RNN分别在五种不同的文本分类任务中做了实验，实验表明，EDA提升了分类效果。作者也表示，平均情况下，仅使用50%的原始数据，再使用EDA进行数据增强，能取得和使用所有数据情况下训练得到的准确率。\r\n\r\n \r\n\r\n# 已有方法及其问题所在\r\n\r\n- 英法互译\r\n- 同义词替换\r\n- 数据噪声\r\n\r\n由于没有一般的语言转换的通用规则，因此NLP中的通用数据增强技术人们探索甚少。上述若干方法，相对于其能提升的性能，实现开销更大。\r\n\r\n作者还列举出了其他一些增强方法，而EDA的优点在于能以更简单的方法获得差不多的性能。\r\n\r\n \r\n\r\n# 创新思路\r\n\r\n在本文，作者提出**通用的**NLP数据增强技术，命名为EDA。同时作者表示，他们是第一个给数据增强引入文本编辑技术的人。EDA的提出，也是一定程度上受计算机视觉上增强技术的启发而得到。下面详细介绍EDA的四个方法：\r\n\r\n对于训练集中的每个句子，执行下列操作：\r\n\r\n- 同义词替换(Synonym Replacement, SR)：从句子中随机选取n个不属于停用词集的单词，并随机选择其同义词替换它们；\r\n- 随机插入(Random Insertion, RI)：随机的找出句中某个不属于停用词集的词，并求出其随机的同义词，将该同义词插入句子的一个随机位置。重复n次；\r\n- 随机交换(Random Swap, RS)：随机的选择句中两个单词并交换它们的位置。重复n次；\r\n- 随机删除(Random Deletion, RD)：以 $p$ 的概率，随机的移除句中的每个单词；\r\n\r\n这些方法里，只有SR曾经被人研究过，其他三种方法都是本文作者首次提出。\r\n\r\n值得一提的是，长句子相对于短句子，存在一个特性：长句比短句有更多的单词，因此长句在保持原有的类别标签的情况下，能吸收更多的噪声。为了充分利用这个特性，作者提出一个方法：基于句子长度来变化改变的单词数，换句话说，就是不同的句长，因增强而改变的单词数可能不同。具体实现：对于SR、RI、RS，遵循公式：$n$ = $\\alpha$ * $l$，$l$ 表示句长，$\\alpha$ 表示一个句子中需要改变的单词数的比例。在RD中，让 $p$ 和 $\\alpha$ 相等。另外，每个原始句子，生成 $n_{aug}$ 个增强的句子。\r\n\r\n \r\n\r\n# 实验环节\r\n\r\n## 实验设置\r\n\r\n作者使用了5个不同的Benchmark数据集（这里不再介绍每个数据集是什么，如果你想了解可以去查原论文，但没太大必要），这样就有5种文本分类任务，使用了两个state-of-the-art文本分类的模型：[LSTM-RNN](https://arxiv.org/abs/1605.05101)和[CNNs](https://arxiv.org/abs/1408.5882)。并将有无EDA作为对比，同时因为欲得到EDA在小数据集上的实验效果，将训练数据集大小分为500、2000、5000、完整这4个量级。每个训练效果是在5个文本分类任务上的效果均值。\r\n\r\n## 实验结果\r\n\r\n- 实验结果是：在完整的数据集上，平均性能提升0.8%；在大小为500的训练集上，提升3.0%。具体见如下表1：\r\n\r\n\r\n![2019-05-16_071449.png](https://i.loli.net/2019/05/16/5cdd0e15105fd83061.png)\r\n\u003ccenter\u003e表1\u003c/center\u003e\r\n- 作者指出，EDA在小训练集上有更好的性能效果。若使用完整的训练集数据，不使用EDA的情况下，最佳的平均准确率达到88.3%。若使用50%的训练集数据并且使用EDA的情况下，最佳的平均准确率达到88.6%，超过前述情况。\r\n\r\n- 若句子中有多个单词被改变了，那么句子的原始标签类别是否还会有效？作者做了实验：首先，使用RNN在一未使用EDA过的数据集上进行训练；然后，对测试集进行EDA扩增，每个原始句子扩增出9个增强的句子，将这些句子作为测试集输入到RNN中；最后，从最后一个全连接层取出输出向量。应用t-SNE技术，将这些向量以二维的形式表示出来。实验结果就是，增强句子的隐藏空间表征紧紧环绕在这些原始句子的周围。作者的结论是，句子中有多个单词被改变了，那么句子的原始标签类别就可能无效了。\r\n\r\n- 对于EDA中的每个方法，单独提升的效果如何？作者做实验得出的结论是，对于每个方法在小数据集上取得的效果更明显。$\\alpha$ 如果太大的话，甚至会降低模型表现效果，$\\alpha$=0.1似乎是最佳值。\r\n\r\n- 如何选取合适的增强语句个数？在较小的数据集上，模型容易过拟合，因此生成多一点的语料能取得较好的效果。对于较大的数据集，每句话生成超过4个句子对于模型的效果提升就没有太大帮助。因此，作者推荐实际使用中的一些参数选取如表2所示：\r\n\r\n![2019-05-17_152900.png](https://i.loli.net/2019/05/17/5cde62e5a4c5a76804.png)\r\n\u003ccenter\u003e表2\u003c/center\u003e\r\n​\t\t其中，$n_{aug}$ ：每个原始语句的增强语句个数；$N_{train}$：训练集大小\r\n\r\n\r\n\r\n# 其它\r\n\r\n## 1. EDA提高文本分类的效果的原理是什么？\r\n\r\n- 生成类似于原始数据的增强数据会引入一定程度的噪声，有助于防止过拟合；\r\n\r\n- 使用EDA可以通过同义词替换和随机插入操作引入新的词汇，允许模型泛化到那些在测试集中但不在训练集中的单词；\r\n\r\n## 2. 为什么使用EDA而不使用语境增强、噪声、GAN和反向翻译？\r\n\r\n上述的其它增强技术作者都希望你使用，它们确实在一些情况下取得比EDA较好的性能，但是，由于需要一个深度学习模型，这些技术往往在其取得的效果面前，付出的实现代价更高。而EDA的目标在于，使用简单方便的技术就能取得相接近的结果。\r\n\r\n## 3. EDA是否有可能会降低模型的性能？\r\n\r\n确实有可能。原因在于，EDA有可能在增强的过程中，改变了句子的意思，但其仍保留原始的类别标签，从而产生了标签错误的句子。  \r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhanlaoban%2FEDA_NLP_for_Chinese","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fzhanlaoban%2FEDA_NLP_for_Chinese","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fzhanlaoban%2FEDA_NLP_for_Chinese/lists"}