NLP 课程文档

Transformers 能做什么?

Hugging Face's logo
加入 Hugging Face 社区

并获得增强文档体验

开始使用

Transformers 能做什么?

Ask a Question Open In Colab Open In Studio Lab

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

👀 看到右上角的 在 Colab 中打开 按钮了吗?点击它以打开一个包含本节所有代码示例的 Google Colab 笔记本。此按钮将出现在包含代码示例的任何部分中。

如果要本地运行示例,建议查看 设置

Transformers 无处不在!

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

Companies using Hugging Face

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

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

在深入了解 Transformer 模型在底层的工作原理之前,让我们先看看如何使用它们来解决一些有趣的 NLP 问题的一些示例。

使用管道

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

from transformers import pipeline

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

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

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

默认情况下,此管道选择一个特定预训练模型,该模型已针对英语的情感分析进行了微调。创建 classifier 对象时,将下载并缓存模型。如果重新运行该命令,将使用缓存的模型,无需再次下载模型。

将某些文本传递给管道时,涉及三个主要步骤

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

一些当前 可用的管道

  • feature-extraction(获取文本的向量表示)
  • 填充掩码(fill-mask)
  • ner(命名实体识别)
  • 问答(question-answering)
  • 情感分析(sentiment-analysis)
  • 摘要(summarization)
  • 文本生成(text-generation)
  • 翻译(translation)
  • 零样本分类(zero-shot-classification)

让我们看看其中的一些!

零样本分类

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

from transformers import pipeline

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

此管道被称为零样本,因为您无需在您的数据上微调模型即可使用它。它可以直接返回您想要的任何标签列表的概率分数!

✏️ 试试看! 使用您自己的序列和标签进行尝试,并查看模型的行为。

文本生成

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

from transformers import pipeline

generator = pipeline("text-generation")
generator("In this course, we will teach you how to")
[{'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 控制输出文本的总长度。

✏️ 试试看! 使用 num_return_sequencesmax_length 参数生成两个各包含 15 个单词的句子。

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

前面的示例使用了当前任务的默认模型,但您也可以从 Hub 中选择一个特定的模型,并在管道中用于特定任务,例如文本生成。访问 模型 Hub,然后点击左侧相应的标签,以仅显示该任务支持的模型。您应该会进入类似于 此页面 的页面。

让我们尝试一下 distilgpt2 模型!以下是在与之前相同的管道中加载它的方法:

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,
)
[{'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'}]

您可以通过点击语言标签来细化对模型的搜索,并选择一个将生成其他语言文本的模型。模型 Hub 甚至包含支持多种语言的多语言模型的检查点。

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

✏️ 试一试! 使用过滤器查找其他语言的文本生成模型。随意使用小部件并将其用于管道!

推理 API

所有模型都可以通过您的浏览器直接使用推理 API 进行测试,该 API 在 Hugging Face 网站 上可用。您可以通过输入自定义文本并在模型处理输入数据时观察它,直接在此页面上与模型交互。

为小部件提供支持的推理 API 也可以作为付费产品使用,如果您在工作流程中需要它,这将非常方便。有关更多详细信息,请参阅 定价页面

掩码填充

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

from transformers import pipeline

unmasker = pipeline("fill-mask")
unmasker("This course will teach you all about <mask> models.", top_k=2)
[{'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> 词,通常称为掩码标记。其他掩码填充模型可能具有不同的掩码标记,因此在探索其他模型时,始终最好验证正确的掩码词。一种检查方法是查看小部件中使用的掩码词。

✏️ 试一试! 在 Hub 上搜索 bert-base-cased 模型,并在推理 API 小部件中识别其掩码词。对于上面 pipeline 示例中的句子,该模型预测什么?

命名实体识别

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

from transformers import pipeline

ner = pipeline("ner", grouped_entities=True)
ner("My name is Sylvain and I work at Hugging Face in Brooklyn.")
[{'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。在后处理步骤中,管道成功地重新组合了这些部分。

✏️ 试一试! 在模型 Hub 中搜索能够对英语进行词性标注(通常缩写为 POS)的模型。对于上面的示例中的句子,该模型预测什么?

问答

question-answering 管道使用给定上下文中的信息来回答问题。

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",
)
{'score': 0.6385916471481323, 'start': 33, 'end': 45, 'answer': 'Hugging Face'}

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

摘要

摘要的任务是将文本缩减为更短的文本,同时保留文本中引用的所有(或大多数)重要方面。以下是一个示例:

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.
"""
)
[{'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_lengthmin_length

翻译

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

from transformers import pipeline

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

与文本生成和摘要一样,您可以为结果指定 max_lengthmin_length

✏️ 试一试! 搜索其他语言的翻译模型,并尝试将上一句翻译成几种不同的语言。

到目前为止显示的管道主要用于演示目的。它们是针对特定任务编程的,无法执行其变体。在下一章中,您将了解 pipeline() 函数内部的内容以及如何自定义其行为。