在机器学习中,你需要有大量的数据,以实现强大的模型性能。
使用一种被称为数据增强的方法,你可以为你的机器学习项目创造更多的数据。数据增强是一个技术集合,它管理着在现有数据基础上自动生成高质量数据的过程。
在计算机视觉应用中,扩增方法是很常见的。例如,如果你正在进行一个计算机视觉项目(如图像分类),你可以对每张图像应用几十种技术:移动、修改颜色强度、缩放、旋转、裁剪等等。
如果你的ML项目有一个很小的数据集,或者希望减少机器学习模型中的过拟合,应用数据增强方法可能是一个好主意。
"我们没有更好的算法。我们只是有更多的数据。" - PeterNorvig
在自然语言处理(NLP)领域,语言的巨大复杂性使其难以对文本进行扩增。扩增文本数据的过程更具挑战性,并不像你想象的那样简单明了。
在这篇文章中,你将学习如何使用一个叫做TextAttack的库来改进自然语言处理的数据。
什么是TextAttack?
TextAttack是一个Python框架,由QData团队 建立,目的是在自然语言处理中进行对抗性攻击、对抗性训练和数据增强。
TextAttack有一些组件可以独立利用,用于各种基本的自然语言处理任务,包括句子编码、语法检查和单词替换。
TextAttack在执行以下三种功能方面表现出色:
- 对抗性攻击(Python:
**textattack.Attack**, Bash。**textattack attack**). - 数据扩增 (Python:
**textattack.augmentation.Augmenter**, Bash:**textattack augment**). - 模型训练 (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.transformations和textattack.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
如果你学到了新的东西或喜欢读这篇文章,请分享它,以便其他人能看到它。在那之前,我们在下一篇文章中见!