向 HuggingFace 数据集添加新列

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

在数据集中我有 5000000 行,我想向我的数据集添加一个名为“embeddings”的列。

dataset = dataset.add_column('embeddings', embeddings)

变量 embeddings 是一个大小为 (5000000, 512) 的 numpy memmap 数组。

但我收到此错误:

ArrowInvalidTraceback(最近一次调用最后一次) 在 ----> 1 个数据集 = dataset.add_column('embeddings', embeddings)

/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py 包装器(*args,**kwargs) 第486章 第487章 --> 488 out: Union["Dataset", "DatasetDict"] = func(self, *args, **kwargs) 489个数据集:List["Dataset"] = list(out.values()) if isinstance(out, dict) else [out] 第490章

/opt/conda/lib/python3.8/site-packages/datasets/fingerprint.py 包装器(*args,**kwargs) 第404章 405 --> 406 out = func(self, *args, **kwargs) 407 第408章

/opt/conda/lib/python3.8/site-packages/datasets/arrow_dataset.py in add_column(self, name, columns, new_fingerprint) 第3346章 第3347章 ->第3348章column_table = InMemoryTable.from_pydict({name:column}) 第3349章 第3350章 from_pydict(cls, *args, **kwargs) 中的

/opt/conda/lib/python3.8/site-packages/datasets/table.py 第367章 第368章 --> 369 返回 cls(pa.Table.from_pydict(*args, **kwargs)) 370 第371章

pyarrow.lib.Table.from_pydict() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi

 pyarrow.lib._from_pydict() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/table.pxi

pyarrow.lib.asarray() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi

pyarrow.lib.array() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi

pyarrow.lib._ndarray_to_array() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/array.pxi

pyarrow.lib.check_status() 中的/opt/conda/lib/python3.8/site-packages/pyarrow/error.pxi

ArrowInvalid:仅处理一维数组

由于嵌入数组不适合 RAM,我该如何解决(可能以有效的方式)?

Dataset

你会得到一个数据集

python numpy word-embedding pyarrow huggingface-datasets
4个回答
5
投票

这就是我解决问题的方法。令人遗憾的是,我们已经 2023 年了,这个问题仍然存在,但幸运的是,这对我有用。

向数据集添加新列

1
投票
Dataset({ features: ['id', 'context', 'question', 'answer0', 'answer1', 'answer2', 'answer3', 'label', 'new_column'], num_rows: 25262 })

然后,你可以像这样调用该函数:

def add_new_column(df, col_name, col_values):
    # Define a function to add the new column
    def create_column(updated_df):
        updated_df[col_name] = col_values  # Assign specific values
        return updated_df

    # Apply the function to each item in the dataset
    df = df.map(create_column)

    return df

注意:
请确保新列(A.K.A)的大小

len(新值)

等于现有行数的大小。

这里的问题是您正在尝试添加一列,但您传递的数据是一个 2d numpy 数组。
import datasets as ds dataset = ds.Dataset.from_dict({"column_1": ["value1", "value2"],}) new_values = [value3, value4] updated_dataset = add_new_column(dataset, "column_2", [str(val) for val in new_values])

(用于表示数据集的库)仅支持 1d numpy 数组。


0
投票

arrow


由于嵌入数组不适合 RAM,我该如何解决(可能以有效的方式)?

我认为内存问题没有解决办法。 Huggingface 数据集由箭头表支持,该表必须适合内存。

对于从镶木地板文件加载的数据集,此代码有效

for i, column in enumerate(embeddings.T): ds = ds.add_column('embeddings_' + str(i), column)


0
投票

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