☰
AugLy 文本数据增强全指南:从函数式 API 到 Transform 类与组合算子
2026/10/15 1:56:34 网站建设 项目流程
  • 机器学习
  • AI 应用

【免费下载链接】AugLy

A data augmentations library for audio, image, text, and video.

项目地址:https://gitcode.com/gh_mirrors/au/AugLy
点击查看免费下载

本文以开源数据增强库 AugLy 的文本增强模块(augly.text)为主体,系统讲解其安装方式、以nlpaug为后端的增强机制、函数式与类式两种调用范式、完整的增强算子清单(插入、替换、编码、拼写错误模拟等)、元数据与强度(intensity)机制,以及 Compose/OneOf 组合编排与单元测试运行方法。读完本文,你将能够直接上手调用 AugLy 文本增强来扩充 NLP 训练数据,并理解每个算子的参数语义与底层实现。

一、模块定位与安装

AugLy 是一个同时覆盖 audio、image、text、video 四种模态的数据增强库。其中文本增强模块位于仓库的 augly/text 目录,其核心文档为 augly/text/README.md。与图像、音频、视频增强不同,文本增强不需要安装 FFmpeg 等外部系统依赖,因此使用门槛最低,仅需一个pip命令:

pip install augly[text]

安装后即可通过import augly.text as txtaugs使用全部文本增强能力。文本增强的全部公开入口统一在 augly/text/init.py 中导出,共包含 17 个函数式增强(insert_punctuation_chars、change_case、simulate_typos等)、17 个对应的 Transform 类(InsertPunctuationChars、ChangeCase、SimulateTypos等),以及Compose、OneOf两个组合算子和一系列*_intensity强度计算函数。

需要特别说明的是,AugLy 的文本增强以nlpaug作为底层骨架(backbone):仓库中 augly/text/requirements.txt 明确声明依赖nlpaug==1.1.3。从源码结构看,WordsAugmenter、TypoAugmenter、FunFontsAugmenter等增强器都直接继承自nlpaug的Augmenter/WordAugmenter基类(见 augly/text/augmenters/words_augmenter.py),而分词、去分词、正则规则则由 AugLy 自研的 augly/text/augmenters/utils.py 提供。

所有文本增强函数遵循统一的接口约定:输入可以是单个字符串或字符串列表,输出总是列表形式(函数内部会将字符串包装为列表)。这一点可以在任意函数的实现中验证,例如insert_punctuation_chars最终调用InsertionAugmenter.augment(texts),其中augment会先执行texts = texts if isinstance(texts, list) else [texts](见 augly/text/augmenters/insertion.py)。

二、两种调用范式:函数式与类式

2.1 函数式(Function-based)API

函数式 API 是 AugLy 文本增强最直接的用法。原文档给出的示例如下:

import augly.text as txtaugs texts = ["hello world", "bye planet"] augmented_synonyms = txtaugs.insert_punctuation_chars( texts, granularity="all", cadence=5.0, vary_chars=True, )

insert_punctuation_chars的作用是在文本中按一定节奏插入标点字符。其三个核心参数语义如下(见 augly/text/functional.py 与 augly/text/augmenters/insertion.py):

  • granularity:"all"(整段文本按固定节奏插入)或"word"(每个单词独立选择分隔符、节奏在每个单词内重新计算);
  • cadence:每隔多少个字符插入一个标点,必须不小于 1.0;非整数值(如2.7)表示"平均"节奏——实际每 2~3 个字符插入一次;
  • vary_chars:为False时整段文本使用同一个随机标点,为True时每次插入都独立随机选择。

标点字符池定义在 augly/text/augmenters/insertion.py 中:. ? ! , ; : - ' ...。同一套InsertionAugmenter机制还被insert_whitespace_chars(字符池为空格、制表符、换行、回车、垂直制表符、换页)与insert_zero_width_chars(字符池为零宽空格\u200b、零宽连接符\u200d等 8 个 Unicode 控制字符)复用——这三种"插入字符"型增强的唯一区别就是char_type参数。

2.2 类式(Class-based)API

函数式 API 之外,所有增强都可以作为Transform 类使用,并指定一个应用概率p:

import augly.text as txtaugs texts = ["hello world", "bye planet"] transform = InsertPunctuationChars(granularity="all", p=0.5) aug_texts = transform(texts)

所有 Transform 类继承自 augly/text/transforms.py 中定义的BaseTransform:

  • 构造时校验0 <= p <= 1;
  • __call__(texts, force=False, metadata=None, **kwargs)中,若force=False且random.random() > self.p,则直接返回原文本(概率未命中);否则调用apply_transform执行实际增强;
  • __call__额外支持在调用时传入 kwargs 覆盖构造时设置的参数(get_aug_kwargs机制),实现了"同一 transform 以不同参数复用"的场景。

从源码结构看,类式 API 的设计目标有三:一是与torchvision风格的 Composition 算子配合使用;二是支持"携带固定属性、多次复用"的场景;三是支持概率化抽样。BaseTransform的 docstring 中即给出了与 augly/text/transforms.py 中示例一致的用法。

三、增强算子全景:17 个变换的功能与参数

AugLy 文本增强的完整算子清单(函数名与 Transform 类名一一对应)定义于 augly/text/init.py,各算子的完整参数与默认值可在 augly/text/functional.py 中逐一定位。下表按功能族归类:

功能族函数(Transform 类)核心参数与默认值
字符插入insert_punctuation_charsgranularity="all",cadence=1.0,vary_chars=False
字符插入insert_whitespace_chars同上
字符插入insert_zero_width_chars同上
大小写change_casegranularity="word",cadence=1.0,case="random",seed=10
词形变化contractionsaug_p=0.3,mapping=CONTRACTIONS_MAPPING,max_contraction_length=2,seed=10
编码encode_textaug_min/aug_max/aug_p必填,granularity必填,encoder必填("base64"或"leetspeak")
插入文本insert_textinsert_text必填,num_insertions=1,insertion_location="random",seed=10
词合并merge_wordsaug_word_p=0.3,min_char=2,aug_word_min=1,aug_word_max=1000,n=1
词拆分split_wordsaug_word_p=0.3,min_char=4,aug_word_min=1,aug_word_max=1000,n=1
字符替换replace_similar_charsaug_char_p=0.3,aug_word_p=0.3,min_char=2, 各aug_*_min/max默认 1/1000
字符替换replace_similar_unicode_chars同上,mapping_path=UNICODE_MAPPING_PATH
字体替换replace_fun_fontsaug_p=0.3,aug_min=1,aug_max=10000,granularity="all",vary_fonts=False,fonts_path=FUN_FONTS_PATH
双向反转replace_bidirectionalgranularity="all",split_word=False
上下翻转replace_upside_downaug_p=0.3,aug_min=1,aug_max=1000,granularity="all",n=1
词替换replace_wordsaug_word_p=0.3,aug_word_min=1,aug_word_max=1000,mapping=None,priority_words=None,ignore_words=None
性别词互换swap_gendered_wordsaug_word_p=0.3,aug_word_min=1,aug_word_max=1000,mapping=GENDERED_WORDS_MAPPING
错别字模拟simulate_typostypo_type="all",aug_char_p=0.3,aug_word_p=0.3,min_char=2,aug_char_max=1,max_typo_length=1
自定义函数apply_lambdaaug_function(默认为恒等函数)
基线get_baseline无参数,仅做 tokenize/detokenize

3.1 插入型:标点、空白与零宽字符

这三类增强共享InsertionAugmenter(augly/text/augmenters/insertion.py)。其insert_chars实现先把文本按 cadence 切分成若干段,再用分隔符(单个固定字符或随机序列)重新拼接。文档中示例cadence=5.0即每 5 个字符插入一个标点。

值得注意的设计意图写在InsertionAugmenter的 docstring 中:cadence与vary_chars的组合用于调整插入字符的频率与模式,以规避自动化反混淆(deobfuscation)技术的检测。测试用例对此有直观验证(见 augly/tests/text_tests/functional_unit_test.py):

  • granularity="all", cadence=1.0时,"The quick brown 'fox'..."会变成"T.h.e. .q.u.i.c.k. ..."(每个字符间都插入标点);
  • granularity="all", cadence=2.7时,分隔符每 2~3 个字符出现一次(平均 2.7);
  • granularity="word", cadence=1.0时,每个单词独立使用不同分隔符,且空白处不插入。

零宽字符增强的测试还说明:insert_zero_width_chars插入的字符在渲染时不可见(如T\u200bh\u200be视觉上仍是The),但文本的底层字符序列已被破坏——这是构造"视觉相同、内容不同"对抗样本的经典手段。

3.2 大小写与词形变化

change_case支持granularity="all" | "word" | "char"三种粒度,case可选"lower" | "upper" | "title" | "random",seed默认为 10 以保证可复现(augly/text/functional.py)。测试中change_case(text, cadence=3.0, case="upper")的输出"THE quick brown 'FOX' couldn't jump OVER the green, GRASSY hill."展示了"每隔 3 个词转大写"的 cadence 语义。

contractions依据映射表把词组替换为缩写,如"I would call him but I do not know where he has gone"→"I would call him but I don't know where he's gone"(见测试 augly/tests/text_tests/functional_unit_test.py)。默认映射表为 augly/assets/text/contractions.json,包含"he is" → "he's"、"could have" → "could've"等常见缩写;max_contraction_length=2表示最多匹配 2 个词的词组,若设为 3 则同时检查 2 词与 3 词子串。mapping参数既可直接传字典,也可传 iopath URI 指向映射文件。

3.3 编码型:Base64 与 Leetspeak

encode_text是唯一需要多个必填参数的增强,其签名与断言(augly/text/functional.py)要求:

  • aug_min/aug_max:最小/最大增强单元(词或字符)数;
  • aug_p:每个单元被增强的概率;
  • granularity:"all" | "word" | "char";
  • encoder:"base64" | "leetspeak",传入其他值会触发AssertionError。

实现上采用策略模式:Base64(augly/text/augmenters/base64.py)与LeetSpeak(augly/text/augmenters/leetspeak.py)都继承自EncodeTextAugmentation策略基类,由EncodeText上下文类(augly/text/augmenters/encode_text_context.py)统一驱动。Base64 对 UTF-8 编码后的字节做 base64 编码;Leetspeak 则按映射表(a→4/@、e→3、s→5/$等,见 augly/text/augmenters/leetspeak.py)逐字符替换。

测试给出了精确的预期输出(augly/tests/text_tests/functional_unit_test.py):

txtaugs.encode_text("Hello, world!", 1, 1, 1.0, "all", "base64") # -> ["SGVsbG8sIHdvcmxkIQ=="] txtaugs.encode_text("Hello, world!", 1, 1, 1.0, "word", "base64") # -> ["SGVsbG8=, world!"] txtaugs.encode_text("Hello, world!", 1, 1, 1.0, "all", "leetspeak") # -> ["h3110, w0r1d!"]

3.4 词级操作:插入、合并、拆分与替换

  • insert_text:从insert_text列表中采样,向每条文本插入num_insertions次;insertion_location支持"prepend" | "append" | "random"(random 表示在文本的任意两个词之间插入)。测试覆盖了三种位置(见 augly/tests/text_tests/functional_unit_test.py)。
  • merge_words:把选中的词与后一个词拼接(如"Thequick brown ..."),实现位于 augly/text/augmenters/words_augmenter.py 的delete方法(注意句子最后一个词不会参与合并)。
  • split_words:在随机位置把词一分为二,实现于同文件的split方法(augly/text/augmenters/words_augmenter.py)。
  • replace_words:基于映射(字典或 iopath URI)替换词,支持priority_words(优先增强的目标词)与ignore_words(豁免词)。
  • replace_text:把整条输入文本替换为指定文本,replace_text可以是字符串(所有输入替换为同一文本)或{输入: 输出}映射字典。

priority_words与ignore_words的选取逻辑实现在 augly/text/augmenters/utils.py 的get_aug_idxes中:优先词在普通词之前被选中,且两者都会过滤掉ignore_words中列出的词以及长度小于min_char的词。

3.5 字符替换型:相似字符与相似 Unicode

replace_similar_chars与replace_similar_unicode_chars都基于LetterReplacementAugmenter(augly/text/augmenters/letter_replacement.py),差异仅在于默认映射文件:

  • replace_similar_chars的mapping_path默认为None,内部回退使用 augly/assets/text/letter_unicode_mapping.json 中的 Unicode 相似字符表(如字母a有α、∀、@、Å等数十个候选);
  • replace_similar_unicode_chars显式使用UNICODE_MAPPING_PATH,即同一份 augly/assets/text/letter_unicode_mapping.json。

这两类增强通过"同形异义字符(homoglyph)"替换来模拟视觉混淆,是防御模型对 Unicode 攻击鲁棒性不足问题的常用数据增强。

3.6 风格型:趣味字体、双向反转与上下翻转

  • replace_fun_fonts:从 augly/assets/text/fun_fonts.json 加载字体字典,按granularity("all" | "word" | "char")将词/字符映射为花体、加粗、双线等 Unicode 风格字体;vary_fonts=True时每次替换随机换一种字体。实现见 augly/text/augmenters/fun_fonts.py。
  • replace_bidirectional:使用 Unicode 双向覆盖符(\u202eRTL Override、\u202cPop Directional、\u202dLTR Override)把文本反向书写但保持视觉渲染顺序不变。测试中的预期输出为"\u202e.llih yssarg ,neerg eht revo pmuj t'ndluoc 'xof' nworb kciuq ehT\u202c",渲染出来仍是从左到右阅读的原文(见 augly/tests/text_tests/functional_unit_test.py)。实现见 augly/text/augmenters/bidirectional.py。
  • replace_upside_down:利用 augly/text/augmenters/utils.py 中定义的UPSIDE_DOWN_CHAR_MAPPING(a→ɐ、b→q、z→z等 180° 旋转字符)翻转文本,granularity支持"all" | "word" | "char"。实现见 augly/text/augmenters/upside_down.py。

3.7 拼写错误模拟:simulate_typos

simulate_typos是参数最丰富、底层最复杂的增强之一,其typo_type支持四种模式(见 augly/text/augmenters/typo.py):

typo_type行为
"charmix"字符级操作的随机组合:删除(delete)、插入(insert)、替换(substitute)、交换(swap),由nlpaug的RandomCharAug实现
"keyboard"把字符替换为 QWERTY 键盘上的邻近键(nlpaug的KeyboardAug,开启include_upper_case=True)
"misspelling"依据错拼词典(默认 augly/assets/text/misspelling.json)替换整词,由自研的MisspellingReplacement实现
"all"上述模式的随机组合

其substitute实现(augly/text/augmenters/typo.py)还会用align_capitalization保持原始词的大小写风格(全大写/全小写/首字母大写),并且支持max_typo_length(默认 1)控制错拼词典按多长的词组匹配(设为 3 时同时匹配 2 词与 3 词子串)。当typo_type为"misspelling"或"all"时,misspelling_dict_path必须提供,否则断言失败。

3.8 其他:apply_lambda 与 get_baseline

  • apply_lambda(texts, aug_function, **kwargs):把用户自定义函数应用到文本列表上,要求aug_function可调用且接收列表、返回列表(见 augly/text/functional.py)。
  • get_baseline(texts):对文本做一次 tokenize + detokenize 作为"基线"输出,用于对照实验——因为 AugLy 的分词规则会规范化空格与标点,基线文本可能与输入略有差异(见 augly/text/functional.py)。

四、元数据与强度(intensity)机制

AugLy 文本增强的每个函数都接受metadata参数。当传入一个列表时,执行后会在该列表末尾追加一条执行记录(见 augly/text/utils.py),包含:

  • name:函数名;
  • input_type:"list"或"string";
  • src_length/dst_length:输入/输出的文本条数;
  • 所有函数入参(**kwargs);
  • intensity:本次增强的强度评分(0~100)。

intensity由 augly/text/intensity.py 中对应的*_intensity函数计算,其规律可以总结为(均为源码可见的实现事实):

  • 整段变换型(如granularity="all"的 base64、leetspeak、fun_fonts、upside_down、bidirectional)直接返回100.0(augly/text/intensity.py);
  • 概率型(contractions_intensity = aug_p * 100,replace_words_intensity = aug_p * 100)与概率成正比(augly/text/intensity.py);
  • 节奏型(change_case、三类字符插入)在granularity="word"时强度为(1 / cadence) * 100,cadence 越大、插入越稀疏、强度越低(augly/text/intensity.py);
  • get_baseline_intensity恒为0.0,replace_text_intensity在整段替换或命中映射时为100.0,否则为0.0;
  • 聚合公式replace_intensity_helper(aug_p, aug_max):aug_max == 0时为0.0,否则为aug_p * 100(augly/text/intensity.py)。

强度机制为训练时按扰动程度分层采样提供了量化依据,例如可以按intensity阈值过滤掉过强的增强样本。

五、组合编排:Compose 与 OneOf

Compose与OneOf定义在 augly/text/composition.py,与 torchvision 的 Composition 语义一致:

from augly.text import Compose, InsertPunctuationChars, ReplaceFunFonts, OneOf, ReplaceSimilarChars, SimulateTypos composed = Compose([ InsertPunctuationChars(), ReplaceFunFonts(), OneOf([ ReplaceSimilarChars(), SimulateTypos(), ]), ]) aug_texts = composed(texts)
  • Compose:按列表顺序依次应用每个 transform,支持传入seed固定随机种子以保证可复现(augly/text/composition.py)。
  • OneOf:以整体概率p决定是否增强;若命中,则按各子 transform 的p值归一化后的权重(transform_probs)随机选取一个应用,并以force=True强制执行(augly/text/composition.py)。

Compose/OneOf的构造函数会校验列表内元素必须是BaseTransform实例,因此它们与函数式 API 不能混用——组合编排只接受类式 Transform。

六、单元测试与验证

AugLy 在克隆仓库后可用unittest直接运行文本模块的测试:

python -m unittest discover -s augly/tests/text_tests/ -p "*"

测试目录 augly/tests/text_tests 包含:

  • functional_unit_test.py:覆盖全部函数式增强的输入输出断言(共 589 行,含 base64/leetspeak 精确编码结果、标点/空白/零宽字符在三种 cadence 下的精确输出、双向反转的 Unicode 序列、contractions 的缩写结果等);
  • transforms_unit_test.py:覆盖类式 Transform 的概率行为与参数传递;
  • utils_test.py:覆盖分词/去分词、元数据与强度计算等工具函数。

测试中大量使用精确字符串断言(例如insert_punctuation_chars在cadence=2.7下输出"The. qu.ick. b.row.n ..."),这从侧面保证了增强行为的确定性:配合各函数默认的seed=10,同一输入在相同参数下可稳定复现,便于回归测试与数据管线重放。

七、典型应用场景小结

综合原文档与源码,AugLy 文本增强可以归纳为以下几类实战用途:

  1. 鲁棒性评测与对抗训练:零宽字符、同形 Unicode、双向反转、上下翻转、趣味字体都属于"视觉近似但字符序列不同"的扰动,可用于评测/训练模型对文本混淆与 Unicode 攻击的鲁棒性;
  2. OCR / 视觉文本场景:replace_fun_fonts、simulate_typos与图像侧的文本渲染增强可组合,模拟真实世界中五花八门的字体与排版噪声;
  3. NLP 数据扩充:change_case、contractions、merge_words/split_words、insert_text、replace_words、swap_gendered_words可低成本扩充句子级训练语料;
  4. 公平性(fairness)研究:swap_gendered_words的映射表 augly/assets/text/gendered_words_mapping.json 来自 Adina Williams 提供的词表(源码注释引用了 Dinan et al., 2020 等研究,见 augly/utils/constants.py),可用于构建性别词互换的对照数据集。

需要提醒的是,本文所述参数、默认值与依赖(nlpaug==1.1.3)均以当前仓库 augly/text 的实际实现为准;若需将增强管线集成到深度学习训练脚本,建议同时利用metadata中的intensity字段对增强强度做量化控制。

  • 机器学习
  • AI 应用

【免费下载链接】AugLy

A data augmentations library for audio, image, text, and video.

项目地址:https://gitcode.com/gh_mirrors/au/AugLy
点击查看免费下载

相关推荐

上一篇:Windows系统优化利器:Chris Titus Tech's Windows Utility全面指南
下一篇:PaECTER在现有技术检索中的应用:如何构建高效的专利搜索系统

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询