尝试将元组输出解包到两个数据帧列时出错

问题描述 投票:0回答:1

我有一个功能,

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)


pandas dataframe nlp
1个回答
0
投票

这会将元组中的第一个列表分配给“input_ids”列,将第二个列表分配给“attention_masks”列。 apply(pd.Series) 方法将元组拆分为单独的列。让我知道这是否有效?

© www.soinside.com 2019 - 2024. All rights reserved.