max_length не исправляет модель ответов на вопросы

#python #machine-learning #text #bert-language-model #maxlength

#python #машинное обучение #текст #bert-language-model #maxlength

Вопрос:

Мой вопрос: как запустить мою модель «ответов на вопросы», учитывая большой (> 512b) .txt-файл?

Контекст: я создаю модель ответов на вопросы с помощью модели встраивания слова BERT из Google. Модель работает нормально, когда я импортирую текстовый файл с несколькими предложениями, но когда текстовый файл превышает ограничение в 512b слов в качестве контекста для изучения моделью, модель не будет отвечать на мои вопросы.

Моя попытка решить проблему: я установил значение max_length в части кодирования, но это, похоже, не решает проблему (мой код попытки приведен ниже).

 from transformers import AutoTokenizer, AutoModelForQuestionAnswering
import torch

max_seq_length = 512


tokenizer = AutoTokenizer.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")
model = AutoModelForQuestionAnswering.from_pretrained("henryk/bert-base-multilingual-cased-finetuned-dutch-squad2")

f = open("test.txt", "r")

text = str(f.read())

questions = [
    "Wat is de hoofdstad van Nederland?",
    "Van welk automerk is een Cayenne?",
    "In welk jaar is pindakaas geproduceerd?",
]

for question in questions:
    inputs = tokenizer.encode_plus(question, 
                                   text, 
                                   add_special_tokens=True, 
                                   max_length=max_seq_length,
                                   truncation=True,
                                   return_tensors="pt")
    input_ids = inputs["input_ids"].tolist()[0]

    text_tokens = tokenizer.convert_ids_to_tokens(input_ids)
    answer_start_scores, answer_end_scores = model(**inputs, return_dict=False)

    answer_start = torch.argmax(
        answer_start_scores
    )  # Get the most likely beginning of answer with the argmax of the score
    answer_end = torch.argmax(answer_end_scores)   1  # Get the most likely end of answer with the argmax of the score

    answer = tokenizer.convert_tokens_to_string(tokenizer.convert_ids_to_tokens(input_ids[answer_start:answer_end]))

    print(f"Question: {question}")
    print(f"Answer: {answer}n")
 

Код-результат:

 > Question: Wat is de hoofdstad van Nederland?
> Answer: [CLS]
>
> Question: Van welk automerk is een Cayenne?
> Answer: [CLS]
>
> Question: In welk jaar is pindakaas geproduceerd?
> Answer: [CLS]
 

Как можно видеть, модель возвращает только [CLS]-token, который происходит в части кодирования токенизатора.

РЕДАКТИРОВАТЬ: я понял, что способ решить эту проблему — выполнить итерацию по текстовому файлу, чтобы модель могла найти ответ с помощью итерации.

Комментарии:

1. нет модуля с именем transformers. Я не вижу encode_plus в документах для того, что я предполагаю для используемой вами библиотеки: huggingface.co/transformers/_modules/transformers/models/auto /…

2. Вы можете найти его здесь: huggingface.co/transformers/main_classes/tokenizer.html @KennyOstrom

Ответ №1:

РЕДАКТИРОВАТЬ: я понял, что способ решить эту проблему — выполнить итерацию по файлу .txt, чтобы модель могла найти ответ с помощью итерации. Причина, по которой модель отвечает с помощью [CLS], заключается в том, что она не смогла найти ответ в контексте 512b, она должна более подробно изучить контекст.

Создав цикл, подобный этому:

 with open("sample.txt", "r") as a_file:
  for line in a_file:
    text = line.strip()
    print(text)
 

можно применить повторенный текст в encode_plus .