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 上更新

© . This site is unofficial and not affiliated with Hugging Face, Inc.