【问题标题】:BERT model : "enable_padding() got an unexpected keyword argument 'max_length'"BERT 模型:“enable_padding() 有一个意外的关键字参数‘max_length’”
【发布时间】:2021-03-22 09:47:56
【问题描述】:

我正在尝试使用 Hugging Face 和 KERAS 实现 BERT 模型架构。我正在从 Kaggle (link) 那里学到这一点,并尝试理解它。当我对我的数据进行标记时,我遇到了一些问题并收到一条错误消息。错误信息是:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-20-888a40c0160b> in <module>
----> 1 x_train = fast_encode(train1.comment_text.astype(str), fast_tokenizer, maxlen=MAX_LEN)
      2 x_valid = fast_encode(valid.comment_text.astype(str), fast_tokenizer, maxlen=MAX_LEN)
      3 x_test = fast_encode(test.content.astype(str), fast_tokenizer, maxlen=MAX_LEN )
      4 y_train = train1.toxic.values
      5 y_valid = valid.toxic.values

<ipython-input-8-de591bf0a0b9> in fast_encode(texts, tokenizer, chunk_size, maxlen)
      4     """
      5     tokenizer.enable_truncation(max_length=maxlen)
----> 6     tokenizer.enable_padding(max_length=maxlen)
      7     all_ids = []
      8 

TypeError: enable_padding() got an unexpected keyword argument 'max_length'

代码是:

x_train = fast_encode(train1.comment_text.astype(str), fast_tokenizer, maxlen=192)
x_valid = fast_encode(valid.comment_text.astype(str), fast_tokenizer, maxlen=192)
x_test = fast_encode(test.content.astype(str), fast_tokenizer, maxlen=192 )
y_train = train1.toxic.values
y_valid = valid.toxic.values

这里有fast_encode函数:

def fast_encode(texts, tokenizer, chunk_size=256, maxlen=512):
    """
    Encoder for encoding the text into sequence of integers for BERT Input
    """
    tokenizer.enable_truncation(max_length=maxlen)
    tokenizer.enable_padding(max_length=maxlen)
    all_ids = []
    
    for i in tqdm(range(0, len(texts), chunk_size)):
        text_chunk = texts[i:i+chunk_size].tolist()
        encs = tokenizer.encode_batch(text_chunk)
        all_ids.extend([enc.ids for enc in encs])
    
    return np.array(all_ids)

我现在该怎么办?

【问题讨论】:

标签: nlp padding tokenize bert-language-model


【解决方案1】:

这里使用的分词器不是常规分词器,而是旧版 Huggingface tokenizer 库提供的快速分词器。

如果您希望使用笔记本中较旧版本的 huggingface transformers 创建快速分词器,您可以这样做:

from tokenizers import BertWordPieceTokenizer

# First load the real tokenizer
tokenizer = transformers.DistilBertTokenizer.from_pretrained('distilbert-base-multilingual-cased')
# Save the loaded tokenizer locally
tokenizer.save_pretrained('.')
# Reload it with the huggingface tokenizers library
fast_tokenizer = BertWordPieceTokenizer('vocab.txt', lowercase=False)
fast_tokenizer

但是,自从我编写了这段代码后,使用快速分词器的过程变得非常简单。如果您查看 Huggingface 的 Proprocessing data tutorial,您会注意到您只需要这样做:

tokenizer = AutoTokenizer.from_pretrained('bert-base-cased')

batch_sentences = [
    "Hello world",
    "Some slightly longer sentence to trigger padding"
]
batch = tokenizer(batch_sentences, padding=True, truncation=True, return_tensors="tf")

这是因为快速分词器(用 Rust 编写)只要可用就会自动使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-20
    • 2017-09-26
    • 1970-01-01
    • 2021-05-03
    • 2022-08-03
    • 2022-10-23
    • 2016-09-12
    • 2018-04-26
    相关资源
    最近更新 更多