使用编码工具

使用,编码,工具 · 浏览次数 : 154

小编点评

第2章/加载编码工具 from transformers import BertTokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') print(type(vocab),len(vocab),'明月')) 第2章/获取字典 vocab = tokenizer.get_vocab() print(type(vocab),len(vocab),'明月')) 第2章/添加新词 tokenizer.add_tokens(new_tokens=['明月', '装饰', '窗子']) print(type(vocab),len(vocab),'明月')) 第2章/添加新符号 tokenizer.add_special_tokens({'eos_token': '[EOS]'}) print(type(vocab),len(vocab),'明月')) 第2章/编码新添加的词 out = tokenizer.encode( text='明月装饰了你的窗子[EOS]', text_pair=None, truncation=True, add_special_tokens=True, max_length=10, return_tensors=None ) print(out) print(tokenizer.decode(out)) [CLS] 明月 装饰 了 你 的 窗子 [EOS] [SEP] [PAD] 可以\"明月\"、\"装饰\"、\"窗子\"已经被识别为一个词,而不是两个词,新的特殊符号[EOS]也被正确识别。

正文

本文主要介绍了对句子编码的过程,以及如何使用PyTorch中自带的编码工具,包括基本编码encode()、增强编码encode_plus()和批量编码batch_encode_plus()。

一.对一个句子编码例子
假设想在要对句子'the quick brown fox jumps over a lazy dog'进行编码,该如何处理呢?简单理解编码就是用数字表示单词,并且用特殊符号代表一个句子的开头和结束。 vocab表示一个例子字典,在句子的开头和结束添加特殊符号,然后就可以得知每个单词对应的数字:

def encode_example_test():    # 字典    vocab = {        '<SOS>'0,        '<EOS>'1,        'the'2,        'quick'3,        'brown'4,        'fox'5,        'jumps'6,        'over'7,        'a'8,        'lazy'9,        'dog'10,    }    # 简单编码    sent = 'the quick brown fox jumps over a lazy dog'    sent = '<SOS> ' + sent + ' <EOS>'    print(sent)    # 英文分词    words = sent.split()    print(words)    # 编码为数字    encode = [vocab[i] for i in words]    print(encode)
复制

可见编码工作流程包括定义字典、句子预处理、分词和编码4个步骤:

二.使用编码工具
接下来介绍使用HuggingFace提供的编码工具。
1.基本的编码函数encode()

def encode_test():    # 第2/加载编码工具    from transformers import BertTokenizer    tokenizer = BertTokenizer.from_pretrained(        pretrained_model_name_or_path='bert-base-chinese',  # 通常编码工具和模型名字一致        cache_dir=None,  # 编码工具的缓存路径        force_download=False,  # 是否强制下载,当为True时,无论是否有本地缓存,都会强制下载    )    # 第2/准备实验数据    sents = [        '你站在桥上看风景',        '看风景的人在楼上看你',        '明月装饰了你的窗子',        '你装饰了别人的梦',    ]    # 第2/基本的编码函数    out = tokenizer.encode(        text=sents[0],        text_pair=sents[1],  # 如果只想编码一个句子,可设置text_pair=None        truncation=True,  # 当句子长度大于max_length时截断        padding='max_length',  # 一律补PAD,直到max_length长度        add_special_tokens=True,  # 需要在句子中添加特殊符号        max_length=25,  # 最大长度        return_tensors=None,  # 返回的数据类型为list格式,也可以赋值为tf、pt、np,分别表示TensorFlow、PyTorch、NumPy数据格式    )    print(out)    print(tokenizer.decode(out))
复制

输出结果如下所示:

[10187249911762344167746927599325010246927599325046387821762351767746928721020000][CLS        [SEP          [SEP] [PAD] [PAD] [PAD] [PAD]
复制

可见编码工具把两个句子前后拼接在一起,中间使用[SEP]符号分隔,在整个句子的头部添加符号[CLS],在整个句子的尾部添加符号[SEP],因为句子的长度不足max_length,所以又补充了4个[PAD]。

2.进阶的编码函数encode_plus()

def encode_plus_test():    # 第2/加载编码工具    from transformers import BertTokenizer    tokenizer = BertTokenizer.from_pretrained(        pretrained_model_name_or_path='bert-base-chinese',  # 通常编码工具和模型名字一致        cache_dir=None,  # 编码工具的缓存路径        force_download=False,  # 是否强制下载,当为True时,无论是否有本地缓存,都会强制下载    )    # 第2/准备实验数据    sents = [        '你站在桥上看风景',        '看风景的人在楼上看你',        '明月装饰了你的窗子',        '你装饰了别人的梦',    ]    # 第2/进阶的编码函数    out = tokenizer.encode_plus(        text=sents[0],        text_pair=sents[1],        truncation=True,  # 当句子长度大于max_length时截断        padding='max_length',  # 一律补零,直到max_length长度        max_length=25,        add_special_tokens=True,        return_tensors=None,  # 可取值tf、pt、np,默认为返回list        return_token_type_ids=True,  # 返回token_type_ids        return_attention_mask=True,  # 返回attention_mask        return_special_tokens_mask=True,  # 返回special_tokens_mask特殊符号标识        return_length=True,  # 返回length标识长度    )    # input_ids:编码后的词    # token_type_ids:第1个句子和特殊符号的位置是0,第2个句子的位置是1    # special_tokens_mask:特殊符号的位置是1,其他位置是0    # attention_mask:PAD的位置是0,其他位置是1    # length:返回句子长度    for k, v in out.items():        print(k, ':', v)    print(tokenizer.decode(out['input_ids']))
复制

参数return_token_type_ids、return_attention_mask、return_special_tokens_mask、return_length表明需要返回相应的编码结果,如果指定为False,则不会返回对应的内容。
3.批量的编码函数batch_encode_plus()
顾名思义就是一次可以编码多个句子。

def batch_encode_plus_test():    # 第2/加载编码工具    from transformers import BertTokenizer    tokenizer = BertTokenizer.from_pretrained(        pretrained_model_name_or_path='bert-base-chinese',  # 通常编码工具和模型名字一致        cache_dir=None,  # 编码工具的缓存路径        force_download=False,  # 是否强制下载,当为True时,无论是否有本地缓存,都会强制下载    )    # 第2/准备实验数据    sents = [        '你站在桥上看风景',        '看风景的人在楼上看你',        '明月装饰了你的窗子',        '你装饰了别人的梦',    ]    # 第2/批量编码成对的句子    out = tokenizer.batch_encode_plus(        batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],  # 编码成对的句子,如果只想编码一个句子,那么batch_text_or_text_pairs=[sents[0], sents[1]]        add_special_tokens=True,  # 需要在句子中添加特殊符号        truncation=True,  # 当句子长度大于max_length时截断        padding='max_length',  # 一律补零,直到max_length长度        max_length=25,        return_tensors=None,  # 可取值tf、pt、np,默认为返回list        return_token_type_ids=True,  # 返回token_type_ids:第1个句子和特殊符号的位置是0,第2个句子的位置是1        return_attention_mask=True,  # 返回attention_mask:PAD的位置是0,其他位置是1        return_special_tokens_mask=True,  # 返回special_tokens_mask特殊符号标识:特殊符号的位置是1,其他位置是0        # return_offsets_mapping=True, # 返回offsets_mapping标识每个词的起止位置,这个参数只能BertTokenizerFast使用        return_length=True,  # 返回编码后句子的长度    )    # input_ids:编码后的词    # token_type_ids:第1个句子和特殊符号的位置是0,第2个句子的位置是1    # special_tokens_mask:特殊符号的位置是1,其他位置是0    # attention_mask:PAD的位置是0,其他位置是1    # length:返回句子长度    for k, v in out.items():        print(k, ':', v)    tokenizer.decode(out['input_ids'][0])
复制

4.对字典的操作

def dict_test():    # 第2章/加载编码工具    from transformers import BertTokenizer    tokenizer = BertTokenizer.from_pretrained(        pretrained_model_name_or_path='bert-base-chinese',  # 通常编码工具和模型名字一致        cache_dir=None,  # 编码工具的缓存路径        force_download=False,  # 是否强制下载,当为True时,无论是否有本地缓存,都会强制下载    )    # 第2章/获取字典    vocab = tokenizer.get_vocab()    print(type(vocab), len(vocab), '明月' in vocab)  # <class 'dict'21128 False    # 第2章/添加新词    tokenizer.add_tokens(new_tokens=['明月''装饰''窗子'])    # 第2章/添加新符号    tokenizer.add_special_tokens({'eos_token''[EOS]'})    # 第2章/编码新添加的词    out = tokenizer.encode(        text='明月装饰了你的窗子[EOS]',        text_pair=None,        truncation=True,  # 当句子长度大于max_length时截断        padding='max_length',  # 一律补PAD,直到max_length长度        add_special_tokens=True,  # 需要在句子中添加特殊符号        max_length=10,        return_tensors=None,  # 可取值tf、pt、np,默认为返回list    )    print(out)    print(tokenizer.decode(out))  # [CLS] 明月 装饰 了 你 的 窗子 [EOS] [SEP] [PAD]
复制

可以"明月"、"装饰"、"窗子"已经被识别为一个词,而不是两个词,新的特殊符号[EOS]也被正确识别。

参考文献:
[1]《HuggingFace自然语言处理详解:基于BERT中文模型的任务实战》

与使用编码工具相似的内容:

使用编码工具

本文主要介绍了对句子编码的过程,以及如何使用PyTorch中自带的编码工具,包括基本编码encode()、增强编码encode_plus()和批量编码batch_encode_plus()。 一.对一个句子编码例子 假设想在要对句子'the quick brown fox jumps over a

使用训练工具

HuggingFace上提供了很多已经训练好的模型库,如果想针对特定数据集优化,那么就需要二次训练模型,并且HuggingFace也提供了训练工具。 一.准备数据集 1.加载编码工具 加载hfl/rbt3编码工具如下所示: def load_encode(): # 1.加载编码工具 # 第6章/加载

IDEA工具第一篇:细节使用-习惯设置

安装好Idea后,直接上手clone代码进入编码时代,有没有那么一刻你会觉用起来没有那么顺手流畅呢? 👉👉👉 下面是关于 【Windows】 下安装idea的一些习惯设置👈👈👈【 Mac大致一样 】

简化 Go 开发:使用强大的工具提高生产力

作为 Go 开发人员,应该都知道维持简洁高效开发工作流程的重要性。为了提高工作效率和代码质量,简化开发流程并自动执行重复性任务至关重要。在本文中,我们将探讨一些强大的工具和技术,它们将简化 Go 开发过程,助力您的编码之旅。 Cookiecutter:使用一致的模板快速启动项目 问题描述 从头开始创

开源.NetCore通用工具库Xmtool使用连载 - 散列算法篇

【Github源码】 《上一篇》详细介绍了Xmtool工具库中的加解密类库,今天我们继续为大家介绍其中的散列算法类库。 散列算法在某些特殊场景也可以当做加密方法使用;其特点是不可逆,同一内容每次散列值绝对一致,所以也可用作对数据内容是否被篡改的校验方法;或者其他需要唯一性编码的场景;本类库提供了MD

介绍五个很实用的IDEA使用技巧

日常开发中,相信广大 Java 开发者都使用过 IntelliJ IDEA 作为开发工具,IntelliJ IDEA 是一款优秀的 Java 集成开发环境,它提供了许多强大的功能和快捷键,可以帮助开发者提高编码效率和质量。除了一些常见的技巧,如自动导包、智能补全、重构工具等。IntelliJ IDE

Python 生成条形码、二维码 (Code 128、EAN-13、QR code等)

条形码和二维码是现代信息交换和数据存储的重要工具,它们将信息以图形的形式编码,便于机器识别和数据处理,被广泛应用于物流、零售、医疗、教育等各领域。本文将介绍如何使用Python快速生成各种常见的条形码如Code 128、EAN-13,以及生成二维码。 Python条码库 本文需要用到 Spire.B

『手撕Vue-CLI』添加帮助和版本号

前言 经过上一篇『手撕Vue-CLI』编码规范检查之后,手撕 Vue-CLI 已经进阶到了代码规范检查这一步,已经将基本的工程搭建好了,然后代码规范约束也已经加入了,并且将 nue-cli 指令绑定到了全局当中,可以在任何地方使用了。 正文 接下来这篇文章呢,就要来实现一下大多数的命令行工具都会有的

10.5 认识XEDParse汇编引擎

XEDParse 是一款开源的x86指令编码库,该库用于将MASM语法的汇编指令级转换为对等的机器码,并以XED格式输出,目前该库支持x86、x64平台下的汇编编码,XEDParse的特点是高效、准确、易于使用,它可以良好地处理各种类型的指令,从而更容易地确定一段程序的指令集。XEDParse库可以集成到许多不同的应用程序和工具中,因此被广泛应用于反汇编、逆向工程、漏洞分析和入侵检测等领域。XED

[转帖]BASH编写入门与实例

1 2 3 4 5 6 7 8 9 10 怎么写shell脚本: 。使用任何编辑工具编写shell脚本 例如vi -#!/bin/bash #在第一行放置头格式说明 -#!/usr/bin/gawk //awk需要添加的头格式,让系统知道用什么方式去解析此文件 -#!/usr/local/bin/p