Transformers 框架 Pipeline 任务详解(六):填充蒙版(fill-mask)

在自然语言处理(NLP)领域,填空或填补句子中的缺失部分是一项重要的任务。它不仅考验了模型对语言的理解能力,还展示了其生成合理且语义连贯的文本的能力。Hugging Face 的 Transformers 框架通过其 Pipeline API 提供了强大的fill-mask功能,允许开发者和研究者轻松构建并应用这种填空技术。本文将详细介绍 Transformers 框架中的fill-mask任务,涵盖任务描述、应用场景、配置指南以及实战案例。

Hugging Face任务介绍

1. 任务简介

fill-mask任务旨在根据上下文预测句子中被遮蔽(mask)的词汇。例如:

  • 文学创作:当给出“[MASK] is the capital of France.”时,系统应当能够预测出“Paris”。
  • 语言学习:对于学习新语言的学生来说,可以用来练习语法结构和词汇选择,如“Je [MASK] à l'école tous les jours.”(我每天都去学校)。

为了完成这一任务,通常需要以下步骤:

  1. 输入解析:识别句子中被标记为[MASK]的位置。
  2. 上下文理解:分析句子的上下文,包括前后词语的关系、句法结构等。
  3. 词汇预测:基于对上下文的理解,从词汇表中选出最合适的词来填补空白。

根据 Hugging Face 官网的数据,当前已有13,576 个预训练模型支持fill-mask任务,这些模型已经在大量的文本数据上进行了微调,以更好地适应特定的任务需求。

Hugging Face模型列表

2. 应用场景

填充蒙版任务的应用非常广泛,以下是几个典型的应用实例:

  • 机器翻译:帮助改进翻译质量,确保译文更加流畅自然。
  • 文本补全:用于自动完成功能,提高用户输入效率,如在搜索引擎或聊天机器人中。
  • 教育工具:作为语言学习辅助工具,增强学生对单词和短语的记忆。
  • 内容推荐:根据用户的阅读历史,预测他们可能感兴趣的主题词,从而提供个性化的内容推荐。
  • 智能写作助手:协助作家克服创作瓶颈,提供灵感启发,比如续写故事或完善段落。

3. 任务配置

在 Transformers 框架中,fill-mask任务的配置同样直观易懂。下面是配置示例代码片段(位于./transformers/pipelines/__init__.py文件):

SUPPORTED_TASKS = {# 其他省略......"fill-mask": {"impl": FillMaskPipeline,"tf": (TFAutoModelForMaskedLM,) if is_tf_available() else (),"pt": (AutoModelForMaskedLM,) if is_torch_available() else (),"default": {"model": {"pt": ("distilbert/distilroberta-base", "fb53ab8"),"tf": ("distilbert/distilroberta-base", "fb53ab8"),}},"type": "text",},# 其他省略......
}

默认情况下,Transformers 框架会使用distilroberta-base作为fill-mask任务的预训练模型。这个模型是基于 BERT 架构,在大规模英语语料库上训练而成,特别适合英文的填空任务。

4. 填充蒙版实战

确保您已经安装了 Transformers 库和其他必要的依赖包:

pip install transformers torch

方法一:自动下载模型

如果您的网络环境允许,可以直接从 Hugging Face 下载模型并创建 Pipeline 任务。如下老牛同学使用 Hugging Face 镜像网站自动下载模型:

import os# 设置代理
os.environ["HF_ENDPOINT"] = "https://hf-mirror.com"# 设置本地缓存目录
cache_dir = os.path.join('D:', os.path.sep, 'ModelSpace', 'Cache')
os.environ['HF_HOME'] = cache_dirfrom transformers import pipeline# 创建Pipeline任务
nlp = pipeline("fill-mask", model="google-bert/bert-base-chinese")# 执行填充蒙版任务
if __name__ == "__main__":result = nlp("生活的真谛是[MASK]。")print(result)

输出结果直接给出了模型认为的最佳答案文本,在这个例子中:输入是生活的真谛是[MASK]。,给出了多个输出:

[{'score': 0.34068214893341064,'token': 5401,'token_str': '美','sequence': '生 活 的 真 谛 是 美 。'},{'score': 0.22919395565986633,'token': 4263,'token_str': '爱','sequence': '生 活 的 真 谛 是 爱 。'},{'score': 0.03254768252372742,'token': 727,'token_str': '乐','sequence': '生 活 的 真 谛 是 乐 。'},{'score': 0.022956570610404015,'token': 782,'token_str': '人','sequence': '生 活 的 真 谛 是 人 。'},{'score': 0.01942041702568531,'token': 8038,'token_str': ':','sequence': '生 活 的 真 谛 是 : 。'}
]

对于输出结果对象的元素,详细说明如下:

  1. sequence:完整填充后的句子。
  2. score:模型对该填充选项的信心程度,值越大表示越有信心。
  3. token:填充词汇对应的 token ID,在词汇表中的位置。
  4. token_str:填充词汇内容。

方法二:自主下载模型

如果您希望使用本地模型文件,可以按照以下步骤操作:

from transformers import AutoTokenizer, AutoModelForMaskedLM, pipeline
import os# 下载模型目录
model_dir = '/models/fill_mask'# 加载分词器和模型
tokenizer = AutoTokenizer.from_pretrained(model_dir, local_files_only=True)
model = AutoModelForMaskedLM.from_pretrained(model_dir, torch_dtype="auto", device_map="auto", local_files_only=True)# 创建Pipeline任务
nlp = pipeline("fill-mask", tokenizer=tokenizer, model=model)# 后续用法与自动下载相同

5. WebUI 界面

为了让fill-mask Pipeline 任务更易于使用或演示,我们可以使用 Gradio 创建一个直观的 WebUI 界面。以下是创建界面的代码示例:

import sys# 直接复用Pipeline实例
sys.path.append("./")
pipeline = __import__("06-fill-mask")import gradio as gr# 定义填充蒙版函数
def fill_mask(sentence):result = pipeline.nlp(sentence)return "\n".join([f"可能的答案: {r['sequence']} (得分: {r['score']:.2f})" for r in result])# 创建Gradio界面
with gr.Blocks() as demo:gr.Markdown("# 填充蒙版系统")gr.Markdown("这是一个基于Transformers框架的填充蒙版工具。您可以输入一句含有[MASK]标记的句子,点击“提交”按钮后,系统将尝试预测最适合填入该位置的词汇。")with gr.Row():input_sentence = gr.Textbox(placeholder="请输入含有[MASK]标记的句子...", label="句子")with gr.Row():submit_button = gr.Button("提交")with gr.Row():output_answer = gr.Label(label="可能的答案")# 设置按钮点击事件,触发填充蒙版函数submit_button.click(fill_mask, inputs=[input_sentence], outputs=output_answer)# 启动Gradio应用
if __name__ == "__main__":demo.launch()

运行上述代码,我们可以看到 URL 信息:

* Running on local URL:  http://127.0.0.1:7860To create a public link, set `share=True` in `launch()`.

通过浏览器打开地址,就可以通过可视化的方式进行填充蒙版实验了。

WebUI界面

我们可以用如下句子样例来测试 Fill Mask:

  • 输入:“生活的真谛是[MASK]。”
  • 答案有:“美”、“爱”、“乐”、“人”等

如果想要分享给更多人,可以在 launch() 函数中设置 share=True 参数,Gradio 将生成一个公开链接供他人访问。

6. 总结

本文全面介绍了 Transformers 框架中的fill-mask任务,从基础概念到实际应用,再到如何构建和部署一个交互式的填充蒙版系统。无论是在机器翻译、文本补全还是教育工具等领域,Transformers 框架都能为我们提供强有力的支持,助力我们快速实现高效的填充蒙版解决方案。

老牛同学将持续为大家带来更多有关 Pipeline 任务的文章(共28篇)。如果您有任何疑问或建议,请随时在评论区留言交流!

Transformers 框架 Pipeline 任务


Transformers 框架:

01.包和对象加载中的设计巧思与实用技巧

02.AutoModel 初始化及 Qwen2.5 模型加载全流程

03.Qwen2.5 大模型的 AutoTokenizer 技术细节

04.Qwen2.5/GPT 分词流程与 BPE 分词算法技术细节

05.嵌入(Embedding)机制和 Word2Vec 实战

Pipeline NLP 任务:

零·概述 丨 01.文本转音频 丨 02.文本分类 丨 03.词元分类和命名实体识别 丨 04.问答 丨 05.表格问答

往期推荐文章:

Bolt.new 用一句话快速构建全栈应用:本地部署与应用实战(Ollama/Qwen2.5 等)

基于 Qwen2.5-Coder 模型和 CrewAI 多智能体框架,实现智能编程系统的实战教程

vLLM CPU 和 GPU 模式署和推理 Qwen2 等大语言模型详细教程

基于 Qwen2/Lllama3 等大模型,部署团队私有化 RAG 知识库系统的详细教程(Docker+AnythingLLM)

使用 Llama3/Qwen2 等开源大模型,部署团队私有化 Code Copilot 和使用教程

基于 Qwen2 大模型微调技术详细教程(LoRA 参数高效微调和 SwanLab 可视化监控)

ChatTTS 长音频合成和本地部署 2 种方式,让你的“儿童绘本”发声的实战教程

微信公众号:老牛同学

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/858824.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里发布多模态推理模型 QVQ-72B,视觉、语言能力双提升;OpenAI 正在研发人形机器人丨 RTE 开发者日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 新闻 」、「有态度的 观点 」、「有意思的 数据 」、「有思考的 文章 」、「有看点的 会议 」,但内容仅代表编辑…

python多进程,通过内存共享来通信,使用进程锁来防止数据问题

代码:import multiprocessing import time 使用锁和multiprocessing.Value,multiprocessing.Array,multiprocessing.Manager().listdef worker1(shared_number1, lock):for _ in range(10):with lock:shared_number1.value += 1def worker2(shared_array1, lock):for i in…

Jenkins入门使用

Jenkins入门使用 1先安装jdk才能运行jenkins yum install -y java-1.8.0-openjdk.x86_642 安装jenkins,运行,进行端口绑定,启动jenkins docker search jenkins docker pull jenkins/jenkins docker run -d -u root -p 8080:8080 -p 50000:50000 -v /var/jenkins_home:/var/j…

Java 泛型详细解析

本文将带你详细解析 Java 泛型,了解泛型的原理、常见的使用方法以及泛型的局限性,让你对泛型有更深入的了解。泛型的定义 泛型类的定义 下面定义了一个泛型类 Pair,它有一个泛型参数 T。 public class Pair<T> {private T start;private T end; }实际使用的时候就可以…

javafx-请求篇

OkHttpClient 基本使用步骤如下构建客户端对象OkHttpClient 构建请求Request 生成Call对象 Call发起请求(同步/异步)import java.io.IOException; import okhttp3.Call; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.Req…

javafx-一个小demo

懒得讲了,直接看代码吧 pox.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://m…

一个小demo

懒得讲了,直接看代码吧 pox.xml<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://m…

一个 Bug JDK 居然改了十年?

你敢相信么一个简单的Bug,JDK 居然花了十年时间才修改完成。赶快来看看到底是个什么样的 Bug?问题现象 今天偶然看到了一个 JDK 的 Bug,给大家分享一下。 假设现在有如下的代码: List<String> list = new ArrayList<>(); list.add("1"); Object[] ar…

崩溃列表数据库查询(可供参考)

首先去https://weikezhijia.feishu.cn/sheets/BIvxsKZhHhzpC6tDyoLcPE50n4d?sheet=9ikXjx 看库中导出指标,然后可以查到是rum_error表,然后去ors_rum_test服务器,ors_rum_test数据库,rum_error表去查询,结合点击全部按钮后查看F12 然后查看preView里的字段,结合着去查rum…

流量分析练习

flag明文 题目:key.pcapng查找flag或者flag{,我们在下图查找到所需要的flag本类题目特点:能够在字节流中直接查找到带有flag的字符串,不存在加解密或转换等,属于明文形式 2.flag编码 题目:64da5a4a1e024d198dfa307299965b6d.pcapng本题考到十六进制编码 将flag转成十六进…

哪里有 class 告诉我?

说明 本文中的 JVM 参数和代码在 JDK 8 版本生效。 哪里有用户类? 用户类是由开发者和第三方定义的类,它是由应用程序类加载器加载的。 Java 程序可以通过CLASSPATH 环境变量,JVM 启动参数 -cp 或者 -classpath 指定用户需要加载的类的路径。这两个配置的优先级从低到高,后…

python多进程之间通讯,消息队列Queue

代码:from multiprocessing import Process, Queuedef producer(q):myinfo = "包子"q.put(myinfo)print(f"生产了{myinfo}")myinfo = "饺子"q.put(myinfo)print(f"生产了{myinfo}\n") 生产了4个,消费5个def consumer(q):print(f&q…