Transformers 框架 Pipeline 任务详解(五):表格问答(table-question-answering)

在自然语言处理领域,表格问答是一项能够从结构化数据中提取信息的关键技术。它结合了自然语言理解和表格数据处理的能力,使得用户可以通过自然语言提问来获取表格中的特定信息。Hugging Face 的 Transformers 框架通过其 Pipeline API 提供了强大的table-question-answering功能,允许开发者和研究者轻松构建高效的表格问答系统。本文将详细介绍 Transformers 框架中的table-question-answering任务,涵盖任务描述、应用场景、配置指南以及实战案例。

Hugging Face任务介绍

1. 任务简介

table-question-answering任务旨在根据用户提供的问题,从给定的表格数据中找出最准确的答案。例如:

  • 财务分析:询问“2023 年第四季度的净利润是多少?”,系统应当能够从财务报表中找到对应数值。
  • 体育统计:当问到“谁是 2022 年世界杯的最佳射手?”时,系统应能回答出具体球员的名字。

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

  1. 问题解析:理解问题的意图,并确定所需的数据字段。
  2. 表格分析:识别表格中的行、列以及可能存在的关联关系。
  3. 答案生成:基于对表格的理解,生成或抽取符合问题要求的答案。

根据 Hugging Face 官网的数据,当前已有133table-question-answering模型,这些模型已经在大量的表格数据上进行了微调,以更好地适应特定的任务需求。

Hugging Face模型列表

2. 应用场景

表格问答系统广泛应用于各个行业,以下是几个典型的应用实例:

  • 商业智能:企业可以利用表格问答工具快速查询销售数据、市场趋势等关键指标,辅助决策制定。
  • 教育辅导:教师可以使用该技术帮助学生理解复杂的数据集,如历史事件的时间线、科学实验结果等。
  • 金融分析:投资者和分析师可以借助表格问答系统分析股票行情、公司财报等信息,支持投资决策。
  • 医疗健康:研究人员和医护人员可以利用表格问答来查找临床试验结果、药物效果等医学数据。
  • 政府服务:政府部门可以通过表格问答提供公共服务信息,如人口统计数据、公共支出明细等。

3. 任务配置

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

SUPPORTED_TASKS = {# 其他省略......"table-question-answering": {"impl": TableQuestionAnsweringPipeline,"pt": (AutoModelForTableQuestionAnswering,) if is_torch_available() else (),"tf": (TFAutoModelForTableQuestionAnswering,) if is_tf_available() else (),"default": {"model": {"pt": ("google/tapas-base-finetuned-wtq", "e3dde19"),"tf": ("google/tapas-base-finetuned-wtq", "e3dde19"),},},"type": "text",},# 其他省略......
}

默认情况下,Transformers 框架会使用tapas-base-finetuned-wtq作为table-question-answering任务的预训练模型。这个模型是在 WebTables 数据集上进行过微调的 TAPAS 版本,特别适用于英文的表格问答任务。

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("table-question-answering", model="google/tapas-base-finetuned-wtq")# 执行表格问答任务
if __name__ == "__main__":# 表格数据table = [{"Year": "2020", "Quarter": "Q1", "Revenue": "500M", "Profit": "100M"},{"Year": "2020", "Quarter": "Q2", "Revenue": "550M", "Profit": "110M"},{"Year": "2020", "Quarter": "Q3", "Revenue": "600M", "Profit": "120M"},{"Year": "2020", "Quarter": "Q4", "Revenue": "650M", "Profit": "130M"},# 更多行...]# 执行任务result = nlp(table=table, query="What was the profit in Q4 of 2020?")print(result)# 输出:{'answer': '130M', 'coordinates': [(3, 3)], 'cells': ['130M'], 'aggregator': 'NONE'}

输出结果如下:

{'answer': '130M', 'coordinates': [(3, 3)], 'cells': ['130M'], 'aggregator': 'NONE'}

输出结果直接给出了模型认为的答案文本,在这个例子中,答案是“130M”。

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

  1. answer:模型给出的答案文本,在这个例子中是“130M”,表示 2020 年第四季度的利润。
  2. coordinates:是一个列表,其中每个元素是一个元组,代表了表格中与答案相关的单元格的位置。元组的第一个值是行索引,第二个值是列索引,都是从 0 开始计数。在这个例子中,(3, 3)意味着答案位于表格的第 4 行(因为索引从 0 开始,所以 3 代表的是第四行)和第 4 列。
  3. cells:列出所有参与构建答案的单元格内容。在这个例子中,只有单个单元格的内容“130M”被用作答案,因此列表中只有一个元素。
  4. aggregator:指明了是否以及如何对多个单元格或数值进行了聚合操作以生成答案。可能的值包括但不限于"NONE""SUM""AVERAGE""COUNT"等。在这个例子中,"NONE"表示没有执行任何聚合操作,答案直接来自单个单元格的内容。

方法二:自主下载模型

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

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

5. WebUI 界面

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

import sys# 直接复用Pipeline实例
sys.path.append("./")
pipeline = __import__("05-table-question-answering")import gradio as gr# 定义表格问答函数
def answer_table_question(query, table):# 将字符串形式的表格转换为列表字典table_list = [dict(zip(table.split('\n')[0].split(','), row.split(','))) for row in table.split('\n')[1:]]result = pipeline.nlp(query=query, table=table_list)return f"答案: {result['answer']}"# 创建Gradio界面
with gr.Blocks() as demo:gr.Markdown("# 表格问答系统")gr.Markdown("这是一个基于Transformers框架的表格问答工具。您可以输入一个问题和一段CSV格式的表格文本,点击“提交”按钮后,系统将尝试从中找到答案。")with gr.Row():input_table = gr.Textbox(placeholder="请输入表格数据(CSV格式)...", label="表格")with gr.Row():input_query = gr.Textbox(placeholder="请输入您的问题...", label="问题")with gr.Row():submit_button = gr.Button("提交")with gr.Row():output_answer = gr.Label(label="答案")# 设置按钮点击事件,触发表格问答函数submit_button.click(answer_table_question, inputs=[input_query, input_table], 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界面

我们可以用如下表格样例数据来测试 Table QA:

Year,Quarter,Revenue,Profit
2020,Q1,500M,100M
2020,Q2,550M,110M
2020,Q3,600M,120M
2020,Q4,650M,130M
2021,Q1,700M,140M
2021,Q2,750M,150M
2021,Q3,800M,160M
2021,Q4,850M,170M

问题:Which quarter had the highest profit in 2021?

预期答案:Q4 (因为 2021 年第四季度的利润最高,为 170M)

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

6. 总结

本文全面介绍了 Transformers 框架中的table-question-answering任务,从基础概念到实际应用,再到如何构建和部署一个交互式的表格问答系统。无论是在商业智能、教育辅导还是金融分析等领域,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.问答

往期推荐文章:

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/856885.html

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

相关文章

WPF实现加载的动态效果

思路: 1.创建一个画布,长宽100*100;<Canvas Width="100" Height="100">2.画布上创建一个圆,直径25,位于正上方中间,底色浅灰;<Style TargetType="Ellipse"><Setter Property="Width" Value="25"/>…

Derby 数据库介绍(2)--使用

本文主要介绍 Derby 的基本使用(简介可参考:Derby 数据库介绍(1)--简介),文中所使用到的软件版本:Java 1.8.0_341、Derby 10.14.2.0。 1、嵌入模式 直接使用 JDBC 连接数据库,可创建和启动数据库。 1.1、内存数据库@Test public void embeddedMemory() throws SQLException …

视野修炼第114期 | 2024JS现状调查结果

① 2024 JavaScript 现状调查结果 ② Text Fragment - 直接链接网页文本 ③ my-github-2024 - 2024 GitHub 报告生成 ④ 优秀的单页网站案例 ⑤ Gradienty - 一套CSS工具集 ⑥ 并发和并行的区别 ⑦ AI 音效生成欢迎来到第 114 期的【视野修炼 - 技术周刊】,下面是本期的精选内…

线程池工作原理

线程池综述 它的主要特点为:线程复用;控制最大并发数;管理线程。 使用线程池的好处有 第一:降低资源消耗。通过重复利用已创建的线程,降低线程创建和销毁带来的资源消耗 第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建好就可以立即执行。 第三:提高线程的…

探讨:为什么大公司一定要使用微服务?

探讨:为什么大公司一定要使用微服务? | Id | Title | DateAdded | SourceUrl | PostType | Body | BlogId | Description | DateUpdated | IsMarkdown | EntryName | CreatedTime | IsActive | AutoDesc | AccessPermission | | -------------| -------------| -------------…

实验6 模板类、文件I\O和异常处理

实验任务4#pragma once #include <iostream> #include <stdexcept>using namespace std;template <typename T> class Vector { public:Vector(int n, int value=0);Vector(Vector<T> &v);~Vector();int get_size() const;T& at(int i);T&…

千峰教育--Netty 再学习 1 网络模型概述(BIO、NIO、AIO)、BIO 逻辑实现及其局限性(单线程服务端、多线程服务端、线程池服务端)

课程介绍 1 网络模型概述 2 Channel 详解 3 Buffer 详解 4 Selector 详解 5 NIO综合案例-聊天室 6 AIO概念及实现 1 网络编程IO 模型介绍 1.1 BLockingIO Blocking IO也称BIO,及同步阻塞IO。Java 的 io 包基于流模型实现,提供了FIle,FileInputStream,FileOutputStream等输…

ZBlog升级之后出现后台登录错误

升级 1.7.3.3260 之后出现后台登录错误( 提示非法访问,验证码不显示,验证码报错 ) 这是因为 1.7.3.3260 增加了对后台登录的 2 个保护功能,因为主题插件的兼容性原因或其它原因造成功能不正常,可以在 option.php 里关掉 CSRF 保护功能或是验证码功能,或是 2 个都关闭 使…

织梦源码后台更新系统后,网页错乱的解决方法

覆盖模板文件下载之前使用的模板文件。 覆盖 templets/default 目录下的文件。 如果使用的是其他模板目录,确保更新不会影响到这些目录。扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、Javascript等。承接:企业仿站…

解决Dede织梦上传图片失败 ERROR:Copy Uploadfile Error! 提示

错误显示:拷贝(复制)上传文件出错! 原因:上传的文件损坏。 上传目录无写权限。解决方法:尝试上传其它图片。 给uploads写入权限:Linux服务器:通过FTP设置 uploads 目录为777权限,子文件夹选择继承。 Windows 2003服务器:右键文件夹属性 -> 安全 -> 添加账户 -&…

织梦CMS:Error:check Snooping out of bounds 的解决办法

Error:check Snooping out of bounds @ D:wwwrootgdhgcwwwrootkjempletsdefaultarticle_article.htm原因:路径中包含了大写字母,使用 strpos 操作时区分大小写。解决方法:打开 include/dedetag.class.php 文件。 找到第325行,修改为:if (stripos($path, $this->clean(D…

dedecms修改网站内容,如何在DedeCMS中编辑文章和页面

在DedeCMS中编辑文章和页面的步骤如下:登录管理后台:使用管理员账号登录DedeCMS管理后台。 进入内容管理:导航至“内容管理”或“文章管理”模块。 选择内容:找到需要修改的文章或页面。 编辑内容:点击“编辑”按钮,进行必要的修改。 保存更改:确认无误后,保存修改。扫…