使用编码工具

news2024/12/23 17:57:39

本文主要介绍了对句子编码的过程,以及如何使用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))

输出结果如下所示:

[101, 872, 4991, 1762, 3441, 677, 4692, 7599, 3250, 102, 4692, 7599, 3250, 4638, 782, 1762, 3517, 677, 4692, 872, 102, 0, 0, 0, 0]
[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中文模型的任务实战》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683171.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【K8S系列】深入解析K8S存储

序言 做一件事并不难&#xff0c;难的是在于坚持。坚持一下也不难&#xff0c;难的是坚持到底。 文章标记颜色说明&#xff1a; 黄色&#xff1a;重要标题红色&#xff1a;用来标记结论绿色&#xff1a;用来标记一级论点蓝色&#xff1a;用来标记二级论点 Kubernetes (k8s) 是一…

ppp协议,一文带你了解

一、PPP协议简介 PPP&#xff08;Point-to-Point Protocol&#xff09;是一种数据链路层协议&#xff0c;用于在两个节点之间建立点对点的数据通信连接。PPP协议是TCP/IP协议族中的一员&#xff0c;它可以在串行通信线路上传输IP数据包&#xff0c;支持多种网络层协议&#xff…

C++ Primer 第11章关联容器

11.1 使用关联容器 map类型通常被常被称为关联数组。关联数组与正常数组类似&#xff0c;不同之处在于其下标不必是整数set就是关键字的简单集合&#xff0c;当想知道一个值是否存在时&#xff0c;set是最有用的 使用map #include<iostream> #include<string> #…

智慧水务物联网数据采集平台和营收管理平台建设

平台概述 智慧水务物联网数据采集平台是以物联感知技术、大数据、智能控制、云计算、人工智能、数字孪生、AI算法、虚拟现实技术为核心&#xff0c;以监测仪表、通讯网络、数据库系统、数据中台、模型软件、前台展示、智慧运维等产品体系为支撑&#xff0c;以城市水资源、水生…

MySQL - 第10节 - MySQL索引特性

1.索引的概念 索引的概念&#xff1a; • 数据库表中存储的数据都是以记录为单位的&#xff0c;如果在查询数据时直接一条条遍历表中的数据记录&#xff0c;那么查询的时间复杂度将会是O(N)。 • 索引的价值在于提高海量数据的检索速度&#xff0c;只要执行了正确的创建索引的操…

B049-cms04-浏览次数 富文本 轮播图 上传

目录 浏览次数页面加载发送请求后台处理请求前台展示 展示日期富文本编辑static下引入富文本资源文件夹模态框文本域替换成如下内容底部引入相关文件调整模态框样式把富文本选项移到模态框前面上传表情或图片等富文本添加操作手动清空富文本编辑器内容修改操作手动回显富文本编…

postman接口测试—Restful接口开发与测试

开发完接口&#xff0c;接下来我们需要对我们开发的接口进行测试。接口测试的方法比较多&#xff0c;使用接口工具或者Python来测试都可以&#xff0c;工具方面比如之前我们学习过的Postman或者Jmeter &#xff0c;Python脚本测试可以使用Requests unittest来测试。 测试思路…

抖音短视频矩阵系统源码:技术开发与实践

目录 一.短视频账号矩阵管理系统囊括的技术 1.开发必备的开发文档说明&#xff1a; 二.技术文档分享&#xff1a; 1.底层框架系统架构&#xff1a; 2.数据库接口设计 1.技术开发必备的开发文档说明&#xff1a; 1.1系统架构&#xff1a; 抖音SEO排名系统主要由以下几个模…

PHP 对PDF文件实现数字签名

PHP通过TCPDF库对生成的PDF文件进行数字签名。 效果如下&#xff1a; 这个是因为签名证书不在可信任证书列表中。 目录 准备数字证书 1.申请数字证书 2.自签名证书 安装TCPDF 证书签名 设置证书路径 设置证书信息 设置文档签名 设置签名外观 图像签名外观 空签名外观…

git使用命令技巧

文章目录 前言查看提交用户名更改提交用户名查看文件的diff查看提交记录Git 本地分支管理查看、切换、创建和删除分支 前言 我们在使用git的时候&#xff0c;提交后会看到如下记录&#xff1a; 经常会遇到提交后&#xff0c;这个作者的名字和自己设置的名字不一致&#xff0…

Python文件操作指南:编码、读取、写入和异常处理

文章目录 文件的编码文件的读取使用 read 方法读取整个文件内容&#xff1a;使用 readlines 方法按行读取文件内容并存储到列表中&#xff1a;使用迭代器遍历文件内容&#xff1a; 文件的写入文件的追加文件操作的综合案例文件的关闭文件的存在性检查异常处理文件操作的更多方法…

如何下载外文文献,PubMed中的文献怎么获取

查找外文文献常用数据库有&#xff1a;PubMed、ScienceDirect、Wiley、Web of Science、EI等等。今天单独讲一下PubMed数据库文献的获取方法。 PubMed是生物医药领域使用最广泛的免费文献检索系统。但PubMed 的资讯并不包括期刊论文的全文&#xff0c;只是提供了指向全文提供者…

Meta Quest v55系统推送,浏览器支持多点触摸

6月25日青亭网报道&#xff0c;此前我们报道了Quest v55公测版系统更新解锁了GPU和CPU频率限制&#xff0c;以及动态分辨率渲染功能。 现在v55系统正式向所有人开启推送&#xff0c;并且加入了更多功能&#xff1a; 1&#xff0c;解锁GPU和CPU限制&#xff0c;支持动态分辨率渲…

Linux进程间通信——管道(上)

目录 前文 一&#xff0c;进程间通信介绍 二&#xff0c;什么是管道&#xff1f; 三&#xff0c;管道的基本原理 3.1 匿名管道 3.2 管道基本原理 四&#xff0c;样例代码 五&#xff0c;管道的读写规则 六&#xff0c;管道的特点 总结 前文 本文主要是讲解一下进程间…

一文告诉你低代码的价值

随着数字化时代的到来&#xff0c;软件开发已经成为企业不可或缺的一部分。然而&#xff0c;传统的软件开发过程往往缓慢而昂贵。由此&#xff0c;低代码开发平台的出现给企业带来了一种新的软件开发方式。在本文中&#xff0c;我们将探讨低代码开发平台的用处和发展史&#xf…

【数据分享】1929-2022年全球站点的逐年平均露点数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

centos7.x升级openeuler详细操作教程

本次升级使用工具为苏研提供 1. 升级前准备操作 1.1 注意事项 ● 迁移工具安装在辅助机中&#xff08;不进行系统迁移的机器&#xff09; ● 辅助机至少给迁移工具的安装预留 1.6G 内存空间 ● 安装之前需要关闭防火墙和 SELinux 的特殊要求 ● 工具安装环境需开启工具端口…

论文格式中要求作者加入orcid的链接在名字后边

论文格式中要求作者加入orcid的链接在名字后边&#xff0c;如下图&#xff1a; 使用网上给的各种写法会出现以下问题&#xff1a; &#xff08;1&#xff09;插入位置不合适 &#xff08;2&#xff09;出现一个正方形的框 &#xff08;3&#xff09;所有参考文献带框&#xff…

中国人民大学与加拿大女王大学金融硕士——努力必有回响,加油,金融人!

有付出&#xff0c;就会有收获&#xff1b;有努力&#xff0c;就会有回响。我们为梦想挥汗如雨&#xff0c;我们为未来奋力跋涉。金融领域在职读研的我们&#xff0c;突破了工作、生活等重围&#xff0c;进入到紧张学习的阶段&#xff0c;充分利用有限的时间完成自己蜕变&#…

微前端(micro-app)使用手册

转载请注明出处&#xff0c;点击此处 查看更多精彩内容 micro-app 使用手册 micro-app 是借鉴了 Web Component 的思想&#xff0c;通过 Custom Element 结合自定义的 Shadow Dom&#xff0c;将微前端封装成一个类 Web Component 组件&#xff0c;从而实现微前端的组件化渲染。…