Hugging Face实战-系列教程1:Tokenizer分词器(Transformer工具包/自然语言处理)

🚩🚩🚩Hugging Face 实战系列 总目录

有任何问题欢迎在下面留言

本篇文章的代码运行界面演示结果均在notebook中进行

本篇文章配套的代码资源已经上传

下篇内容:

Hugging Face实战-系列教程2:AutoModel模型自动选择工具_机器学习杨卓越的博客-CSDN博客

今天要做的这个任务其实就是一个调包的过程,但是我们需要了解一下这个流程。这个流程熟悉了,NLP领域的很多问题都可以按照这个流程去做了,比如对话生成、机器翻译、文本摘要等任务,你脑海中就会浮现出一个通用模板了,你不需要在做所有的子任务之前都需要再熟悉一遍了。你只需要知道,到了今天在NLP领域的所有任务,都可以用Transformer结合Hugging Face去玩就行了。 

1、相关背景

NLP要解决的任务:

  1. 处理文本数据,首先对文本数据进行分词操作(分词的方法可能会不同,中文常见的就是分词或者分字)
  2. 分完的词它不还是字符嘛,计算机还不认识,最终我们希望把这些字符映射成实际的特征(向量)
  3. 输入搞定好了之后,接下来咱们要构建模型了(一般都用预训练模型,例如BERT,GPT系列等)
  4. 怎么去完成我们自己的任务呢,基本上就是在预训练模型的基础上进行微调(训练我们自己数据的过程)

2012年的word2vec到现在除了科研机构,已经完全不需要使用了。绝大多数的算法工程师和科研人员都没有机会去参与词向量的制作。词向量的制作,这个数据量已经不仅仅是用G或者T来衡量的单位,这个数据量是非常惊人的。

国内一般使用哈工大的或者清华的词向量库,我们调现成的就行,别觉得调现成的很low,这是最方便的做法。(你自己做,先不说你有没有这种级别的计算资源,你存都没地方存,真做起来电费你都交不起)。我们需要做的就是在别人的模型和词库基础上,对模型进行微调来解决自己的任务。

NLP任务,主要分成两个方向来学习一个是谷歌的bert,一个是openAI的gpt,二者都是2018年所出的模型基本同一时间,谁抄谁还不一定呢。

2、安装测试

首先看看怎么使用Hugging Face给我们提供的包,首先安装:

安装就是很简单,打开命令行,执行这个命令就是装,只需要这一步操作!(没有什么CPU、GPU版本,没有一大串恶心人的操作,可能之前装Pytorch、TF还有一些商汤做的一些包,已经把我们算法工程给装怕了。)

pip install transformers

但是在此之前,你最起码要把深度学习的环境配置好,可以参考我这篇文章:PyTorch深度学习开发环境搭建全教程

先来瞅瞅多简单就干了一个大活
Huggingface这个包基本上就是调用即可,开箱即用的过程

对刚刚安装的包进行Hello Word级别任务测试:

import warnings
warnings.filterwarnings("ignore")
from transformers import pipeline#用人家设计好的流程完成一些简单的任务
classifier = pipeline("sentiment-analysis")
classifier(
    [
        "I've been waiting for a HuggingFace course my whole life.",
        "I hate this so much!",
    ]
)

输出结果:

[{'label': 'POSITIVE', 'score': 0.9598050713539124},
 {'label': 'NEGATIVE', 'score': 0.9994558691978455}]

这就是从transformers调出一个pipeline模块,这个模块可以给你提供很多接口,比如sentiment-analysis就是情感分析接口,第一次执行这个代码的时候,会给你下载一些已经训练好的模型。(你跑这个可能不需要梯子,但是你玩HuggingFace没有梯子可能还真不行)

下载的模型一般在这个位置:

3、基本流程概述分析

  1. 首先就是第一步Raw text输入文本(This course is amazing)
  2. 不管是中文还是英文都会将文本转化为ID,(This course is amazing)是四个词为什么会有6个ID呢?后面解释。
  3. ID直接输入到模型中(Bert、GPT),生成一个Logits结果
  4. 在经过一个后处理词操作,把前面的结果转换成概率

NLP的流程比CV简单的多,在CV领域的任务流程处理方式百花齐放,但是在NLP领域就是Transformer一统天下的格局。NLP的流程非常非常固定,没有任何区别。人类学会人类语言需要两年,这两年过程中的每天可能需要听到上万个词,所以让计算机学会人类语言也是需要一个过程的。NLP任务基本上都是大同小小小异。

4、Tokenizer需要做的事情

  • 分词,分字以及特殊字符(起始,终止,间隔,分类等特殊字符可以自己设计的)
  • 对每一个token映射得到一个ID(每个词都会对应一个唯一的ID)
  • 还有一些辅助信息也可以得到,比如当前词属于哪个句子(还有一些MASK,表示是否事原来的词还是特殊字符等)

上代码:

from transformers import AutoTokenizer#自动判断

checkpoint = "distilbert-base-uncased-finetuned-sst-2-english"#根据这个模型所对应的来加载
tokenizer = AutoTokenizer.from_pretrained(checkpoint)

(Hugging Face一个特别牛逼的地方就是一个API玩儿所有东西,就不用在多个地方调分词器)

从Transformers中调出一个自动分词器,这个“自动”分词器AutoTokenizer可以根据你选择的模型自动选择分词器,这就太省事儿,但是我们应该怎么选择模型呢?你去Hugging Face上去下载,不知道选哪个,按照销量(下载量)来呗。(现在NLP领域研究的论文,全都得根据Hugging Face去做,为什么?你得做对比试验啊,在HuggingFace就很方便去和别人作对比)

一个小例子:

raw_inputs = [
    "I've been waiting for a this course my whole life.",
    "I hate this so much!",
]
inputs = tokenizer(raw_inputs, padding=True, truncation=True, return_tensors="pt")
print(inputs)

解释一下tokenizer的参数:

  • raw_inputs:你选择的语言文本
  • padding:默认为True,你输入的句子长度不一样,不管你输入多少句子,按照最长的那个进行补齐,补得就是0,padding这个词,我们在卷积神经网络就已经见过了
  • truncation:截断操作,这里没用上,其实任务中需要制定一个max_longs参数,指定一个最大长度的句子,事实上所有的模型都指定来512个词为最大长度,谷歌、openAI亦是如此,在深度学习中科学家也很喜欢512个词。也就是说,一个句子最大长度就是512个词
  • return_tensors:在Hugging Face中支持多种框架,默认的是PyTorch,PyTorch的数据格式就是tensor,指定为pt

这段代码的输出结果:

{'input_ids': tensor([[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 2023, 2607, 2026, 2878,
         2166, 1012,  102],
        [ 101, 1045, 5223, 2023, 2061, 2172,  999,  102,    0,    0,    0,    0,
            0,    0,    0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
        [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0]])}

你需要记住这个input_ids,input_ids这个名字是自动生成的,它是将每一个词都生成一个对应的索引。

比如看第二句话 I hate this so much! 一共有5个单词,但是还得加上标点符号,就是6个,但是在上面的结果中可以看到有8个编号后面再加上一下补长的0,其中101表示一个句子的开头,102表示一个句子的结束,所以有8个编号。(不同分词器的编号规则和内容不一定相同)

也就是说当前的id可以转化为tensor,也可以转化为文本,可以做编码解码的工作

使用这个编号,将句子解码出来,代码:

tokenizer.decode([ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 2023, 2607, 2026, 2878,2166, 1012,  102])

输出的结果:

"[CLS] i've been waiting for a this course my whole life. [SEP]"

这里的CLS表示的是分类的字符,SEP表示终止的字符,也就是说101和102表示特殊字符。

那后面0是什么?前面提到为来保证长度一致,做了padding补齐的操作,通过SEP做来分隔,SEP之前是实际内容,SEP之后是补0的内容,但是我们注意到了一个叫做attention_mask的东西。我们在做Transformer在做Self-Attention的时候,每一个词都需要跟所有的词计算关系(还不知道什么是Transformer去看我的这篇文章),那我后面补了0,需要前面的词需要和0计算关系吗?是不是不用啊。attention_mask表示的意思就是SEP后面的0,是不用计算的,全都是占位符而已。

 下篇内容:

Hugging Face实战-系列教程2:AutoModel模型自动选择工具_机器学习杨卓越的博客-CSDN博客

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
### 回答1: Lucene 5.5是一个开源的Java搜索引擎库,用于文本分析、索引和搜索。在Lucene中,分词器Tokenizer)是用于将输入文本按照特定规则切分成单词(token)的工具。 Lucene 5.5提供了多种分词器,常用的有标准分词器(StandardTokenizer)、简单分词器(SimpleAnalyzer)、关键字分词器(KeywordAnalyzer)等。这些分词器在应用场景和切分规则上有所不同,用户可以根据需求选择合适的分词器。 标准分词器是Lucene中最常用的分词器之一,它通过去除空格、标点符号等特殊字符,将输入文本切分成一系列单词。这个过程叫做词法分析(tokenizing)。标准分词器还提供了一些附加的文本处理功能,例如将单词转换为小写(lowercasing)、去除停用词(stopwords)等。 简单分词器是一个基本的分词器,它将输入文本用空格切分成单词,并将单词转换为小写。这个分词器在某些简单的搜索场景中会有一定的使用价值。 关键字分词器则是将整个输入文本当作一个单词进行处理,适用于某些特殊的搜索需求。例如,当用户输入一个关键字作为搜索条件时,关键字分词器可以直接将整个关键字当作一个单词进行匹配。 除了以上提到的分词器,Lucene还提供了其他各种特定场景下的分词器,例如CJK分词器适用于中日韩文本的分词,Whitespace分词器将输入文本按照空格进行切分等等。 总结来说,Lucene 5.5提供了多种分词器供用户选择,根据不同的文本分析需求和搜索场景,选择合适的分词器可以提高搜索的效果和准确性。 ### 回答2: Lucene 5.5 是一款开源的全文搜索引擎库,其中的分词器是其核心组件之一。分词器用于将输入的文本进行切分,生成词条列表,以便进行索引和搜索。 Lucene 5.5 提供了多种分词器,常用的有标准分词器(StandardAnalyzer)和中文智能分词器(SmartChineseAnalyzer)。 标准分词器是最常用的分词器之一,它基于语法规则对文本进行切分,以空格、标点符号等作为分隔符。它能够处理英文等非中文文本,但对于中文文本效果不佳,因为中文没有明确的分隔符。 中文智能分词器是专门针对中文文本设计的分词器,它不仅考虑了语法规则,还结合了汉字之间的概率关联关系对文本进行切分。通过对大量的中文语料进行训练,智能分词器可以较好地解决中文分词中的歧义性问题,提升分词的准确性和效果。 除了以上两种分词器,Lucene 5.5 还提供了其他一些适用于特定场景的分词器,如关键字分词器(KeywordAnalyzer)和简单分词器(SimpleAnalyzer)。用户也可以根据自己的需求自定义分词器,通过实现接口来自定义词汇的切分规则。 总之,Lucene 5.5 分词器是一系列能够对文本进行切分的工具,包括了多种分词算法和规则,以满足不同场景下的需求。通过合理选择和应用分词器,可以提高全文搜索引擎的准确性和效率,为用户提供更好的搜索体验。 ### 回答3: Lucene 5.5 是一个开源的全文搜索引擎库,其中包含了许多功能强大的分词器。 在Lucene 5.5中,分词器是用于将文本分成单个的词语或词元的组件。这对于搜索引擎的索引构建和查询处理非常重要。在Lucene中,我们可以使用不同类型的分词器来满足不同的需求。 Lucene 5.5提供了许多内置的分词器。其中最常用的是StandardAnalyzer,它是基于标准英语规则的分词器,它可以将文本分成单词,并过滤掉一些常见的停用词。此外,还有KeywordAnalyzer,它将文本视为一个整体,不对其进行分词。另外还有SimpleAnalyzer,它将文本按照非字母字符进行分割,并将其小写化。还有WhitespaceAnalyzer,它将文本按照空格进行分割。 除了这些内置的分词器,Lucene 5.5还支持自定义的分词器。开发人员可以根据自己的需求实现自己的分词器。自定义分词器需要实现TokenStream接口,该接口定义了文本分词后的词元流。 通过使用Lucene 5.5的分词器,我们可以将待搜索的文本分成单个的词语或词元,从而提高搜索的准确性和效率。分词器是搜索引擎中一个非常关键的组件,它的质量和性能直接影响着整个搜索过程的效果。因此,了解和选择适合的分词器是非常重要的。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器学习杨卓越

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值