• 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 )
    
    • 1

    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个空格
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

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

    >>> normalizer = normalizers.BertNormalizer(handle_chinese_chars=True)
    >>> normalizer.normalize_str("这是一个文本!!!")
     这  是  一  个  文  本 !!! 
    >>> normalizer = normalizers.BertNormalizer(handle_chinese_chars=False)
    >>> normalizer.normalize_str("这是一个文本!!!")
    这是一个文本!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参数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!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    参数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!!!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2、Lowercase

    tokenizers.normalizers.Lowercase()
    
    • 1

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

    >>> normalizer = normalizers.Lowercase()
    >>> normalizer.normalize_str("This is a text!!!")
    this is a text!!!
    
    • 1
    • 2
    • 3

    3、NFC、NFD、NFKC、NFKD

    tokenizers.normalizers.NFC()
    tokenizers.normalizers.NFD()
    tokenizers.normalizers.NFKC()
    tokenizers.normalizers.NFKD()
    
    • 1
    • 2
    • 3
    • 4

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    4、Nmt

    tokenizers.normalizers.Nmt()
    
    • 1

    5、Precompiled

    tokenizers.normalizers.Precompiled(precompiled_charsmap)
    
    • 1

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

    6、Replace

    okenizers.normalizers.Replace(pattern, content )
    
    • 1

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

    >>> normalizer = normalizers.Replace(pattern=" ", content="_")
    >>> normalizer.normalize_str("this is a text!!!")
    this_is_a_text!!!  # 空格替换成下划线
    
    • 1
    • 2
    • 3

    7、Strip

    tokenizers.normalizers.Strip(left = True, right = True)
    
    • 1

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

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

    8、StripAccents

    tokenizers.normalizers.StripAccents()
    
    • 1

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

    >>> normalizer = normalizers.Sequence([normalizers.NFD(), normalizers.StripAccents()])
    >>> normalizer.normalize_str("this is ā text!!!")
    this is a text!!!
    
    • 1
    • 2
    • 3
  • 相关阅读:
    网络安全(黑客技术)—小白自学
    休闲零食混战:三只松鼠“守淘”,良品铺子“攻抖”
    相对免赔额和绝对免赔额是什么意思,有什么区别?
    数据结构与算法_排序算法_四个基础排序算法性能对比
    openEuler 22.03 安装及配置Gitlab容器
    MongoDB实战:应用场景以及Spring和mongodb的整合
    ES(Elasticsearch)安装教程
    基于javaweb的毕业设计毕业论文管理系统(java+ssm+jsp+tomcat+mysql)
    【SA8295P 源码分析 (三)】130 - GMSL2 协议分析 之 I2C/UART 双向控制通道原理分析
    ElementUI浅尝辄止28:Dropdown 下拉菜单
  • 原文地址:https://blog.csdn.net/weixin_49346755/article/details/126496833