Применение предварительно обученного facebook / bart-large-cnn для суммирования текста в python

Я нахожусь в ситуации, когда я работаю с трансформерами huggingface и получил некоторое представление об этом. Я работаю с моделью facebook / bart-large-cnn для выполнения суммирования текста для моего проекта, и на данный момент я использую следующий код для выполнения некоторых тестов:

text = """
Justin Timberlake and Jessica Biel, welcome to parenthood. 
The celebrity couple announced the arrival of their son, Silas Randall Timberlake, in 
statements to People."""

from transformers import pipeline
smr_bart = pipeline(task="summarization", model="facebook/bart-large-cnn")
smbart = smr_bart(text, max_length=150)
print(smbart[0]['summary_text'])

Небольшой кусок кода на самом деле дает мне очень хорошее резюме текста. Но я спрашиваю, как я могу применить ту же предварительно обученную модель поверх моего столбца фрейма данных. Мой фрейм данных выглядит так:

ID        Lang          Text
1         EN            some long text here...
2         EN            some long text here...
3         EN            some long text here...

.... и так далее для 50 000 строк

Теперь я хочу применить предварительно обученную модель к тексту столбца, чтобы сгенерировать из него новый столбец df ['summary'], и результирующий фрейм данных должен выглядеть так:

ID        Lang         Text                              Summary
1         EN            some long text here...           Text summary goes here...
2         EN            some long text here...           Text summary goes here...
3         EN            some long text here...           Text summary goes here...

Как я могу этого добиться? Любая помощь приветствуется.


person Django0602    schedule 25.02.2021    source источник
comment
Разве вы не спрашиваете, как применить функцию к каждому значению в серии?   -  person Arya McCarthy    schedule 25.02.2021


Ответы (1)


Вы всегда можете использовать фрейм данных apply функция:

df = pd.DataFrame([('EN',text)]*10, columns=['Lang','Text'])

df['summary'] = df.apply(lambda x: smr_bart(x['Text'], max_length=150)[0]['summary_text'] , axis=1)

df.head(3)

Выход:

    Lang    Text                                                summary
0   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...
1   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...
2   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...

Это немного неэффективно, потому что конвейер будет вызываться для каждой строки (время выполнения 2 минуты 16 секунд). Поэтому я рекомендую преобразовать столбец Text в список и передать его непосредственно в конвейер (время выполнения 41 секунда):

df = pd.DataFrame([('EN',text)]*10, columns=['Lang','Text'])

df['summary'] = [x['summary_text'] for x in smr_bart(df['Text'].tolist(), max_length=150)]

df.head(3)

Выход:

    Lang    Text                                                summary
0   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...
1   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...
2   EN      \nJustin Timberlake and Jessica Biel, welcome ...   The celebrity couple announced the arrival of ...
person cronoik    schedule 25.02.2021