当前位置: 首页 > 工具软件 > Dash.py > 使用案例 >

解析pytorch_transformer之tokenization_bert.py

高承望
2023-12-01

pytorch_transformers包含BERT, GPT, GPT-2, Transfo-XL, XLNet, XLM 等多个模型,并提供了27 个预训练模型。

对于每个模型,pytorch_transformers库里都对应有三个类:

  • model classes是模型的网络结构
  • configuration classes是模型的相关参数
  • tokenizer classes是分词工具,一般建议直接使用from_pretrained()方法加载已经预训练好的模型或者参数。

tokenization_bert.py 主要包含2部分

一. 预训练文件和预训练配置

  • PRETRAINED_VOCAB_FILES_MAP:预训练vocab_file

  • PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES: 预训练的positional_embedding_size

  • PRETRAINED_INIT_CONFIGURATION: 预训练的configuration(这里只有do_lower_case:T/F)

  • load_vocab(vocab_file): 加载vocab_file(是一个txt文件一个单词一行),返回一个dictionary: key是单词,value是index. word2index dictory

  • whitespace_tokenize(text): 对文本进行空格切分,返回一个切分后的list

二. 3个tokenizer分词class
2.1 class BertTokenizer(PreTrainedTokenizer)

端到端的bert分词法:punctuation splitting + wordpiece. 继承PreTrainedTokenizer

  • 参数:

    vocab_file: vocabulary file.
    do_lower_case: 是否要小写化处理,只有do_wordpiece_only=False时才有效。
    do_basic_tokenize:在wordpiece之前是否要做basic_tokenize
    max_len: 最大长度
    never_split: tokens 列表,在分词时永远不会被切分。这个只有do_wordpiece_only=False时才有效。

  • 初始化函数

    a) basic_tokenize(当do_basic_tokenize=True,可以加载never_split list)
    b) wordpiece_tokenize

  • 其他函数:

    a). _tokenize(text): 对text 进行(basic_tokenize和)wordpiece分词,返回分词之后的split_tokens list
    b). _convert_token_to_id(token): 把vocab中的一个token(str/unicode) 转成index, 如果token不在vocab中,则返回unk的index
    c). _convert_id_to_token(index): 通过vocab把index换成token
    d). convert_tokens_to_string(tokens): 把一个序列token转成一个single string.
    e). add_special_tokens_single_sentence(token_ids): 给序列添加特殊的token 用于序列分类任务。Bert 序列格式:[CLS] X [SEP] 即返回 [cls_token_id] + token_ids + [sep_token_id].
    f). add_special_tokens_sentences_pair(token_ids_0, token_ids_1): 给序列对儿添加special tokens 用于序列分类。 Bert序列对格式:[CLS] A [SEP] B [SEP] 即返回cls + token_ids_0 + sep + token_ids_1 + sep.
    g). save_vocabulary(vocab_path):保存分词之后的词汇表

2.2 class BasicTokenizer(object)

基本的分词处理:punctuation splitting, lower casing, etc等

  • 初始化函数

    创建一个basicTokenizer,主要是参数
    never_split: 不分词的列表,
    do_lower_case: 小写预处理
    tokenize_chinese_chars:是否要处理中文

  • 其他函数:

    a) tokenize(text, never_split=None): 基本的分词,仅仅基于空格来分词
    b) _run_strip_accents(text):对于text字符串标准化的方式,分别有NFD/NFC
    c) _run_split_on_punc(text, never_split=None): 以标点符号来切分句子,返回的是一个list[‘A’,’,’,‘B’,’.’…] A 和B 分别是不含标点符号的string
    d) _tokenize_chinese_chars(text):在中文字之间添加空格
    e) _is_chinese_char(cp): 检查这个单词是不是中文字符,如果是,则返回True, 不是则返回False
    f) _clean_text(text): 去除invalid 单词,并且统一化空格

2.3 class WordpieceTokenizer(object)

用 WordPiece 进行分词

  • 初始化函数

    创建一个wordpieceTokenizer,主要参数有:vocab, unk_token, max_input_chars_per_word=100

  • 其他函数

    tokenize(text):使用贪心最长匹配算法进行分词,
    For example:
    input = “unaffable”
    output = [“un”, “##aff”, “##able”]

UCD

UCD是Unicode字符数据库(Unicode Character DataBase)的缩写。UCD由一些描述Unicode字符属性和内部关系的纯文本或html文件组成。
UCD中的文本文件大都是适合于程序分析的Unicode相关数据。其中的html文件解释了数据库的组织,数据的格式和含义。
UCD中最庞大的文件无疑就是描述汉字属性的文件Unihan.txt。
在UCD 5.0,0中,Unihan.txt文件大小有28,221K字节。Unihan.txt中包含了很多有参考价值的索引,例如汉字部首、笔划、
拼音、使用频度、四角号码排序等。这些索引都是基于一些比较权威的辞典,但大多数索引只能检索部分汉字。

unicodedata.category(chr) 把一个字符返回它在UNICODE里分类的类型。具体类型如下:
Code Description
[Cc] Other, Control
[Cf] Other, Format
[Cn] Other, Not Assigned (no characters in the file have this property)
[Co] Other, Private Use
[Cs] Other, Surrogate
[LC] Letter, Cased
[Ll] Letter, Lowercase
[Lm] Letter, Modifier
[Lo] Letter, Other
[Lt] Letter, Titlecase
[Lu] Letter, Uppercase
[Mc] Mark, Spacing Combining
[Me] Mark, Enclosing
[Mn] Mark, Nonspacing
[Nd] Number, Decimal Digit
[Nl] Number, Letter
[No] Number, Other
[Pc] Punctuation, Connector
[Pd] Punctuation, Dash
[Pe] Punctuation, Close
[Pf] Punctuation, Final quote (may behave like Ps or Pe depending on usage)
[Pi] Punctuation, Initial quote (may behave like Ps or Pe depending on usage)
[Po] Punctuation, Other
[Ps] Punctuation, Open
[Sc] Symbol, Currency
[Sk] Symbol, Modifier
[Sm] Symbol, Math
[So] Symbol, Other
[Zl] Separator, Line
[Zp] Separator, Paragraph
[Zs] Separator, Space

‘’’


>>> import unicodedata
>>> print(unicodedata.category('四'))
Lo
>>> print(unicodedata.category('8'))
Nd
>>> print(unicodedata.category('a'))
Ll
>>>

 类似资料: