GithubHelp home page GithubHelp logo

zhanlaoban / eda_nlp_for_chinese Goto Github PK

View Code? Open in Web Editor NEW
1.3K 17.0 242.0 23 KB

An implement of the paper of EDA for Chinese corpus.中文语料的EDA数据增强工具。NLP数据增强。论文阅读笔记。

Python 100.00%
eda data-augmentation chinese-data-augmentation chinese easy-data-augmentation text-classification

eda_nlp_for_chinese's Introduction

EDA_NLP_for_Chinese

中文EDA实现。本工具是论文《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》的中文版本实现。
原作者虽给出了针对英文语料数据增强的代码实现,但不适合中文语料。我经过对原论文附上的代码的修改,现在推出这个适合中文语料的数据增强EDA的实现。

Usage

  1. 先将需要处理的语料按照下面的例子处理好成固定的格式:
0	今天天气不错哦。

1	今天天气不行啊!不能出去玩了。

0	又是阳光明媚的一天!

即,标签+一个制表符\t+内容

  1. 命令使用例子:

$python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05

这里:

input参数:需要进行增强的语料文件

output参数:输出文件

num_aug参数:每一条语料将增强的个数

alpha参数:每一条语料中改动的词所占的比例

具体使用方法同英文语料情况。请参考eda_nlp

Chinese stopwords

词表名 词表文件
中文停用词表 cn_stopwords.txt
哈工大停用词表 hit_stopwords.txt
百度停用词表 baidu_stopwords.txt
四川大学机器智能实验室停用词库 scu_stopwords.txt

Reference

  • 原仓库:eda_nlp。感谢原作者的付出。Thanks to the author of the paper.

Acknowledgments

原论文阅读笔记

《EDA: Easy Data Augmentation Techniques for Boosting Performance on Text Classification Tasks》

简介

在这篇论文中,作者提出所谓的EDA,即简单数据增强(easy data augmentation),包括了四种方法:同义词替换、随机插入、随机交换、随机删除。作者使用了CNN和RNN分别在五种不同的文本分类任务中做了实验,实验表明,EDA提升了分类效果。作者也表示,平均情况下,仅使用50%的原始数据,再使用EDA进行数据增强,能取得和使用所有数据情况下训练得到的准确率。

已有方法及其问题所在

  • 英法互译
  • 同义词替换
  • 数据噪声

由于没有一般的语言转换的通用规则,因此NLP中的通用数据增强技术人们探索甚少。上述若干方法,相对于其能提升的性能,实现开销更大。

作者还列举出了其他一些增强方法,而EDA的优点在于能以更简单的方法获得差不多的性能。

创新思路

在本文,作者提出通用的NLP数据增强技术,命名为EDA。同时作者表示,他们是第一个给数据增强引入文本编辑技术的人。EDA的提出,也是一定程度上受计算机视觉上增强技术的启发而得到。下面详细介绍EDA的四个方法:

对于训练集中的每个句子,执行下列操作:

  • 同义词替换(Synonym Replacement, SR):从句子中随机选取n个不属于停用词集的单词,并随机选择其同义词替换它们;
  • 随机插入(Random Insertion, RI):随机的找出句中某个不属于停用词集的词,并求出其随机的同义词,将该同义词插入句子的一个随机位置。重复n次;
  • 随机交换(Random Swap, RS):随机的选择句中两个单词并交换它们的位置。重复n次;
  • 随机删除(Random Deletion, RD):以 $p$ 的概率,随机的移除句中的每个单词;

这些方法里,只有SR曾经被人研究过,其他三种方法都是本文作者首次提出。

值得一提的是,长句子相对于短句子,存在一个特性:长句比短句有更多的单词,因此长句在保持原有的类别标签的情况下,能吸收更多的噪声。为了充分利用这个特性,作者提出一个方法:基于句子长度来变化改变的单词数,换句话说,就是不同的句长,因增强而改变的单词数可能不同。具体实现:对于SR、RI、RS,遵循公式:$n$ = $\alpha$ * $l$,$l$ 表示句长,$\alpha$ 表示一个句子中需要改变的单词数的比例。在RD中,让 $p$$\alpha$ 相等。另外,每个原始句子,生成 $n_{aug}$ 个增强的句子。

实验环节

实验设置

作者使用了5个不同的Benchmark数据集(这里不再介绍每个数据集是什么,如果你想了解可以去查原论文,但没太大必要),这样就有5种文本分类任务,使用了两个state-of-the-art文本分类的模型:LSTM-RNNCNNs。并将有无EDA作为对比,同时因为欲得到EDA在小数据集上的实验效果,将训练数据集大小分为500、2000、5000、完整这4个量级。每个训练效果是在5个文本分类任务上的效果均值。

实验结果

  • 实验结果是:在完整的数据集上,平均性能提升0.8%;在大小为500的训练集上,提升3.0%。具体见如下表1:

2019-05-16_071449.png

表1 - 作者指出,EDA在小训练集上有更好的性能效果。若使用完整的训练集数据,不使用EDA的情况下,最佳的平均准确率达到88.3%。若使用50%的训练集数据并且使用EDA的情况下,最佳的平均准确率达到88.6%,超过前述情况。
  • 若句子中有多个单词被改变了,那么句子的原始标签类别是否还会有效?作者做了实验:首先,使用RNN在一未使用EDA过的数据集上进行训练;然后,对测试集进行EDA扩增,每个原始句子扩增出9个增强的句子,将这些句子作为测试集输入到RNN中;最后,从最后一个全连接层取出输出向量。应用t-SNE技术,将这些向量以二维的形式表示出来。实验结果就是,增强句子的隐藏空间表征紧紧环绕在这些原始句子的周围。作者的结论是,句子中有多个单词被改变了,那么句子的原始标签类别就可能无效了。

  • 对于EDA中的每个方法,单独提升的效果如何?作者做实验得出的结论是,对于每个方法在小数据集上取得的效果更明显。$\alpha$ 如果太大的话,甚至会降低模型表现效果,$\alpha$=0.1似乎是最佳值。

  • 如何选取合适的增强语句个数?在较小的数据集上,模型容易过拟合,因此生成多一点的语料能取得较好的效果。对于较大的数据集,每句话生成超过4个句子对于模型的效果提升就没有太大帮助。因此,作者推荐实际使用中的一些参数选取如表2所示:

2019-05-17_152900.png

表2 ​ 其中,$n_{aug}$ :每个原始语句的增强语句个数;$N_{train}$:训练集大小

其它

1. EDA提高文本分类的效果的原理是什么?

  • 生成类似于原始数据的增强数据会引入一定程度的噪声,有助于防止过拟合;

  • 使用EDA可以通过同义词替换和随机插入操作引入新的词汇,允许模型泛化到那些在测试集中但不在训练集中的单词;

2. 为什么使用EDA而不使用语境增强、噪声、GAN和反向翻译?

上述的其它增强技术作者都希望你使用,它们确实在一些情况下取得比EDA较好的性能,但是,由于需要一个深度学习模型,这些技术往往在其取得的效果面前,付出的实现代价更高。而EDA的目标在于,使用简单方便的技术就能取得相接近的结果。

3. EDA是否有可能会降低模型的性能?

确实有可能。原因在于,EDA有可能在增强的过程中,改变了句子的意思,但其仍保留原始的类别标签,从而产生了标签错误的句子。

eda_nlp_for_chinese's People

Contributors

zhanlaoban avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

eda_nlp_for_chinese's Issues

使用原有数据测试时报错IndexError: list index out of range

正在使用EDA生成增强语句...
Traceback (most recent call last):
File "C:\Users\HP-OMEN\Desktop\project\code\EDA_NLP_for_Chinese-master\EDA_NLP_for_Chinese-master\code\augment.py", line 54, in
gen_eda(args.input, output, alpha=alpha, num_aug=num_aug)
File "C:\Users\HP-OMEN\Desktop\project\code\EDA_NLP_for_Chinese-master\EDA_NLP_for_Chinese-master\code\augment.py", line 44, in gen_eda
sentence = parts[1]
IndexError: list index out of range

生成的output.txt文件内容为:
0 今天天气 很棒 哦 。
0 今天天气 不错 哦 。
0 哟 不错 哦 。
0 喔 不错 哦 。
0 今天天气 哈哈哈 不错 哦 。
0 今天天气 不错 吧 哦 。
0 今天天气 不错 哦
0 今天天气 不错 哦
0 今天天气 不错 。 哦
0 yoi 不错 哦 。
0 今天天气 不错 哦 呵呵 。
0 今儿个 今天天气 不错 哦 。
0 今天天气 很棒 哦 。
0 。 不错 哦 今天天气
0 今天天气 不错 哦 。
0 今天天气 不错 。 哦
0 今天天气 不错 哦 。

about alpha?

I see your script is python code/augment.py --input=train.txt --output=train_augmented.txt --num_aug=16 --alpha=0.05 to share an alpha value.
But I want to set different alpha. What should I do

alpha_sr=alpha, alpha_ri=alpha, alpha_rs=alpha, alpha_rd=alpha

您好,label作用

您好,我也看完了9个issue,还有里面eda的代码。
但是我看到label除了读进来,写入。。没有发现他对rs等有什么具体的意义。
如果我理解错了,希望您能告诉我

可以不使用标签吗

我看到数据前面有01标签,我只想得到扩充的数据,用于机器翻译,是否可以不适用标签,或者直接用0123456顺序号

没有停用词库呀

No such file or directory: 'stopwords/HIT_stop_words.txt',还要自己去下载吗

句子的原始类别标签是有效的

“实验结果就是,增强句子的隐藏空间表征紧紧环绕在这些原始句子的周围。作者的结论是,句子中有多个单词被改变了,那么句子的原始标签类别就可能无效了。” 表征紧紧的在原表征周围的话,那句子不是应该语意接近吗。那么句子的原始类别标签是有效的哇

关于n的问题

n_sr = max(1, int(alpha_sr * num_words))
n_ri = max(1, int(alpha_ri * num_words))
n_rs = max(1, int(alpha_rs * num_words))

请问为啥要和1比呀?这样一来替换、删除或插入n最多只能变一个?(不知道我理解错没,还望指正!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.