一起学Hugging Face Transformers(19)- pipeline的类型


前言

前面的文章里有如下一段代码

# 创建NER管道
ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer)

这个ner管道是什么呢

一、什么是 NER管道

在命名实体识别任务中,pipeline("ner") 创建了一个用于识别文本中命名实体的管道。这个管道会自动处理文本的分词、模型推理以及结果的后处理,使得整个过程变得非常简洁和高效。

以下是对 pipelinener 管道的详细解释:

1. pipeline API

pipeline API 是 Hugging Face transformers 库中的一个高层次接口,用于简化模型的使用。它可以处理输入的文本、进行推理并返回结果。根据指定的任务类型(如 “ner”、“text-classification”、“translation” 等),pipeline 会自动选择适当的预处理和后处理步骤。

2. NER 管道

当我们使用 pipeline("ner") 时,我们实际上是在创建一个命名实体识别的管道。这个管道会:

1) 使用分词器将输入文本转换为模型可处理的格式。
2) 使用模型对转换后的输入进行推理,识别出文本中的命名实体。
3) 对模型的输出进行后处理,将结果转换为人类可读的形式。

这里是一个详细的示例,展示了如何使用 NER 管道:

from transformers import pipeline

# 使用 pipeline 创建一个 NER 管道
ner_pipeline = pipeline("ner", model="dbmdz/bert-large-cased-finetuned-conll03-english")

# 输入文本
text = "Hugging Face Inc. is a company based in New York City. Its headquarters are in DUMBO, therefore very close to the Manhattan Bridge."

# 进行命名实体识别
ner_results = ner_pipeline(text)

# 打印识别结果
for entity in ner_results:
    print(f"Entity: {entity['word']}, Label: {entity['entity']}, Start: {entity['start']}, End: {entity['end']}")

在这个示例中,我们创建了一个 NER 管道,并直接将文本传递给管道进行命名实体识别。管道会自动处理文本的分词、模型推理和结果的后处理,并返回识别到的实体。

3. NER 管道的输出

ner_pipeline 返回的结果是一个列表,每个元素是一个字典,包含以下信息:

  • word: 被识别的实体词。
  • entity: 实体的标签(例如,B-PER 表示人名的开始,I-PER 表示人名的内部)。
  • score: 置信度分数,表示模型对这个实体的预测置信度。
  • start: 实体在输入文本中的起始位置。
  • end: 实体在输入文本中的结束位置。

通过这些信息,我们可以清晰地了解文本中识别出的所有命名实体及其位置。

4. 小结

使用 pipeline API 和 NER 管道,我们可以非常方便地实现命名实体识别任务。pipeline API 简化了模型的使用过程,使得我们可以专注于处理和分析结果,而无需关注底层的实现细节。这大大提高了开发效率,并使得 Hugging Face transformers 库在实际应用中非常强大和实用。

二、pipeline API 支持的类型

Hugging Face 的 transformers 库中的 pipeline API 支持多种类型的自然语言处理任务。以下是一些常用的管道类型及其用途:

  1. 文本分类(Text Classification)

    • 用于对输入的文本进行分类,例如情感分析、垃圾邮件检测等。
    • 示例:pipeline("text-classification")
  2. 命名实体识别(Named Entity Recognition, NER)

    • 用于识别文本中的命名实体,例如人名、地名、组织名等。
    • 示例:pipeline("ner")
  3. 问答(Question Answering)

    • 用于从提供的段落中找到问题的答案。
    • 示例:pipeline("question-answering")
  4. 填空(Fill-Mask)

    • 用于预测被遮蔽的词语,适用于掩码语言模型(如 BERT)。
    • 示例:pipeline("fill-mask")
  5. 文本生成(Text Generation)

    • 用于生成文本,适用于生成型语言模型(如 GPT-3)。
    • 示例:pipeline("text-generation")
  6. 翻译(Translation)

    • 用于将文本从一种语言翻译为另一种语言。
    • 示例:pipeline("translation_en_to_fr")(从英语翻译到法语)
  7. 摘要生成(Summarization)

    • 用于生成文本的摘要。
    • 示例:pipeline("summarization")
  8. 文本相似性(Text Similarity)

    • 用于计算两个文本的相似度。
    • 示例:pipeline("text-similarity")
  9. 零样本分类(Zero-Shot Classification)

    • 用于在没有特定训练数据的情况下进行分类任务。
    • 示例:pipeline("zero-shot-classification")
  10. 对话(Conversational)

    • 用于实现对话代理或聊天机器人。
    • 示例:pipeline("conversational")
  11. 情感分析(Sentiment Analysis)

    • 用于分析文本的情感倾向。
    • 示例:pipeline("sentiment-analysis")
  12. 特征提取(Feature Extraction)

    • 用于提取文本的特征向量。
    • 示例:pipeline("feature-extraction")
  13. 音频分类(Audio Classification)

    • 用于对音频数据进行分类。
    • 示例:pipeline("audio-classification")
  14. 自动语音识别(Automatic Speech Recognition, ASR)

    • 用于将语音转换为文本。
    • 示例:pipeline("automatic-speech-recognition")
  15. 图像分类(Image Classification)

    • 用于对图像数据进行分类。
    • 示例:pipeline("image-classification")

每种管道类型都有其特定的用途和应用场景,使用 pipeline API 可以简化这些任务的实现过程。

三、 不同类型示例

下面是创建和使用几种不同类型的 pipeline 的示例:

from transformers import pipeline

# 文本分类
text_classifier = pipeline("text-classification")
print(text_classifier("I love using Hugging Face transformers!"))

# 命名实体识别
ner = pipeline("ner", model="dbmdz/bert-large-cased-finetuned-conll03-english")
print(ner("Hugging Face Inc. is a company based in New York City."))

# 问答
qa = pipeline("question-answering")
context = "Hugging Face Inc. is a company based in New York City."
question = "Where is Hugging Face based?"
print(qa(question=question, context=context))

# 填空
fill_mask = pipeline("fill-mask", model="bert-base-uncased")
print(fill_mask("Hugging Face is creating a [MASK] that the community uses to solve NLP tasks."))

# 文本生成
text_generator = pipeline("text-generation", model="gpt2")
print(text_generator("Once upon a time, "))

# 翻译
translator = pipeline("translation_en_to_fr")
print(translator("Hugging Face is a great company!"))

# 摘要生成
summarizer = pipeline("summarization")
print(summarizer("Hugging Face Inc. is a company based in New York City. Its headquarters are in DUMBO, therefore very close to the Manhattan Bridge."))

# 零样本分类
zero_shot_classifier = pipeline("zero-shot-classification")
print(zero_shot_classifier("Hugging Face is a company that develops NLP technologies.", candidate_labels=["technology", "health", "finance"]))

这些示例展示了如何使用 pipeline API 来处理各种 NLP 任务。通过 pipeline,我们可以快速地应用预训练模型,并将它们集成到我们的应用中。

四、默认管道类型

如果不传递第一个参数,pipeline 默认创建的管道类型是 “text-classification”。这意味着它会使用一个预训练的文本分类模型来处理输入文本。下面是一个示例:

from transformers import pipeline

# 不指定管道类型,默认是 text-classification
classifier = pipeline(model="distilbert-base-uncased-finetuned-sst-2-english")

# 输入文本进行分类
result = classifier("I love using Hugging Face transformers!")

# 打印结果
print(result)

在这个示例中,我们没有明确指定管道类型,pipeline 使用默认的 “text-classification” 类型来处理输入文本。结果将是一个包含分类标签和置信度分数的列表。

一般来说,明确指定管道类型是一个更好的做法,因为这可以确保你的代码更加清晰和可读。指定管道类型还可以避免模型与任务不匹配的情况发生。

五、常用类型text-generationquestion-answering

text-generation 适用于生成连续文本,例如写故事或完成未完成的句子。对于问答任务,特别是从给定上下文中提取答案,使用 question-answering 类型的管道更为合适。

1. 问答任务使用 question-answering 管道

question-answering 管道专门用于处理问答任务。它可以根据提供的上下文从中提取答案。这种管道使用的是预训练的问答模型(如 BERT、RoBERTa 等),这些模型已经在大规模的问答数据集(如 SQuAD)上进行了微调。

以下是一个使用 question-answering 管道的示例:

from transformers import pipeline

# 创建问答管道
qa_pipeline = pipeline("question-answering")

# 定义上下文和问题
context = "Hugging Face Inc. is a company based in New York City. Its headquarters are in DUMBO, therefore very close to the Manhattan Bridge."
question = "Where is Hugging Face based?"

# 使用管道回答问题
result = qa_pipeline(question=question, context=context)

# 打印结果
print(f"Answer: {result['answer']}, Score: {result['score']}")

在这个示例中,我们使用了 question-answering 管道,并提供了一个上下文和一个问题。管道会根据上下文提取出最有可能的答案,并返回答案和置信度分数。

2. 生成式问答使用 text-generation 管道

虽然 question-answering 管道适合从给定上下文中提取答案,但在某些情况下,你可能希望生成式地回答问题(例如,在没有特定上下文时回答开放性问题)。这种情况下可以使用 text-generation 管道:

from transformers import pipeline

# 创建文本生成管道
text_generator = pipeline("text-generation", model="gpt-2")

# 提出问题并生成回答
question = "What is Hugging Face?"
result = text_generator(question, max_length=50, num_return_sequences=1)

# 打印结果
print(result[0]['generated_text'])

在这个示例中,我们使用了 text-generation 管道来生成一个回答。需要注意的是,生成的文本可能不会像 question-answering 管道那样直接从上下文中提取答案,而是基于模型的语言生成能力来生成一个较长的回答。

3. 对比

  • question-answering 管道:适合从给定上下文中提取答案。
  • text-generation 管道:适合生成连续文本或在没有特定上下文的情况下生成回答。

六、和通用型模型交互

对于需要生成连续文本或回答开放性问题,使用 text-generation 类型的管道更为合适。通用型模型(如 GPT-3、GPT-4 等)非常擅长这类任务。它们可以基于输入的提示生成自然流畅的文本,并且能够处理广泛的主题。

1. 使用 text-generation 管道进行文本生成

下面是一个使用 Hugging Face 的 transformers 库中的 text-generation 管道来生成文本的示例:

from transformers import pipeline

# 创建文本生成管道,使用 GPT-2 模型
text_generator = pipeline("text-generation", model="gpt-2")

# 提示词
prompt = "Once upon a time, in a land far, far away,"

# 生成文本
result = text_generator(prompt, max_length=50, num_return_sequences=1)

# 打印生成的文本
print(result[0]['generated_text'])

在这个示例中,我们创建了一个文本生成管道,并使用 GPT-2 模型来生成文本。通过提供一个提示词,模型生成了一个延续的文本。

2. 调整生成参数

可以通过调整生成参数来控制生成的文本。例如,可以设置 max_length 来限制生成文本的长度,num_return_sequences 来生成多个候选文本,以及 temperaturetop_ktop_p 等参数来调整生成的多样性和随机性。

result = text_generator(
    prompt,
    max_length=100,         # 生成文本的最大长度
    num_return_sequences=3, # 生成的候选文本数量
    temperature=0.7,        # 温度参数控制文本的创造性
    top_k=50,               # top-k 采样
    top_p=0.95              # top-p (nucleus) 采样
)

# 打印生成的多个候选文本
for i, sequence in enumerate(result):
    print(f"Generated Text {i+1}: {sequence['generated_text']}\n")

3. 生成对话

如果你希望生成对话,text-generation 管道也可以处理这种任务。你可以提供一系列对话的上下文,模型将生成合适的回应。

# 对话上下文
dialogue_context = "Person A: How are you today?\nPerson B: I'm doing well, thank you. How about you?\nPerson A:"

# 生成对话
response = text_generator(dialogue_context, max_length=50, num_return_sequences=1)

# 打印生成的对话
print(response[0]['generated_text'])

4. 小结

使用 text-generation 管道非常适合以下任务:

  • 生成连续文本(如故事、文章等)。
  • 回答开放性问题。
  • 生成对话和聊天内容。
  • 根据提示词进行自由生成。

通过调整生成参数,你可以控制生成文本的长度、多样性和质量,从而更好地满足具体需求。Hugging Face 的 transformers 库使得使用预训练模型变得非常简单和高效,适合各种自然语言处理应用。

  • 36
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值