如何在NLP项目中进行数据扩增

486 阅读5分钟

在机器学习中,你需要有大量的数据,以实现强大的模型性能。

使用一种被称为数据增强的方法,你可以为你的机器学习项目创造更多的数据。数据增强是一个技术集合,它管理着在现有数据基础上自动生成高质量数据的过程。

在计算机视觉应用中,扩增方法是很常见的。例如,如果你正在进行一个计算机视觉项目(如图像分类),你可以对每张图像应用几十种技术:移动、修改颜色强度、缩放、旋转、裁剪等等。

如果你的ML项目有一个很小的数据集,或者希望减少机器学习模型中的过拟合,应用数据增强方法可能是一个好主意。

"我们没有更好的算法。我们只是有更多的数据。" - PeterNorvig

在自然语言处理(NLP)领域,语言的巨大复杂性使其难以对文本进行扩增。扩增文本数据的过程更具挑战性,并不像你想象的那样简单明了。

在这篇文章中,你将学习如何使用一个叫做TextAttack的库来改进自然语言处理的数据。

什么是TextAttack?

TextAttack是一个Python框架,由QData团队 建立,目的是在自然语言处理中进行对抗性攻击、对抗性训练和数据增强。

TextAttack有一些组件可以独立利用,用于各种基本的自然语言处理任务,包括句子编码、语法检查和单词替换。

TextAttack在执行以下三种功能方面表现出色:

  1. 对抗性攻击(Python: **textattack.Attack**, Bash。 **textattack attack**).
  2. 数据扩增 (Python: **textattack.augmentation.Augmenter**, Bash: **textattack augment**).
  3. 模型训练 (Python: **textattack.Trainer**, Bash: **textattack train**).

在这篇文章中,我们将重点讨论如何使用TextAttack库进行数据扩充。

如何安装TexAttack

要使用这个库,确保你的环境中有Python 3.6或以上版本。

运行下面的命令来安装textAttack:

pip install textattack

注意:一旦你安装了TexAttack,你可以通过Python模块或通过命令行运行它。

文本数据的数据增强技术

TextAttack库有各种增强技术,你可以在你的NLP项目中使用,以增加更多的文本数据。

下面是一些你可以应用的技术。

CharSwapAugmenter 技术

这种技术通过将字符换成其他字符来增强单词:

from textattack.augmentation import CharSwapAugmenter

text = "I have enjoyed watching that movie, it was amazing."

charswap_aug = CharSwapAugmenter()

charswap_aug.augment(text)

['我很喜欢看那个欧米茄,它很神奇。]

增强器将"电影 "这个词换成了"omvie"。

DeletionAugmenter 技术

这个人通过删除文本的某些部分来增强文本的内容,使之成为新的文本:

from textattack.augmentation import DeletionAugmenter

text = "I have enjoyed watching that movie, it was amazing."

deletion_aug = DeletionAugmenter()

deletion_aug.augment(text)

['I have watching that, it was amazing.']。

这个方法把"享受 "这个词去掉了,形成了一个新的扩写文本。

EasyDataAugmenter 技巧

这是用不同的方法组合来增强文本,如:

  • 随机调换句子中单词的位置
  • 随机删除句子中的词
  • 在随机位置随机插入一个随机词的同义词
  • 随机地用同义词替换单词
from textattack.augmentation import EasyDataAugmenter

text = "I was billed twice for the service and this is the second time it has happened"

eda_aug = EasyDataAugmenter()

eda_aug.augment(text)

['我被收取了两次服务费,这是第二次发生','我被收取了两次服务费,这是第二次发生','我被收取了两次服务费,这是第二次发生',
'我被收取了两次这个和服务是第二次发生的']

正如你从增强的文本中所看到的,它显示了基于应用的方法的不同结果。例如,在第一个增强的文本中,最后一个词已经从"发生 "修改为"发生"。

WordNetAugmenter 技术

这项技术可以通过用WordNet词库中的同义词来替换文本,从而增强文本:

from textattack.augmentation import WordNetAugmenter

text = "I was billed twice for the service and this is the second time it has happened"

wordnet_aug = WordNetAugmenter()

wordnet_aug.augment(text)

['我被收取了两次服务费,这是它第二次通过'] 。

这种方法将"发生 "一词改为"通过",以创造一个新的增强的文本。

如何创建你自己的增强器

textattack.transformationstextattack.constraints 中导入转换和约束,可以让你从头开始建立你自己的增强器。

下面是一个使用WordSwapRandomCharacterDeletion 算法 来产生一个字符串的扩增的例子:

from textattack.transformations import WordSwapRandomCharacterDeletion
from textattack.transformations import CompositeTransformation
from textattack.augmentation import Augmenter

my_transformation = CompositeTransformation([WordSwapRandomCharacterDeletion()])
augmenter = Augmenter(transformation=my_transformation, transformations_per_example=3)

text = 'Siri became confused when we reused to follow her directions.'

augmenter.augment(text)

['Siri became cnfused when we reused to follow her directions.', 'Siri became confused when e reused to follow her directions.', 'Siri became confused when we reused to follow hr directions.']

输出显示了实施WordSwapRandomCharacterDeletion 方法后的不同增强文本。例如,在第一个增强的文本中,该方法随机删除了 "confused "这个词中的 "o "

总结

在这篇文章中,你已经了解了数据增强对你的机器学习项目的意义。你还学会了如何使用TextAttack库对文本数据进行数据增强。

就我所知,这些技术是为你的NLP项目完成任务的最有效方法。希望它们能对你的工作有所帮助。

你也可以尝试使用TextAttack库中其他可用的增强技术,如:

  • EmbeddingAugmenter
  • CheckListAugmenter
  • CLAREAugmenter

如果你学到了新的东西或喜欢读这篇文章,请分享它,以便其他人能看到它。在那之前,我们在下一篇文章中见!