TAPEX
此模型仅处于维护模式,我们不接受任何更改其代码的新 PR。
如果您在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.30.0。您可以通过运行以下命令来执行此操作:pip install -U transformers==4.30.0
。
概述
TAPEX 模型在 TAPEX:通过学习神经 SQL 执行器进行表格预训练 中提出,作者为 Qian Liu、Bei Chen、Jiaqi Guo、Morteza Ziyadi、Zeqi Lin、Weizhu Chen 和 Jian-Guang Lou。TAPEX 预训练了一个 BART 模型来解决合成 SQL 查询,之后可以对其进行微调以回答与表格数据相关的自然语言问题,以及执行表格事实核查。
TAPEX 已在多个数据集上进行了微调
论文摘要如下
最近,语言模型预训练取得了巨大的成功,这是通过利用大规模非结构化文本数据实现的。然而,由于缺乏大规模高质量的表格数据,将预训练应用于结构化表格数据仍然是一个挑战。在本文中,我们提出了 TAPEX,以表明表格预训练可以通过学习一个神经 SQL 执行器在合成语料库上实现,该语料库是通过自动合成可执行的 SQL 查询及其执行输出获得的。TAPEX 通过引导语言模型模仿合成语料库上多样化、大规模和高质量的 SQL 执行器来解决数据稀缺性挑战。我们在四个基准数据集上评估了 TAPEX。实验结果表明,TAPEX 在很大程度上优于以前的表格预训练方法,并在所有这些数据集上取得了新的最先进的结果。这包括将弱监督 WikiSQL 的含义准确率提高到 89.5%(+2.3%)、WikiTableQuestions 的含义准确率提高到 57.5%(+4.8%)、SQA 的含义准确率提高到 74.5%(+3.5%)以及 TabFact 的准确率提高到 84.2%(+3.2%)。据我们所知,这是第一项利用合成可执行程序进行表格预训练并在各种下游任务上取得新的最先进结果的工作。
使用技巧
- TAPEX 是一个生成式(seq2seq)模型。可以将 TAPEX 的权重直接插入 BART 模型。
- TAPEX 在 Hub 上有检查点,这些检查点要么仅进行预训练,要么在 WTQ、SQA、WikiSQL 和 TabFact 上进行微调。
- 句子 + 表格以以下格式呈现给模型:
sentence + " " + linearized table
。线性化表格具有以下格式:col: col1 | col2 | col 3 row 1 : val1 | val2 | val3 row 2 : ...
。 - TAPEX 有自己的分词器,可以轻松地为模型准备所有数据。可以将 Pandas DataFrame 和字符串传递给分词器,它会自动创建
input_ids
和attention_mask
(如下面的用法示例所示)。
用法:推理
下面,我们说明如何将 TAPEX 用于表格问答。可以看到,可以将 TAPEX 的权重直接插入 BART 模型。我们使用自动 API,它将根据 Hub 上检查点的配置文件自动为我们实例化适当的分词器(TapexTokenizer)和模型(BartForConditionalGeneration)。
>>> from transformers import AutoTokenizer, AutoModelForSeq2SeqLM
>>> import pandas as pd
>>> tokenizer = AutoTokenizer.from_pretrained("microsoft/tapex-large-finetuned-wtq")
>>> model = AutoModelForSeq2SeqLM.from_pretrained("microsoft/tapex-large-finetuned-wtq")
>>> # prepare table + question
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> question = "how many movies does Leonardo Di Caprio have?"
>>> encoding = tokenizer(table, question, return_tensors="pt")
>>> # let the model generate an answer autoregressively
>>> outputs = model.generate(**encoding)
>>> # decode back to text
>>> predicted_answer = tokenizer.batch_decode(outputs, skip_special_tokens=True)[0]
>>> print(predicted_answer)
53
请注意,TapexTokenizer 也支持批量推理。因此,可以提供一批不同的表格/问题,或一批单个表格和多个问题,或一批单个查询和多个表格。让我们说明一下
>>> # prepare table + question
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> questions = [
... "how many movies does Leonardo Di Caprio have?",
... "which actor has 69 movies?",
... "what's the first name of the actor who has 87 movies?",
... ]
>>> encoding = tokenizer(table, questions, padding=True, return_tensors="pt")
>>> # let the model generate an answer autoregressively
>>> outputs = model.generate(**encoding)
>>> # decode back to text
>>> tokenizer.batch_decode(outputs, skip_special_tokens=True)
[' 53', ' george clooney', ' brad pitt']
如果想要进行表格验证(即确定给定句子是否由表格内容支持或反驳的任务),可以实例化一个BartForSequenceClassification模型。TAPEX 在 Hub 上有在 TabFact 上微调的检查点,TabFact 是表格事实核查的一个重要基准(准确率达到 84%)。下面的代码示例再次利用了自动 API。
>>> from transformers import AutoTokenizer, AutoModelForSequenceClassification
>>> tokenizer = AutoTokenizer.from_pretrained("microsoft/tapex-large-finetuned-tabfact")
>>> model = AutoModelForSequenceClassification.from_pretrained("microsoft/tapex-large-finetuned-tabfact")
>>> # prepare table + sentence
>>> data = {"Actors": ["Brad Pitt", "Leonardo Di Caprio", "George Clooney"], "Number of movies": ["87", "53", "69"]}
>>> table = pd.DataFrame.from_dict(data)
>>> sentence = "George Clooney has 30 movies"
>>> encoding = tokenizer(table, sentence, return_tensors="pt")
>>> # forward pass
>>> outputs = model(**encoding)
>>> # print prediction
>>> predicted_class_idx = outputs.logits[0].argmax(dim=0).item()
>>> print(model.config.id2label[predicted_class_idx])
Refused
TAPEX 架构与 BART 相同,除了分词。有关配置类及其参数的信息,请参阅BART 文档。TAPEX 特定的分词器在下面有说明。
TapexTokenizer
class transformers.TapexTokenizer
< 源代码 >( vocab_file merges_file do_lower_case = True errors = 'replace' bos_token = '<s>' eos_token = '</s>' sep_token = '</s>' cls_token = '<s>' unk_token = '<unk>' pad_token = '<pad>' mask_token = '<mask>' add_prefix_space = False max_cell_length = 15 **kwargs )
参数
- vocab_file (
str
) — 词汇表文件路径。 - merges_file (
str
) — 合并文件路径。 - do_lower_case (
bool
, 可选, 默认为True
) — 分词时是否将输入转换为小写。 - errors (
str
, 可选, 默认为"replace"
) — 解码字节到 UTF-8 时遵循的范式。更多信息请参见 bytes.decode。 - bos_token (
str
, 可选, 默认为"<s>"
) — 预训练期间使用的序列开始标记。可用作序列分类标记。在使用特殊标记构建序列时,这不是用于序列开始的标记。使用的标记是
cls_token
。 - eos_token (
str
, 可选, 默认为"</s>"
) — 序列结束标记。在使用特殊标记构建序列时,这不是用于序列结束的标记。使用的标记是
sep_token
。 - sep_token (
str
, 可选, 默认为"</s>"
) — 分隔符标记,用于从多个序列构建序列时,例如序列分类的两个序列或问答的文本和问题。它也用作使用特殊标记构建的序列的最后一个标记。 - cls_token (
str
, 可选, 默认为"<s>"
) — 分类标记,用于执行序列分类(整个序列的分类,而不是每个标记的分类)。当使用特殊标记构建时,它是序列的第一个标记。 - unk_token (
str
, 可选, 默认为"<unk>"
) — 未知标记。不在词汇表中的标记无法转换为 ID,而是设置为此标记。 - pad_token (
str
, 可选, 默认为"<pad>"
) — 用于填充的标记,例如在批处理不同长度的序列时。 - mask_token (
str
, 可选, 默认为"<mask>"
) — 用于掩盖值的标记。这是使用掩码语言建模训练此模型时使用的标记。这是模型将尝试预测的标记。
构建一个 TAPEX 分词器。基于字节级字节对编码 (BPE)。
此分词器可用于展平一个或多个表格,并将它们与一个或多个相关句子连接起来,以供 TAPEX 模型使用。TAPEX 分词器创建的格式如下:
句子 列:col1 | col2 | col 3 行 1:val1 | val2 | val3 行 2:…
该分词器支持单个表格 + 单个查询、单个表格和多个查询(在这种情况下,表格将为每个查询复制)、单个查询和多个表格(在这种情况下,查询将为每个表格复制)以及多个表格和查询。换句话说,例如,您可以向分词器提供一批表格 + 问题,以便为模型准备它们。
分词本身基于 BPE 算法。它与 BART、RoBERTa 和 GPT-2 使用的算法相同。
此分词器继承自 PreTrainedTokenizer,其中包含大多数主要方法。用户应参考此超类以获取有关这些方法的更多信息。
__call__
< 源代码 > ( table: Union = None query: Union = None answer: Union = None add_special_tokens: bool = True padding: Union = False truncation: Union = None max_length: Optional = None stride: int = 0 pad_to_multiple_of: Optional = None return_tensors: Union = None return_token_type_ids: Optional = None return_attention_mask: Optional = None return_overflowing_tokens: bool = False return_special_tokens_mask: bool = False return_offsets_mapping: bool = False return_length: bool = False verbose: bool = True **kwargs )
参数
- table (
pd.DataFrame
,List[pd.DataFrame]
) — 包含表格数据的表格。 - query (
str
或List[str]
, 可选) — 与一个或多个表格相关的句子或句子批次,用于编码。请注意,句子的数量必须与表格的数量匹配。 - answer (
str
或List[str]
, 可选) — 可选地,作为监督的对应问题的答案。 - add_special_tokens (
bool
, 可选, 默认为True
) — 是否在编码序列时添加特殊标记。这将使用底层的PretrainedTokenizerBase.build_inputs_with_special_tokens
函数,该函数定义了哪些标记会自动添加到输入 ID 中。如果您想自动添加bos
或eos
标记,这很有用。 - padding (
bool
,str
或 PaddingStrategy, 可选, 默认为False
) — 激活并控制填充。接受以下值:True
或'longest'
:填充到批次中最长的序列(如果仅提供单个序列,则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或者如果未提供该参数,则填充到模型可接受的最大输入长度。False
或'do_not_pad'
(默认):不填充(即,可以输出具有不同长度序列的批次)。
- 截断 (
bool
,str
或 TruncationStrategy, 可选,默认为False
) — 激活并控制截断。接受以下值:True
或'longest_first'
:截断到参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一系列对),则此操作将逐个标记进行截断,从对中最长的序列中删除一个标记。'only_first'
:截断到参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一系列对),则此操作将仅截断对中的第一个序列。'only_second'
:截断到参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一系列对),则此操作将仅截断对中的第二个序列。False
或'do_not_truncate'
(默认):不截断(即,可以输出序列长度大于模型最大可接受输入大小的批次)。
- 最大长度 (
int
, 可选) — 通过截断/填充参数之一控制要使用的最大长度。如果未设置或设置为
None
,则如果截断/填充参数之一需要最大长度,则将使用预定义的模型最大长度。如果模型没有特定的最大输入长度(如 XLNet),则将停用截断/填充到最大长度。 - 步幅 (
int
, 可选,默认为 0) — 如果与max_length
一起设置为一个数字,则当return_overflowing_tokens=True
时返回的溢出标记将包含截断序列末尾的一些标记,以在截断序列和溢出序列之间提供一些重叠。此参数的值定义了重叠标记的数量。 - 是否已分词 (
bool
, 可选,默认为False
) — 输入是否已预先分词(例如,拆分为单词)。如果设置为True
,则分词器假设输入已拆分为单词(例如,通过在空格处拆分),它将对这些单词进行分词。这对于 NER 或标记分类很有用。 - 填充至的倍数 (
int
, 可选) — 如果设置,将序列填充到提供的值的倍数。需要激活padding
。这对于在具有计算能力>= 7.5
(Volta)的 NVIDIA 硬件上启用 Tensor Core 特别有用。 - 填充侧 (
str
, 可选) — 模型应在其上应用填充的一侧。应在 [‘right’, ‘left’] 中选择。默认值从同名的类属性中获取。 - 返回张量 (
str
或 TensorType, 可选) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:'tf'
:返回 TensorFlowtf.constant
对象。'pt'
:返回 PyTorchtorch.Tensor
对象。'np'
:返回 NumPynp.ndarray
对象。
- 添加特殊标记 (
bool
, 可选,默认为True
) — 是否使用与其模型相关的特殊标记对序列进行编码。 - padding (
bool
,str
或 PaddingStrategy, 可选, 默认为False
) — 激活并控制填充。接受以下值:True
或'longest'
:填充到批次中最长的序列(如果仅提供单个序列,则不填充)。'max_length'
:填充到使用参数max_length
指定的最大长度,或者如果未提供该参数,则填充到模型可接受的最大输入长度。False
或'do_not_pad'
(默认):不填充(即,可以输出具有不同长度序列的批次)。
- 截断 (
bool
,str
,TapexTruncationStrategy
或 TruncationStrategy, — 可选,默认为False
):激活并控制截断。接受以下值:
'drop_rows_to_fit'
: 将长度截断到使用参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。这将逐行截断,从表格中删除行。True
或'longest_first'
: 将长度截断到使用参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。这将逐个标记截断,如果提供了一对序列(或一系列对),则从对中最长的序列中删除一个标记。'only_first'
: 将长度截断到使用参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一系列对),这将只截断对中的第一个序列。'only_second'
: 将长度截断到使用参数max_length
指定的最大长度,或者如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一系列对),这将只截断对中的第二个序列。False
或'do_not_truncate'
(默认): 不截断(即,可以输出序列长度大于模型最大可接受输入大小的批次)。
- 最大长度 (
int
, 可选) — 通过截断/填充参数之一控制要使用的最大长度。如果未设置或设置为None
,则如果截断/填充参数之一需要最大长度,则将使用预定义的模型最大长度。如果模型没有特定的最大输入长度(如 XLNet),则将停用截断/填充到最大长度。 - 步幅 (
int
, 可选,默认为 0) — 如果与max_length
一起设置为一个数字,则当return_overflowing_tokens=True
时返回的溢出标记将包含截断序列末尾的一些标记,以在截断序列和溢出序列之间提供一些重叠。此参数的值定义了重叠标记的数量。 - 填充到指定倍数 (
int
, 可选) — 如果设置,则将序列填充到提供值的倍数。这对于在具有计算能力>= 7.5
(Volta) 的 NVIDIA 硬件上启用张量核心特别有用。 - 返回张量 (
str
或 TensorType, 可选) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值为:'tf'
:返回 TensorFlowtf.constant
对象。'pt'
:返回 PyTorchtorch.Tensor
对象。'np'
:返回 NumPynp.ndarray
对象。
将一个或多个表-序列对标记化并为模型准备的主要方法。