Проблема с тензором семантической ролевой маркировки
У меня есть кадр данных в столбце df.sentence с длинными предложениями. Я пытаюсь извлечь arg0 с помощью маркировки семантической роли и сохранить arg0 в отдельном столбце.
Я продолжаю получать эту ошибку:
RuntimeError: The size of tensor a (1212) must match the size of tensor b (512) at non-singleton dimension 1
вот мой код:
!pip install allennlp==2.1.0 allennlp-models==2.1.0
from allennlp.predictors.predictor import Predictor
import allennlp_models.tagging
import pandas as pd, csv
def extract_arg0(sentence):
result = []
output = predictor.predict(sentence)
for verb in output['verbs']:
desc = verb['description']
arg0_start = desc.find('ARG0: ')
if arg0_start > -1:
arg0_end = arg0_start + len('ARG0: ')
arg0 = desc[arg0_end: desc.find(']')]
result.append((verb['verb'], arg0))
return result
# How to loop over all sentences
from tqdm.notebook import tqdm
tqdm.pandas()
df['Arg0'] = df.sentence.progress_apply(extract_arg0)
Я думаю, что мне следует создать здесь новую строку кода, которую можно было бы пропустить, вместо того, чтобы выдавать ошибку, и добавить df.arg0 'failed' ... и т. д. правильный ли мой подход? если да, то есть идеи, как я могу добавить эту строку в свой код? если нет, то любое предложение будет оценено.
Примечание. Я думаю, что наиболее подходящим подходом будет использование longformer. Я также проверил любой подход с помощью longformer, но не смог найти. Я также был бы признателен за любую рекомендацию по этому поводу.
Я также пробовал с
'!pip install allennlp==2.1.0 allennlp-models==2.9.0'
1 ответ
Вы не показываете, какой
predictor
вы загружаете, но я подозреваю, что модель может обрабатывать только 512 слов. Возможно, Longformer будет решением, но тогда вам придется сначала обучить SRL-модель с помощью Longformer.
Однако подумайте о том, чего вы на самом деле хотите достичь. Ваше примерное предложение на самом деле состоит из нескольких предложений с маркированным списком других предложений в конце. Модель AllenNLP SRL никогда не обучалась на таких входных данных и в любом случае не будет работать хорошо. Я предлагаю вам разделить ввод на предложения и вводить по одному предложению за раз. Это будет ближе к тому типу данных, которые модель видела во время обучения, поэтому вы получите лучшие результаты.