前言

在本节中,我们将看看Transformer模型可以做什么,并使用🤗Transformers库中的第一个工具:pipeline()函数。

src link: https://huggingface.co/learn/nlp-course/chapter1/3

Google Colab notebook: https://colab.research.google.com/github/huggingface/notebooks/blob/master/course/en/chapter1/section3.ipynb

Operating System: Ubuntu 22.04.4 LTS

参考文档

  1. NLP Course - Transformers, what can they do?

到处都是Transformers!

Transformer模型用于解决各种NLP任务,如上一节中提到的。以下是一些使用Hugging Face和Transformer模型的公司和组织,他们也通过分享他们的模型来回馈社区:

🤗Transformers库提供了创建和使用这些共享模型的功能。模型中心包含数千个任何人都可以下载和使用的预训练模型。您还可以将自己的模型上传到中心!

⚠️ Hugging Face Hub不限于Transformer模型。任何人都可以共享他们想要的任何类型的模型或数据集!创建一个huggingface.co帐户以受益于所有可用功能!

在深入研究Transformer模型如何在幕后工作之前,让我们看几个如何使用它们来解决一些有趣的NLP问题的示例。

使用管道

🤗Transformers库中最基本的对象是pipeline()函数,它将一个模型与其必要的预处理和后处理步骤连接起来,允许我们直接输入任何文本并得到一个可理解的答案:

1
2
3
4
from transformers import pipeline

classifier = pipeline("sentiment-analysis")
classifier("I've been waiting for a HuggingFace course my whole life.")
1
[{'label': 'POSITIVE', 'score': 0.9598047137260437}]

我们甚至可以传递几个句子!

1
2
3
classifier(
["I've been waiting for a HuggingFace course my whole life.", "I hate this so much!"]
)
1
2
[{'label': 'POSITIVE', 'score': 0.9598047137260437},
{'label': 'NEGATIVE', 'score': 0.9994558095932007}]

默认情况下,此管道选择一个特定的预训练模型,该模型已被英文微调用于情感分析。当您创建分类器对象时,模型将被下载并缓存。如果您重新运行该命令,将使用缓存的模型代替,无需再次下载模型。

将文本传递到管道时涉及三个主要步骤:

  1. 文本被预处理成模型可以理解的格式。
  2. 预处理的输入被传递给模型。
  3. 模型的预测是后处理的,因此您可以理解它们。

目前可用的一些管道是:

  • feature-extraction (get the vector representation of a text)
  • fill-mask
  • ner (named entity recognition)
  • question-answering
  • sentiment-analysis
  • summarization
  • text-generation
  • translation
  • zero-shot-classification

让我们看看其中的几个!

Zero-shot分类

我们将从处理一个更具挑战性的任务开始,我们需要对尚未标记的文本进行分类。这是现实世界项目中的常见场景,因为注释文本通常很耗时,并且需要领域专业知识。对于这个用例,zero-shot-classification管道非常强大:它允许您指定用于分类的标签,因此您不必依赖预训练模型的标签。您已经看到模型如何使用这两个标签将句子分类为正面或负面-但它也可以使用您喜欢的任何其他标签集对文本进行分类。

1
2
3
4
5
6
7
from transformers import pipeline

classifier = pipeline("zero-shot-classification")
classifier(
"This is a course about the Transformers library",
candidate_labels=["education", "politics", "business"],
)
1
2
3
{'sequence': 'This is a course about the Transformers library',
'labels': ['education', 'business', 'politics'],
'scores': [0.8445963859558105, 0.111976258456707, 0.043427448719739914]}

这个管道被称为zero-shot,因为你不需要在你的数据上微调模型来使用它,它可以直接为你想要的任何标签列表返回概率分数!

文本生成

现在让我们看看如何使用管道来生成一些文本。这里的主要思想是,您提供一个提示,模型将通过生成剩余的文本来自动完成它。这类似于许多手机上的预测文本功能。文本生成涉及随机性,因此如果您没有得到如下所示的相同结果,这是正常的。

1
2
3
4
from transformers import pipeline

generator = pipeline("text-generation")
generator("In this course, we will teach you how to")
1
2
3
4
5
[{'generated_text': 'In this course, we will teach you how to understand and use '
'data flow and data interchange when handling user data. We '
'will be working with one or more of the most commonly used '
'data flows — data flows of various types, as seen by the '
'HTTP'}]

你可以通过参数 num_return_sequences 控制生成多少个不同的序列,以及通过参数 max_length 控制输出文本的总长度。

在管道中使用Hub中的任何模型

前面的示例对手头的任务使用默认模型,但您也可以从Hub中选择特定模型以在特定任务的管道中使用-例如文本生成。转到模型Hub并单击左侧的相应标签以仅显示该任务支持的模型。您应该会进入这样的页面

让我们试一试distilgpt2模型!以下是如何将其加载到与以前相同的管道中:

1
2
3
4
5
6
7
8
from transformers import pipeline

generator = pipeline("text-generation", model="distilgpt2")
generator(
"In this course, we will teach you how to",
max_length=30,
num_return_sequences=2,
)
1
2
3
4
5
[{'generated_text': 'In this course, we will teach you how to manipulate the world and '
'move your mental and physical capabilities to your advantage.'},
{'generated_text': 'In this course, we will teach you how to become an expert and '
'practice realtime, and with a hands on experience on both real '
'time and real'}]

您可以通过单击语言标签来优化模型搜索,并选择将生成另一种语言文本的模型。模型中心甚至包含支持多种语言的多语言模型的检查点。

通过单击选择模型后,您会看到有一个小部件使您能够直接在线尝试。这样您就可以在下载模型之前快速测试模型的功能。

Mask filling

您将尝试的下一个管道是fill-mask。此任务的想法是填充给定文本中的空白:

1
2
3
4
from transformers import pipeline

unmasker = pipeline("fill-mask")
unmasker("This course will teach you all about <mask> models.", top_k=2)
1
2
3
4
5
6
7
8
[{'sequence': 'This course will teach you all about mathematical models.',
'score': 0.19619831442832947,
'token': 30412,
'token_str': ' mathematical'},
{'sequence': 'This course will teach you all about computational models.',
'score': 0.04052725434303284,
'token': 38163,
'token_str': ' computational'}]

参数 top_k 控制你想要显示多少种可能性。请注意,在这里模型填充的是特殊的 <mask> 单词,这通常被称为掩码token。其他掩码填充模型可能有不同的掩码token,所以在探索其他模型时,验证正确的掩码单词总是好的。检查的一种方法是通过查看小部件中使用的掩码单词。

命名实体识别

命名实体识别(NER)是一项任务,其中模型必须找到输入文本的哪些部分对应于人员、位置或组织等实体。让我们看一个例子:

1
2
3
4
from transformers import pipeline

ner = pipeline("ner", grouped_entities=True)
ner("My name is Sylvain and I work at Hugging Face in Brooklyn.")
1
2
3
4
[{'entity_group': 'PER', 'score': 0.99816, 'word': 'Sylvain', 'start': 11, 'end': 18}, 
{'entity_group': 'ORG', 'score': 0.97960, 'word': 'Hugging Face', 'start': 33, 'end': 45},
{'entity_group': 'LOC', 'score': 0.99321, 'word': 'Brooklyn', 'start': 49, 'end': 57}
]

在这里,模型正确地识别出 Sylvain 是一个人(PER),Hugging Face 是一个组织(ORG),而 Brooklyn 是一个地点(LOC)。

我们在管道创建函数中传递了选项 grouped_entities=True,以告诉管道将句子的对应同一实体部分重新组合在一起:在这里,模型正确地将“Hugging”和“Face”作为一个单一的组织组合在一起,尽管名称由多个单词组成。实际上,正如我们将在下一章看到的,预处理甚至将一些单词分割成更小的部分。例如,Sylvain 被分割成四部分:S, ##yl, ##va, 和 ##in。在后期处理步骤中,管道成功地重新组合了这些部分。

问答

问答管道使用给定上下文中的信息来回答问题:

1
2
3
4
5
6
7
from transformers import pipeline

question_answerer = pipeline("question-answering")
question_answerer(
question="Where do I work?",
context="My name is Sylvain and I work at Hugging Face in Brooklyn",
)
1
{'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'}

请注意,此管道通过从提供的上下文中提取信息来工作;它不会生成答案。

摘要

摘要是将文本简化为更短的文本,同时保留文本中引用的所有(或大部分)重要方面的任务。这里有一个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
from transformers import pipeline

summarizer = pipeline("summarization")
summarizer(
"""
America has changed dramatically during recent years. Not only has the number of
graduates in traditional engineering disciplines such as mechanical, civil,
electrical, chemical, and aeronautical engineering declined, but in most of
the premier American universities engineering curricula now concentrate on
and encourage largely the study of engineering science. As a result, there
are declining offerings in engineering subjects dealing with infrastructure,
the environment, and related issues, and greater concentration on high
technology subjects, largely supporting increasingly complex scientific
developments. While the latter is important, it should not be at the expense
of more traditional engineering.

Rapidly developing economies such as China and India, as well as other
industrial countries in Europe and Asia, continue to encourage and advance
the teaching of engineering. Both China and India, respectively, graduate
six and eight times as many traditional engineers as does the United States.
Other industrial countries at minimum maintain their output, while America
suffers an increasingly serious decline in the number of engineering graduates
and a lack of well-educated engineers.
"""
)
1
2
3
4
5
6
7
[{'summary_text': ' America has changed dramatically during recent years . The '
'number of engineering graduates in the U.S. has declined in '
'traditional engineering disciplines such as mechanical, civil '
', electrical, chemical, and aeronautical engineering . Rapidly '
'developing economies such as China and India, as well as other '
'industrial countries in Europe and Asia, continue to encourage '
'and advance engineering .'}]

与文本生成一样,您可以指定结果的最大长度(max_length)或最小长度(min_length)。

翻译

对于翻译,如果您在任务名称中提供一个语言对(例如 “translation_en_to_fr”),则可以使用默认模型,但最简单的方法是在模型库中选择您想要使用的模型。这里我们将尝试从法语翻译成英语:

1
2
3
4
from transformers import pipeline

translator = pipeline("translation", model="Helsinki-NLP/opus-mt-fr-en")
translator("Ce cours est produit par Hugging Face.")
1
[{'translation_text': 'This course is produced by Hugging Face.'}]

与文本生成和摘要一样,您可以指定结果的最大长度(max_length)或最小长度(min_length)。

到目前为止展示的管道主要是用于演示目的。它们是为特定任务编程的,不能执行这些任务的变体。在下一章中,您将学习 pipeline() 函数内部的内容以及如何自定义其行为。

结语

第一百七十九篇博文写完,开心!!!!

今天,也是充满希望的一天。