我有一个功能,
tokenize
:
def tokenize(text,max_len=MAX_LEN):
encoded = tokenizer.encode_plus(
text,
add_special_tokens=True,
max_length = max_len,
padding='max_length',
return_attention_mask=True
)
return encoded['input_ids'], encoded['attention_mask']
以及将其应用于一些训练数据的代码块:
df_train['input_ids'], df_train['attention_masks'] = df_train['text'].progress_apply(tokenize)
tokenize
、encoded['input_ids']
和encoded['attention_mask']
的返回都是列表,当在文本数据列(即df_train['text'].progress_apply(tokenize)
)上调用时,它会输出两个列表的元组,(encoded['input_ids'], encoded['attention_mask'])
尽管进行了更改,但以下错误仍然存在:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[13], line 1
----> 1 df_train['input_ids'], df_train['attention_masks'] = df_train['text'].progress_apply(tokenize)
2 df_val['input_ids'], df_val['attention_masks'] = df_val['text'].progress_apply(tokenize)
3 df_test['input_ids'], df_test['attention_masks'] = df_test['text'].progress_apply(tokenize)
ValueError: too many values to unpack (expected 2)
我的理解是这样的 - 由于某种原因,元组内部的列表正在被解包,而不是每个列表都被保存到
df_train['input_ids']
和 df_train['attention_masks']
,它试图在双重赋值中分配第一个列表的内容,并且因为超过两个而失败。
尝试了以下解决方案:将两个变量解压到 DataFrame 中的两列中,不幸的是,这会导致返回元组包含系列而不是列表,从而导致下游问题。
有没有办法让
df_train['input_ids']
和df_train['attention_masks']
由encoded['input_ids']
和encoded['attention_mask']
的输出以列表形式填充,以用于df_train['text'].progress_apply(tokenize)
传入的相关训练示例
使用临时列并在事后进行拆分,如“尝试使用 apply 和 lambda 调用两个数据帧列的函数”中的“太多值无法解压”似乎很笨拙,是否有更优雅的解决方案? 可能是.explode()方法?
编辑:为工作示例添加以下代码块
tokenizer = DistilBertTokenizer.from_pretrained("distilbert-base-uncased")
train_dict = {'text': ['text1', 'text2', 'text3']}
df_train = pd.DataFrame.from_dict(train_dict)
这会将元组中的第一个列表分配给“input_ids”列,将第二个列表分配给“attention_masks”列。 apply(pd.Series) 方法将元组拆分为单独的列。让我知道这是否有效?