Как разрезать строку в зависимости от длины токенов

Когда я использую (с длинным test_text и коротким вопросом):

from transformers import BertTokenizer
import torch
from transformers import BertForQuestionAnswering

tokenizer = BertTokenizer.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')

model = BertForQuestionAnswering.from_pretrained('bert-large-uncased-whole-word-masking-finetuned-squad')

input_ids = tokenizer.encode(question, test_text)

print('Query has {:,} tokens.\n'.format(len(input_ids)))

sep_index = input_ids.index(tokenizer.sep_token_id)

num_seg_a = sep_index + 1

num_seg_b = len(input_ids) - num_seg_a

segment_ids = [0]*num_seg_a + [1]*num_seg_b

start_scores, end_scores = model(torch.tensor([input_ids]),
                                token_type_ids=torch.tensor([segment_ids]))

Я получаю ошибку при выводе

Длина последовательности индексов токенов превышает указанную максимальную длину последовательности для данной модели (3 ›512). Выполнение этой последовательности через модель приведет к ошибкам индексации.

Запрос содержит 1244 токена.

Как я могу разделить test_text на фрагменты максимальной длины, зная, что он не превышает 512 токенов? А затем задайте один и тот же вопрос для каждого фрагмента текста, выбирая лучший ответ из всех, а также дважды просматривая текст с разными точками фрагмента, на случай, если ответ будет обрезан во время фрагмента.


person Community    schedule 21.06.2020    source источник
comment
Предварительно обрабатывайте каждый вводимый текст как text = text[:512], если это помогает   -  person user12769533    schedule 22.06.2020
comment
Длина строки не соответствует количеству токенов линейно, функция, преобразующая число, - это сам токенизатор.   -  person    schedule 22.06.2020
comment
Я вижу, вы пробовали max_length здесь?   -  person user12769533    schedule 22.06.2020
comment
Я не уверен, что вы имеете в виду, но если вы выясните, что работает, дайте мне знать.   -  person    schedule 22.06.2020
comment
Проверьте сценарий run_squad. Он в основном делает то, что вы ищете.   -  person cronoik    schedule 22.06.2020
comment
@cronoik вы знаете, где в скрипте это делается? Другой вопрос, как запустить этот скрипт.   -  person    schedule 28.06.2020
comment
Здесь. Вы можете просто создать файл json со своими вопросами, который имеет тот же формат, что и формат отряда и выполнить сценарий с ним. В основном вам нужен подход со скользящим окном. Я разместил небольшой пример здесь.   -  person cronoik    schedule 28.06.2020
comment
@cronoik Хорошо, это ссылка на squad.py, а не на run_squad.py. Да, раздвижные окна - это то, что я хочу. Я не понимаю, как это применить здесь. В конце концов, я пытаюсь найти сценарий, в котором я могу поместить текст любой длины и вопрос и получить лучший ответ.   -  person    schedule 28.06.2020
comment
Сценарий, который вы ищете, - это уже упомянутый run_squad.py. Этот скрипт вызывает squad.py для подготовки данных.   -  person cronoik    schedule 29.06.2020
comment
@cronoik Хорошо, может быть, кто-то захочет вставить это в ответ, применив его к делу здесь для очков   -  person    schedule 30.06.2020
comment
@cronoik А есть ли ссылка, как создать файл json в таком формате? Я также не уверен, что вы имеете в виду под форматом отряда, слово «формат» на этой странице не используется. И в вашем примере это biobert.process_text (doc), который нужно заменить на tokenizer.encode (question, test_text) и biobert.eval_fwdprop_biobert (tokenized_text) на модель (torch.tensor ([input_ids]), token_type_ids = torch.tensor ([ segment_ids])) или что-то в этом роде?   -  person    schedule 30.06.2020
comment
Загрузите json-файл обучения / оценки из команды и откройте его в любом редакторе. Это говорит само за себя.   -  person cronoik    schedule 30.06.2020