1

我正在尝试为我的数据集创建标签,该数据集只是一个包含 20_000 行文本的 csv 文件。我使用了以下方法,但创建所有结果大约需要 15 分钟。期望的结果是

“这是一个非常糟糕的产品”,generated_label_with_confidence_score

import pandas as pd
import flair
from flair.models import TextClassifier
from flair.data import Sentence
import numba
import tqdm
import numpy as np

#@numba.jit
def predict_label(text):
  sentence = Sentence(text)
  classifier.predict(sentence)
  # print sentence with predicted labels
  return sentence.labels

for index, row in tqdm.tqdm(df_train.iterrows()):
    df_train.iloc[index, 1] = predict_label(df_train.iloc[index,0])
4

1 回答 1

1

您可以使用 df.apply 对列的每个条目应用函数,而不是使用 for 循环遍历数据框。阅读其官方文档。 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.apply.html

我已经测试了循环和 df.apply 所花费的时间,这是一个比较。

在下面的代码中,我将一个函数(返回字符串的长度)应用于具有 20,000 个条目的数据框的文本列。

def len_text(text):
    return len(text)

df_train = pd.DataFrame(['example sentence']*20000, columns = ['text'])

for index, row in tqdm.tqdm(df_train.iterrows()):
    df_train.iloc[index, 0] = len_text(df_train.iloc[index,0])

上面的代码执行大约需要 5 秒。让我们使用 df.apply 看看更好的版本,看看它需要多少时间。

df_train = pd.DataFrame(['example sentence']*20000, columns = ['text'])
st_time = time.time()

df_train['text'] = df_train['text'].apply(len_text)

en_time = time.time()
print(en_time - st_time)

上面单元格中带有 df.apply 的代码只用了 0.027 秒就可以在 20.000 个条目上运行。

因此,使用 df.apply 而不是循环遍历数据帧将时间缩短了 5 秒中的 4.973 秒。

于 2021-12-14T21:08:10.550 回答