在大数据集上使用 Huggingface 零镜头文本分类
Using Huggingface zero-shot text classification with large data set
我正在尝试使用 Huggingface 零样本文本分类,使用 12 个标签和从 CSV 文件读取的大数据集(57K 句子),如下所示:
csv_file = tf.keras.utils.get_file('batch.csv', filename)
df = pd.read_csv(csv_file)
classifier = pipeline('zero-shot-classification')
results = classifier(df['description'].to_list(), labels, multi_class=True)
由于 python 内存不足,这会不断崩溃。
我尝试创建一个数据集,如下所示:
dataset = load_dataset('csv', data_files=filename)
但不确定如何将它与 Huggingface 的分类器一起使用。批处理分类的最佳方式是什么?
我最终想为它提供超过 100 万个句子进行分类。
问题不在于您的数据集太大而无法放入 RAM,而在于您正试图一次通过一个大型转换器模型传递整个数据。 Hugging Face 的流水线目前不做任何 mini-batching 的幕后工作,所以将序列一个接一个地传递或以小的子组形式传递:
results = [classifier(desc, labels, multi_class=True for desc in df['description']]
如果您使用的是 GPU,您将通过在每次传递中使用适合 GPU 内存的尽可能多的序列来获得最佳速度,因此您可以尝试以下操作:
batch_size = 4 # see how big you can make this number before OOM
classifier = pipeline('zero-shot-classification', device=0) # to utilize GPU
sequences = df['description'].to_list()
results = []
for i in range(0, len(sequences), batch_size):
results += classifier(sequences[i:i+batch_size], labels, multi_class=True)
看看在出现 OOM 错误之前你可以 batch_size
有多大。
零样本分类模型一次性接受 1 个输入,再加上它是一个非常重的模型 运行,因此建议 运行 仅在 GPU 上,
很简单的方法就是将文本转换成列表
df = pd.read_csv(csv_file)
classifier = pipeline('zero-shot-classification')
filter_keys = ['labels']
output = []
for index, row in df.iterrows():
d = {}
sequence = row['description']
result = classifier(sequence, labels, multi_class=True)
temp = list(map(result.get, filter_keys))
d['description'] = row['description']
d['label'] = temp[0][0]
output.append(d)
#convert the list of dictionary into pandas DataFrame
new = pd.DataFrame(output)
new.head()
我正在尝试使用 Huggingface 零样本文本分类,使用 12 个标签和从 CSV 文件读取的大数据集(57K 句子),如下所示:
csv_file = tf.keras.utils.get_file('batch.csv', filename)
df = pd.read_csv(csv_file)
classifier = pipeline('zero-shot-classification')
results = classifier(df['description'].to_list(), labels, multi_class=True)
由于 python 内存不足,这会不断崩溃。 我尝试创建一个数据集,如下所示:
dataset = load_dataset('csv', data_files=filename)
但不确定如何将它与 Huggingface 的分类器一起使用。批处理分类的最佳方式是什么?
我最终想为它提供超过 100 万个句子进行分类。
问题不在于您的数据集太大而无法放入 RAM,而在于您正试图一次通过一个大型转换器模型传递整个数据。 Hugging Face 的流水线目前不做任何 mini-batching 的幕后工作,所以将序列一个接一个地传递或以小的子组形式传递:
results = [classifier(desc, labels, multi_class=True for desc in df['description']]
如果您使用的是 GPU,您将通过在每次传递中使用适合 GPU 内存的尽可能多的序列来获得最佳速度,因此您可以尝试以下操作:
batch_size = 4 # see how big you can make this number before OOM
classifier = pipeline('zero-shot-classification', device=0) # to utilize GPU
sequences = df['description'].to_list()
results = []
for i in range(0, len(sequences), batch_size):
results += classifier(sequences[i:i+batch_size], labels, multi_class=True)
看看在出现 OOM 错误之前你可以 batch_size
有多大。
零样本分类模型一次性接受 1 个输入,再加上它是一个非常重的模型 运行,因此建议 运行 仅在 GPU 上,
很简单的方法就是将文本转换成列表
df = pd.read_csv(csv_file)
classifier = pipeline('zero-shot-classification')
filter_keys = ['labels']
output = []
for index, row in df.iterrows():
d = {}
sequence = row['description']
result = classifier(sequence, labels, multi_class=True)
temp = list(map(result.get, filter_keys))
d['description'] = row['description']
d['label'] = temp[0][0]
output.append(d)
#convert the list of dictionary into pandas DataFrame
new = pd.DataFrame(output)
new.head()