tnblog
首页
视频
资源
登录

HugginFace 使用编码工具(学习笔记)

2332人阅读 2023/10/20 14:58 总访问:3470404 评论:0 收藏:0 手机
分类: HuggingFace

HugginFace 使用编码工具(学习笔记)

安装环境

  1. # 我这里的python是3.11
  2. %pip install -q transformers==4.18 datasets==2.4.0 torchtext

编码工具简介


HuggingFace提供了一套统一的编码API,由每个模型各自提交实现。

编码工具流程示例

1.定义字典


我们想让输入的文本,让电脑理解就是将其转换成数字的一个字典,这样可以方便电脑进行更好的计算。
举例:

  1. vocab = {
  2. '<SOS>': 0,
  3. '<EOS>': 1,
  4. 'the': 2,
  5. 'quick': 3,
  6. 'brown': 4,
  7. 'fox': 5,
  8. 'jumps': 6,
  9. 'over': 7,
  10. 'a': 8,
  11. 'lazy': 9,
  12. 'dog': 10,
  13. }

2.句子预处理


我们可以通过添加首尾标识把长的句子进行分词。
常用的是:
<SOS>表示开始。
<EOS>表示结束。

  1. #添加首尾符号
  2. sent = 'the quick brown fox jumps over a lazy dog'
  3. sent = '<SOS> ' + sent + ' <EOS>'
  4. print(sent)


运行结果如下:

3.分词


这个句子是英文,可以直接通过空格进行分词。
由于中文的复杂性可以通过一些成熟的分词工具进行分词。

  1. #英文分词
  2. words = sent.split()
  3. print(words)


运行结果如下:

4.编码


当我们需要把这些单词映射成数字,就可以通过我们前面定义的字典来实现。

  1. #编码为数字
  2. encode = [vocab[i] for i in words]
  3. print(encode)


运行结果如下:


以上就是一个编码的工作流程,经历了定义字典、句子预处理、分词、编码4个步骤。

使用编码工具


接下来我们来看看Huggingface提供的编码工具。

1.加载编码工具


首先我们添加的bert-base-chinese的编码工具。

  1. #第2章/加载编码工具
  2. from transformers import BertTokenizer
  3. tokenizer = BertTokenizer.from_pretrained(
  4. pretrained_model_name_or_path='bert-base-chinese',
  5. cache_dir=None,
  6. force_download=False,
  7. )
  8. tokenizer
参数 描述
pretrained_model_name_or_path 指定要加载的编码工具。这些工具可以从hangginface中找到。
cache_dir 指定编码工具的缓存路径。默认值为None。
force_download 当为True时表示已经有本地缓存都要强制执行下载工作。建议设置为False

2.准备实验数据

  1. #第2章/准备实验数据
  2. sents = [
  3. '你站在桥上看风景',
  4. '看风景的人在楼上看你',
  5. '明月装饰了你的窗子',
  6. '你装饰了别人的梦',
  7. ]

3.基本的编码函数


首先通过encode()来进行基本的编码函数,一次编码将对应一个或者一对句子,在这个例子中,编码了一对句子。
不是每个编码工具都有编码一对句子的功能,具体取决于不同模型的实现。

  1. #第2章/基本的编码函数
  2. out = tokenizer.encode(
  3. text=sents[0],
  4. text_pair=sents[1],
  5. #当句子长度大于max_length时截断
  6. truncation=True,
  7. #一律补pad到max_length长度
  8. padding='max_length',
  9. add_special_tokens=True,
  10. max_length=25,
  11. return_tensors=None,
  12. )
  13. print(out)
  14. print(tokenizer.decode(out))
参数 描述
texttext_pair texttext_pair分别为两个句子,如果只想编码一个句子,则可让text_pair传None
truncation 当为True时表示句子长度大于max_length时,截断句子。
padding 当值为max_length时,表示当句子不足为max_length时通过PAD进行填充到max_length的最大长度。
add_special_tokens 当为True,表示需要在句子中添加特殊符号
max_length 定义句子的长度
return_tensors 当为None时,返回的list的格式。除此之外还支持pytorch,numpy,tensorflow。


这里的decode()函数可以将list还原为分词前的句子,我们可以看到的句子的头部添加符号[CLS],句子尾部添加符号[SEP],由于长度不足max_length所以补充了4个[PAD]
可以通过空格看出编码把每一个字作为一个词,所以在BERT的实现中,中文分词处理做的比较简单。

4.进阶的编码函数


接下来展示一个稍微复杂的编码函数。

  1. #第2章/进阶的编码函数
  2. out = tokenizer.encode_plus(
  3. text=sents[0],
  4. text_pair=sents[1],
  5. #当句子长度大于max_length时截断
  6. truncation=True,
  7. #一律补零到max_length长度
  8. padding='max_length',
  9. max_length=25,
  10. add_special_tokens=True,
  11. #可取值tf,pt,np,默认为返回list
  12. return_tensors=None,
  13. #返回token_type_ids
  14. return_token_type_ids=True,
  15. #返回attention_mask
  16. return_attention_mask=True,
  17. #返回special_tokens_mask 特殊符号标识
  18. return_special_tokens_mask=True,
  19. #返回length 标识长度
  20. return_length=True,
  21. )
  22. #input_ids 编码后的词
  23. #token_type_ids 第一个句子和特殊符号的位置是0,第二个句子的位置是1
  24. #special_tokens_mask 特殊符号的位置是1,其他位置是0
  25. #attention_mask pad的位置是0,其他位置是1
  26. #length 返回句子长度
  27. for k, v in out.items():
  28. print(k, ':', v)
  29. tokenizer.decode(out['input_ids'])


这里调用了encode_plus()函数,进阶版的编码函数。
它多了几个编码结果,如果指定为False则不会返回对应的内容。

参数 描述
input_ids 编码后的词。
token_type_ids 因为编码的是两个句子,这里表示第二个句子为1,其他位置都是0。
special_tokens_mask 特殊符号的位置是1,其他位置是0
attention_mask PAD的位置是0,其他位置是1
length 表明编码后句子的长度。

5.批量的编码函数


我们可以通过的batch_encode_plus()函数批量的进行数据处理,代码如下:

  1. #第2章/批量编码成对的句子
  2. out = tokenizer.batch_encode_plus(
  3. #编码成对的句子
  4. batch_text_or_text_pairs=[(sents[0], sents[1]), (sents[2], sents[3])],
  5. add_special_tokens=True,
  6. #当句子长度大于max_length时截断
  7. truncation=True,
  8. #一律补零到max_length长度
  9. padding='max_length',
  10. max_length=25,
  11. #可取值tf,pt,np,默认为返回list
  12. return_tensors=None,
  13. #返回token_type_ids
  14. return_token_type_ids=True,
  15. #返回attention_mask
  16. return_attention_mask=True,
  17. #返回special_tokens_mask 特殊符号标识
  18. return_special_tokens_mask=True,
  19. #返回offset_mapping 标识每个词的起止位置,这个参数只能BertTokenizerFast使用
  20. #return_offsets_mapping=True,
  21. #返回length 标识长度
  22. return_length=True,
  23. )
  24. #input_ids 编码后的词
  25. #token_type_ids 第一个句子和特殊符号的位置是0,第二个句子的位置是1
  26. #special_tokens_mask 特殊符号的位置是1,其他位置是0
  27. #attention_mask pad的位置是0,其他位置是1
  28. #length 返回句子长度
  29. for k, v in out.items():
  30. print(k, ':', v)
  31. tokenizer.decode(out['input_ids'][0])
参数 描述
batch_text_or_text_pairs 用于编码一批句子,示例中为成对的句子,如果需要编码的是一个一个的句子,则修改为如下的形式即可
  1. batch_text_or_text_pairs=[sents[0], sents[1]]


运行结果如下:


可以看到这里输出的都是二维的list,表明这是一个批量的编码。

6.对字典操作


查看字典。

  1. #第2章/获取字典
  2. vocab = tokenizer.get_vocab()
  3. type(vocab), len(vocab), '明月' in vocab


可以看到字典是dict类型,在BERT的字典中,共有21128个词,并且明月不存在字典中。
接下来我们将添加这个词

  1. #第2章/添加新词
  2. tokenizer.add_tokens(new_tokens=['明月', '装饰', '窗子'])
  3. # 添加新符号
  4. tokenizer.add_special_tokens({'eos_token': '[EOS]'})
  5. vocab = tokenizer.get_vocab()
  6. type(vocab), len(vocab), vocab['明月'], vocab['[EOS]']


接下来试试使用新词的字典编码句子,代码如下:

  1. #第2章/编码新添加的词
  2. out = tokenizer.encode(
  3. text='明月装饰了你的窗子[EOS]',
  4. text_pair=None,
  5. #当句子长度大于max_length时,截断
  6. truncation=True,
  7. #一律补pad到max_length长度
  8. padding='max_length',
  9. add_special_tokens=True,
  10. max_length=10,
  11. return_tensors=None,
  12. )
  13. print(out)
  14. tokenizer.decode(out)


输出如下:


可以看到,明月已经被识别为一个词,而不是两个词,新的特殊符号[EOS]也被正确识别。


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

HugginFace 初探

HugginFace 初探[TOC] 安装环境python环境是3.6。import sys sys.version 安装torch,简单起见,避免环境问题,并且计...

HugginFace 使用数据集(学习笔记)

HugginFace 使用数据集(学习笔记)[TOC] 数据集工具介绍HuggingFace 提供了统一的数据集处理工具,让不同的数据集通过统一...

HugginFace 使用评价指标工具(学习笔记)

HugginFace 使用评价指标工具(学习笔记)[TOC] 评价指标工具介绍在训练和测试一个模型时往往需要计算不同的评价指标,如正...

HugginFace 使用管道工具(学习笔记)

HugginFace 使用管道工具(学习笔记)[TOC] 管道工具介绍HuggingFace 有一个巨大的模型库,其中一些是已经非常成熟的经典模...

HugginFace 使用训练工具(学习笔记)

HugginFace 使用训练工具(学习笔记)[TOC] 训练工具介绍HuggingFace提供了巨大的模型库,但我们往往还需要对特定的数据集进...

HugginFace 中文情感分类(学习笔记)

HugginFace 中文情感分类(学习笔记)[TOC] 数据集介绍本章使用的是lansinuote/ChnSentiCorp数据集,这是一个情感分类数据集...

HugginFace 中文填空(学习笔记)

HugginFace 中文填空(学习笔记)[TOC] 数据集介绍本章使用的仍然是情感分类数据集,每条包括一句购物评价一集以及是不是好...

HugginFace 中文数据关系推断(学习笔记)

HugginFace 中文数据关系推断(学习笔记)[TOC] 实现代码安装包加载的环境可以通过如下命令进行安装。%pip install -q trans...

HugginFace 中文命名实体识别(学习笔记)

HugginFace 中文命名实体识别(学习笔记)[TOC] 任务简介简单来说就是的识别人名、机构名、地名。数据集的介绍本章所使用的...

常用的很厉害的工具

图片压缩相对图片无损放大来说是小kiss。下面是非常非常帅气的图片无损放大http://bigjpg.com/图片压缩https://www.upyun.c...

一些有用的资源分享(工具+电子书)

工具类图片相关工具TinyPNG:https://tinypng.com/ 免费的在线图片压缩工具,压缩率高,无损画质,直接拖拽使用,很方便。p...

开发自己的代码生成工具

在一个项目中其实有很多代码都是重复的,几乎每个基础模块的代码都有增删改查的功能,而这些功能都是大同小异,如果这些功...

windoes 强力下载工具Internet Download Manager

大家好,我是刘小贱,今天呢我给大家推荐一款Windows系统上的下载神器:Internet Download Manager ,这款软件通过在浏览器上...

net core使用jwt 三: 使用过滤器实现通用token验证Token验证工具

net core使用jwt二 : 验证前台传递的tokenhttp://www.tnblog.net/aojiancc2/article/details/2845过滤器实现通用token验证...

oralce plsql打开执行sql的工具

如果不小心关闭了,要打开执行sql的工具栏如下箭头的地方右键即可
这一世以无限游戏为使命!
排名
2
文章
635
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术