Transformers 文档

TAPEX

Hugging Face's logo
加入 Hugging Face 社区

并获得增强的文档体验

开始使用

TAPEX

PyTorch TensorFlow Flax

该模型仅处于维护模式,我们不接受任何更改其代码的新 PR。

如果在运行此模型时遇到任何问题,请重新安装支持此模型的最后一个版本:v4.30.0。您可以通过运行以下命令进行安装:`pip install -U transformers==4.30.0`。

概述

TAPEX模型由Qian Liu、Bei Chen、Jiaqi Guo、Morteza Ziyadi、Zeqi Lin、Weizhu Chen、Jian-Guang Lou在论文《TAPEX: Table Pre-training via Learning a Neural SQL Executor》中提出。TAPEX预训练一个BART模型来解决合成的SQL查询,之后可以微调该模型以回答与表格数据相关的自然语言问题,以及执行表格事实核查。

TAPEX已经在多个数据集上进行了微调:

  • SQA(微软的序列问答数据集)
  • WTQ(斯坦福大学的维基表格问答数据集)
  • WikiSQL(由Salesforce提供)
  • TabFact(由USCB NLP实验室提供)

论文摘要如下:

最近在语言模型预训练方面的进展,通过利用大规模非结构化文本数据取得了巨大成功。然而,由于缺乏大规模高质量的表格数据,将预训练应用于结构化表格数据仍然是一个挑战。在本文中,我们提出了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上进行了微调。
  • 句子和表格以`句子 + " " + 线性化表格`的形式提供给模型。线性化表格的格式如下:`col: col1 | col2 | col 3 row 1 : val1 | val2 | val3 row 2 : ...`。
  • TAPEX有其自己的分词器,可以轻松地为模型准备所有数据。可以向分词器传递Pandas DataFrame和字符串,它会自动创建`input_ids`和`attention_mask`(如下面的使用示例所示)。

使用方法:推理

下面,我们演示如何使用TAPEX进行表格问答。正如你所看到的,可以直接将TAPEX的权重加载到一个BART模型中。我们使用Auto API,它会根据模型中心上检查点的配置文件,自动为我们实例化适当的分词器(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在模型中心上有在TabFact上微调的检查点,这是表格事实核查的一个重要基准(准确率达到84%)。下面的代码示例再次利用了Auto 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>") — 用于掩盖值的标记。这是在使用掩码语言建模训练此模型时使用的标记。这是模型将尝试预测的标记。
  • add_prefix_space (bool, *可选*, 默认为 False) — 是否在输入前添加一个初始空格。这允许将开头的单词像其他任何单词一样对待。(BART分词器通过前面的空格来检测单词的开头)。
  • max_cell_length (int, *可选*, 默认为 15) — 线性化表格时每个单元格的最大字符数。如果超过此数目,将进行截断。

构建一个TAPEX分词器。基于字节级字节对编码(BPE)。

这个分词器可以用来将一个或多个表格扁平化,并与一个或多个相关的句子连接起来,供TAPEX模型使用。TAPEX分词器创建的格式如下:

句子 col: col1 | col2 | col 3 row 1 : val1 | val2 | val3 row 2 : …

该分词器支持单个表格+单个查询、单个表格和多个查询(此时表格将为每个查询复制一份)、单个查询和多个表格(此时查询将为每个表格复制一份),以及多个表格和多个查询。换句话说,你可以向分词器提供一批表格和问题,以便为模型准备它们。

分词本身基于BPE算法。它与BART、RoBERTa和GPT-2使用的分词器相同。

该分词器继承自PreTrainedTokenizer,其中包含了大部分主要方法。用户应参考该超类以获取有关这些方法的更多信息。

__call__

< >

( table: typing.Union[ForwardRef('pd.DataFrame'), list['pd.DataFrame']] = None query: typing.Union[str, list[str], NoneType] = None answer: typing.Union[str, list[str], NoneType] = None add_special_tokens: bool = True padding: typing.Union[bool, str, transformers.utils.generic.PaddingStrategy] = False truncation: typing.Union[bool, str, transformers.tokenization_utils_base.TruncationStrategy] = None max_length: typing.Optional[int] = None stride: int = 0 pad_to_multiple_of: typing.Optional[int] = None return_tensors: typing.Union[str, transformers.utils.generic.TensorType, NoneType] = None return_token_type_ids: typing.Optional[bool] = None return_attention_mask: typing.Optional[bool] = 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 or list[str], *可选*) — 与一个或多个待编码表格相关的句子或句子批次。请注意,句子的数量必须与表格的数量相匹配。
  • answer (str or list[str], *可选*) — 可选,对应问题的答案作为监督。
  • add_special_tokens (bool, *可选*, 默认为 True) — 是否在编码序列时添加特殊标记。这将使用底层的`PretrainedTokenizerBase.build_inputs_with_special_tokens`函数,该函数定义了哪些标记会自动添加到输入ID中。如果你想自动添加`bos`或`eos`标记,这会很有用。
  • padding (bool, str or PaddingStrategy, *可选*, 默认为 False) — 激活和控制填充。接受以下值:

    • `True` 或 `'longest'`:填充到批次中最长的序列(如果只提供单个序列则不填充)。
    • `'max_length'`:填充到由 `max_length` 参数指定的最大长度,或者如果未提供该参数,则填充到模型的最大可接受输入长度。
    • `False` 或 `'do_not_pad'`(默认):不填充(即可以输出具有不同长度序列的批次)。
  • truncation (bool, str or TruncationStrategy, *可选*, 默认为 False) — 激活和控制截断。接受以下值:

    • `True` 或 `'longest_first'`:截断到由 `max_length` 参数指定的最大长度,或者如果未提供该参数,则截断到模型的最大可接受输入长度。这将逐个标记进行截断,如果提供了一对序列(或一批序列对),则从最长的序列中移除一个标记。
    • `'only_first'`:截断到由 `max_length` 参数指定的最大长度,或者如果未提供该参数,则截断到模型的最大可接受输入长度。如果提供了一对序列(或一批序列对),这只会截断第一个序列。
    • `'only_second'`:截断到由 `max_length` 参数指定的最大长度,或者如果未提供该参数,则截断到模型的最大可接受输入长度。如果提供了一对序列(或一批序列对),这只会截断第二个序列。
    • `False` 或 `'do_not_truncate'`(默认):不截断(即可以输出序列长度大于模型最大可接受输入大小的批次)。
  • max_length (int, *可选*) — 控制由截断/填充参数之一使用的最大长度。

    如果未设置或设置为 `None`,并且截断/填充参数之一需要最大长度,则将使用预定义的模型最大长度。如果模型没有特定的最大输入长度(如XLNet),则将停用截断/填充到最大长度。

  • stride (int, optional, defaults to 0) — 如果与 max_length 一起设置为一个数字,当 return_overflowing_tokens=True 时,返回的溢出词元将包含一些来自被截断序列末尾的词元,以便在被截断和溢出的序列之间提供一些重叠。此参数的值定义了重叠词元的数量。
  • is_split_into_words (bool, optional, defaults to False) — 输入是否已经预分词(例如,拆分为单词)。如果设置为 True,分词器会假定输入已经被拆分为单词(例如,通过在空白处分割),然后对其进行分词。这对于 NER 或词元分类任务很有用。
  • pad_to_multiple_of (int, optional) — 如果设置,将序列填充到所提供值的倍数。需要激活 padding。这对于在计算能力 >= 7.5 (Volta) 的 NVIDIA 硬件上使用 Tensor Cores 特别有用。
  • padding_side (str, optional) — 模型应在其上应用填充的一侧。应在 [‘right’, ‘left’] 之间选择。默认值从同名的类属性中选取。
  • return_tensors (str or TensorType, optional) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值是:

    • 'tf':返回 TensorFlow tf.constant 对象。
    • 'pt':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 Numpy np.ndarray 对象。
  • add_special_tokens (bool, optional, defaults to True) — 是否使用与模型相关的特殊词元对序列进行编码。
  • padding (bool, str or PaddingStrategy, optional, defaults to False) — 激活和控制填充。接受以下值:

    • True'longest':填充到批次中最长的序列(如果只提供单个序列则不填充)。
    • 'max_length':填充到由参数 max_length 指定的最大长度,如果未提供该参数,则填充到模型可接受的最大输入长度。
    • False'do_not_pad' (默认值):不填充(即,可以输出具有不同长度序列的批次)。
  • truncation (bool, str, TapexTruncationStrategy or TruncationStrategy, — optional, defaults to False):

    激活和控制截断。接受以下值:

    • 'drop_rows_to_fit':截断到由参数 max_length 指定的最大长度,如果未提供该参数,则截断到模型可接受的最大输入长度。这将逐行截断,从表格中删除行。
    • True'longest_first':截断到由参数 max_length 指定的最大长度,如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一批序列对),这将逐个词元地截断,从最长的序列中移除一个词元。
    • 'only_first':截断到由参数 max_length 指定的最大长度,如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一批序列对),这将只截断第一个序列。
    • 'only_second':截断到由参数 max_length 指定的最大长度,如果未提供该参数,则截断到模型可接受的最大输入长度。如果提供了一对序列(或一批序列对),这将只截断第二个序列。
    • False'do_not_truncate' (默认值):不截断(即,可以输出序列长度大于模型最大可接受输入大小的批次)。
  • max_length (int, optional) — 控制由截断/填充参数之一使用的最大长度。如果未设置或设置为 None,当截断/填充参数之一需要最大长度时,将使用预定义的模型最大长度。如果模型没有特定的最大输入长度(如 XLNet),则截断/填充到最大长度的功能将被禁用。
  • stride (int, optional, defaults to 0) — 如果与 max_length 一起设置为一个数字,当 return_overflowing_tokens=True 时,返回的溢出词元将包含一些来自被截断序列末尾的词元,以便在被截断和溢出的序列之间提供一些重叠。此参数的值定义了重叠词元的数量。
  • pad_to_multiple_of (int, optional) — 如果设置,将序列填充到所提供值的倍数。这对于在计算能力 >= 7.5 (Volta) 的 NVIDIA 硬件上使用 Tensor Cores 特别有用。
  • return_tensors (str or TensorType, optional) — 如果设置,将返回张量而不是 Python 整数列表。可接受的值是:

    • 'tf':返回 TensorFlow tf.constant 对象。
    • 'pt':返回 PyTorch torch.Tensor 对象。
    • 'np':返回 Numpy np.ndarray 对象。

用于对一个或多个表格-序列对进行分词并为模型做准备的主要方法。

save_vocabulary

< >

( save_directory: str filename_prefix: typing.Optional[str] = None )

< > 在 GitHub 上更新