Проблема с функцией range () при использовании с readline () или counter - читает и обрабатывает только последнюю строку в файлах - PullRequest
0 голосов
/ 29 апреля 2020

Имеют два простых текстовых файла по 20 строк. Текущий скрипт ниже читает только строку 20 в обоих, запускает основной процесс context_input без ошибок и затем завершается. Необходимо применить один и тот же процесс ко всем строкам 1-20.

Тот же результат, если использовать счетчик с системой импорта sys. Требование - читать строки, а не создавать список. readlines () приведет к ошибкам. Любые фрагменты кода для установки правильного l oop для достижения sh приветствуются.

# coding=utf-8

from src.model_use import TextGeneration
from src.utils import DEFAULT_DECODING_STRATEGY, MEDIUM
from src.flexible_models.flexible_GPT2 import FlexibleGPT2
from src.torch_loader import GenerationInput

from transformers import GPT2LMHeadModel, GPT2Tokenizer

def main():

    with open("data/test-P1-Multi.txt","r") as f:
         for i in range(20):
            P1 = f.readline()

    with open("data/test-P3-Multi.txt","r") as f:
         for i in range(20):
            P3 = f.readline()

    context_input = GenerationInput(P1=P1, P3=P3, size=MEDIUM)

    print("\n", "-"*100, "\n", "PREDICTION WITH CONTEXT WITHOUT SPECIAL TOKENS")
    model = GPT2LMHeadModel.from_pretrained('models/774M')
    tokenizer = GPT2Tokenizer.from_pretrained('models/774M')
    GPT2_model = FlexibleGPT2(model, tokenizer, DEFAULT_DECODING_STRATEGY)

    text_generator_with_context = TextGeneration(GPT2_model, use_context=True)

    predictions = text_generator_with_context(context_input, nb_samples=1)
    for i, prediction in enumerate(predictions):
        print('prediction n°', i, ': ', prediction)

    del model, tokenizer, GPT2_model

if __name__ == "__main__":
    main()

1 Ответ

0 голосов
/ 29 апреля 2020

Итак, ваше исправление будет в main путем реорганизации операторов with и if:

def main():
  with open("data/test-P1-Multi.txt","r") as f1, open("data/test-P3-Multi.txt","r") as f3:
    for i in range(20):
      P1 = f1.readline()
      P3 = f3.readline()

      context_input = GenerationInput(P1=P1, P3=P3, size=MEDIUM)

      print("\n", "-"*100, "\n", "PREDICTION WITH CONTEXT WITHOUT SPECIAL TOKENS")
      model = GPT2LMHeadModel.from_pretrained('models/774M')
      tokenizer = GPT2Tokenizer.from_pretrained('models/774M')
      GPT2_model = FlexibleGPT2(model, tokenizer, DEFAULT_DECODING_STRATEGY)

      text_generator_with_context = TextGeneration(GPT2_model, use_context=True)

      predictions = text_generator_with_context(context_input, nb_samples=1)
      for i, prediction in enumerate(predictions):
          print('prediction n°', i, ': ', prediction)

      del model, tokenizer, GPT2_model

Примечание: возможно, вы сможете извлечь некоторый код из l oop если он не меняется между строками, поэтому вам не нужно повторно инициализировать их снова и снова, но я не знаком с тем, что вы импортировали.

...