tokenizers normalizers模块

模块概述

normalizers模块主要负责对初始输入的文本进行规范化。比如,是否将大写字母全部转换成小写字母,是否去除带音调字母的音调,是否删除一些不必要的空格等。

normalizers模块实现规范化操作是通过Normalizer子类的调用,共实现了11种方式,分别是BertNormalizer、Lowercase、NFC、NFD、NFKC、NFKD、Nmt、Precompiled、Replace、Strip、StripAccents。其中,通过Sequence类可以将这11种中的几种组合起来。可以通过normalize、normalize_str这两个方法来查看规范化后的结果。

在官方文档中,对于Normalizer的解释如下,大致意思就是:对初始输入字符串执行所有初始转换。例如,当您需要小写某些文本时,可能会将其剥离,甚至应用一种常见的 unicode 规范化过程,您将添加一个 Normalizer。

Normalization: Executes all the initial transformations over the initial input string. For example when you need to lowercase some text, maybe strip it, or even apply one of the common unicode normalization process, you will add a Normalizer.

模块使用

1、BertNormalizer
tokenizers.normalizers.BertNormalizer( clean_text = True, handle_chinese_chars = True, strip_accents = None, lowercase = True )

BertNormalizer规范器主要负责将文本提交给Bert模型前的规范化处理,包括清理文本、处理重音符号、中文字符和小写。
参数clean_text表示是否将一些控制字符(\r、\t、\n等)转换成空格。

>>> normalizer = normalizers.BertNormalizer(clean_text=True)
>>> normalizer.normalize_str("This\tis a text!!!")
this is a text!!!  # 1个空格
>>> normalizer = normalizers.BertNormalizer(clean_text=False)
>>> normalizer.normalize_str("This\tis a text!!!")
this	is a text!!!  # 4个空格,一个制表符\t一般为4个空格

参数handle_chinese_chars表示在处理中文字符时,是否在字符前后添加一个空格。

>>> normalizer = normalizers.BertNormalizer(handle_chinese_chars=True)
>>> normalizer.normalize_str("这是一个文本!!!")
 这  是  一  个  文  本 !!! 
>>> normalizer = normalizers.BertNormalizer(handle_chinese_chars=False)
>>> normalizer.normalize_str("这是一个文本!!!")
这是一个文本!!!

参数strip_accents表示是否去除重音。

>>> normalizer = normalizers.BertNormalizer(strip_accents=True)
>>> normalizer.normalize_str("this is ā text!!!")
this is a text!!!
>>> normalizer = normalizers.BertNormalizer(strip_accents=False)
>>> normalizer.normalize_str("this is ā text!!!")
this is ā text!!!

参数lowercase表示是否将大写转换成小写。

>>> normalizer = normalizers.BertNormalizer(lowercase=True)
>>> normalizer.normalize_str("This is a text!!!")
this is a text!!!
>>> normalizer = normalizers.BertNormalizer(lowercase=False)
>>> normalizer.normalize_str("This is a text!!!")
This is a text!!!
2、Lowercase
tokenizers.normalizers.Lowercase()

Lowercase规范器负责将文本中所有的大写字母转换成小写字母。

>>> normalizer = normalizers.Lowercase()
>>> normalizer.normalize_str("This is a text!!!")
this is a text!!!
3、NFC、NFD、NFKC、NFKD
tokenizers.normalizers.NFC()
tokenizers.normalizers.NFD()
tokenizers.normalizers.NFKC()
tokenizers.normalizers.NFKD()

Unicode 规范化是指分解和合成字符。Unicode 字符可能看起来相同,但有多种表示形式。例如,“â”也可以表示为“â”(U+00E2)的单个代码点,或者表示为“a”(U+0061)和“̂”的两个分解代码点(U+0302). 也可以用(基字符+组合字符)表示。前者称为合成字符,后者称为组合字符序列(CCS)。

Unicode 规范化包括以下类型:

规范化形式解释例子
标准化表格 D (NFD)通过典型等价分解“â” (U+00E2) -> “a” (U+0061) + “̂” (U+0302)
标准化形式 KD (NFKD)用兼容等价分解“fi” (U+FB01) -> “f” (U+0066) + “i” (U+0069)
标准化表格 C (NFC)用典型等价分解再合成“â” (U+00E2) -> “a” (U+0061) + “̂” (U+0302) -> “â” (U+00E2)
标准化表格 KC (NFKC)用兼容等价分解并用规范等价再次组合“fi” (U+FB01) -> “f” (U+0066) + “i” (U+0069) -> “f” (U+0066) + “i” (U+0069)

NFC、NFD、NFKC、NFKD的主要区别如下:

abcABC ==(NFC)==> abcABC
abcABC ==(NFD)==> abcABC
abcABC ==(NFKC)==> abcABC
abcABC ==(NFKD)==> abcABC
# 1 original form changed or not
- A(not changed): NFC & NFD
- B(changed): NFKC & NFKD
# 2 the length of original length changed or not
- A(not changed): NFC & NFKC
- B(changed): NFD & NFKD
4、Nmt
tokenizers.normalizers.Nmt()
5、Precompiled
tokenizers.normalizers.Precompiled(precompiled_charsmap)

Precompiled规范器不要手动的使用,仅用于SentencePiece的兼容性。

6、Replace
okenizers.normalizers.Replace(pattern, content )

Replace规范器将符合patten(正则表达式或字符)替换成指定的content。

>>> normalizer = normalizers.Replace(pattern=" ", content="_")
>>> normalizer.normalize_str("this is a text!!!")
this_is_a_text!!!  # 空格替换成下划线
7、Strip
tokenizers.normalizers.Strip(left = True, right = True)

Strip规范器去除文本开始和结尾的空格和特殊字符(不可见字符)。

>>> normalizer = normalizers.Strip()
>>> normalizer.normalize_str("\t this is a text!!! ")  # 开始有一个制表符\t和一个空格,结尾有一个空格
this is a text!!!  # 规范化后开始处的\t和空格以及结尾处的空格都被去掉了
8、StripAccents
tokenizers.normalizers.StripAccents()

StripAccents规范器负责去掉所有的重音,在使用StripAccents规范器之前,需要使用NFD规范器以保持一致性。

>>> normalizer = normalizers.Sequence([normalizers.NFD(), normalizers.StripAccents()])
>>> normalizer.normalize_str("this is ā text!!!")
this is a text!!!
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不负韶华ღ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值