readme: ---
  pipeline_tag: text-generation
  tags:
  - PyTorch
  - Transformers
  - gpt2
  
  license: unlicense
  
  language: ru
    
  widget:
  - text: "- Как тебя зовут? - Джульетта Мао #"
  - text: "- А живешь где? - В поясе астероидов #"
  ---
  
  
  ## Задача Incomplete Utterance Restoration
  
  Генеративная модель на основе [sberbank-ai/rugpt3large_based_on_gpt2](https://huggingface.co/sberbank-ai/rugpt3large_based_on_gpt2) для восстановления полного текста реплик в диалоге из контекста.
  
  Допустим, последние 2 строки диалога имеют вид:
  
  ```
  - Как тебя зовут?
  - Джульетта Мао
  ```
  
  Модель позволяет получить полный текст последней реплики, с раскрытыми анафорами, эллипсисами и т.д.:
  
  ```
  Меня зовут Джульетта Мао
  ```
  
  Раскрытая реплика позволяет использовать многие классические инструменты NLP для своей обработки,
  включая регулярные выражения, классификаторы интентов и т.д.
  
  Подробнее о том, какие ситуации и как обрабатываются моделью, смотрите в [конце страницы](#обрабатываемые-ситуации) и в [этом документе](https://huggingface.co/inkoziev/rugpt_interpreter/blob/main/%D0%92%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%BB%D0%BD%D1%8B%D1%85%20%D1%80%D0%B5%D0%BF%D0%BB%D0%B8%D0%BA%20%D0%B2%20%D0%B4%D0%B8%D0%B0%D0%BB%D0%BE%D0%B3%D0%B5.pdf).
  
  ## Пример использования
  
  Данная модель работает в прототипе [диалоговой системы](https://github.com/Koziev/chatbot). Она не требует для работы никакой "обвязки", пре- или постпроцессинга, помимо стандартных для моделей семейства GPT,
  поэтому использовать ее очень просто:
  
  ```
  import torch
  from transformers import AutoTokenizer, AutoModelForCausalLM
  
  
  device = "cuda" if torch.cuda.is_available() else "cpu"
  model_name = "inkoziev/rugpt_interpreter"
  tokenizer = AutoTokenizer.from_pretrained(model_name)
  tokenizer.add_special_tokens({'bos_token': '<s>', 'eos_token': '</s>', 'pad_token': '<pad>'})
  model = AutoModelForCausalLM.from_pretrained(model_name)
  model.to(device)
  model.eval()
  
  # На вход модели подаем последние 2-3 реплики диалога. Каждая реплика на отдельной строке, начинается с символа "-"
  # В конце добавляем символ "#"
  input_text = """<s>- Как тебя зовут?
  - Джульетта Мао #"""
  #input_text = """<s>- Что Предтечи забрали у Предшественников?
  #- Они узурпировали у них Мантию — защиту всего живого в галактике #"""
  
  encoded_prompt = tokenizer.encode(input_text, add_special_tokens=False, return_tensors="pt").to(device)
  
  output_sequences = model.generate(input_ids=encoded_prompt, max_length=100, num_return_sequences=1, pad_token_id=tokenizer.pad_token_id)
  
  text = tokenizer.decode(output_sequences[0].tolist(), clean_up_tokenization_spaces=True)[len(input_text)+1:]
  text = text[: text.find('</s>')]
  print(text)
  ```
  
  
  ## Формат входных данных
  
  На вход модели подается результат токенизации для текста, составленного из 2 или 3 последних реплик диалога.
  Первым токеном должен быть ```<s>```.
  Каждая реплика должна начинаться префиксом "- ".
  Реплики разделяются символом перевода строки.
  К последней реплике, которая будет раскрываться, добавляется подстрока " #".
  
  ```
  <s>- Как тебя зовут?
  - Джульетта Мао #
  ```
  
  
  ## Обрабатываемые ситуации
  
  Модель разрабатывается с прицелом на использование в [чатботе](https://github.com/Koziev/chatbot). Она поддерживает некоторые
  типичные ситуации в читчате, которые перечислены далее.
  
  В примерах после символа ⇒ идет эталонная раскрытая реплика, которую должна сгенерировать модель.
  
  [Эллипсисы](https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D0%B8%D0%BF%D1%81%D0%B8%D1%81):
  
  ```
  - Как же тебя зовут, а?
  - Меня – Стас, а тебя?  ⇒ Меня зовут Стас. Как тебя зовут?
  ```
  
  В редких случаях и главное слово в словосочетании может опускаться, модель попытается его восстановить:
  
  ```
  - Мама, купи мне собаку.
  - А ты будешь за ней ухаживать?
  - А ты мне здоровую купи.  ⇒ купи мне здоровую собаку
  ```
  
  [Анафора](https://ru.wikipedia.org/wiki/%D0%90%D0%BD%D0%B0%D1%84%D0%BE%D1%80%D0%B0_(%D0%BB%D0%B8%D0%BD%D0%B3%D0%B2%D0%B8%D1%81%D1%82%D0%B8%D0%BA%D0%B0)):
  
  ```
  - Ты собак любишь?
  - Не люблю я их  ⇒ я не люблю собак
  ```
  
  Иногда для раскрытия полной реплики требуется привлечение здравого смысла, модель для этого будет опираться
  на статистику претрейна:
  
  ```
  - Мне на голову упала коробка.
  - А что в ней было?  ⇒ что было в коробке|голове?
  ```
  
  [Гэппинг](https://ru.wikipedia.org/wiki/%D0%AD%D0%BB%D0%BB%D0%B8%D0%BF%D1%81%D0%B8%D1%81#%D0%93%D1%8D%D0%BF%D0%BF%D0%B8%D0%BD%D0%B3_(en:Gapping)):
  
  ```
  - Ты кошек любишь?
  - Их – нет  ⇒  я не люблю кошек
  ```
  
  Сложный гэппинг:
  
  ```
  - В 25 лет вы получаете пенсию?
  - Не я - отец.  ⇒  Я не получаю пенсию. Отец получает пенсию
  ```
  
  Восстановление необязательного местоименного подлежащего (см. [pro drop](https://en.wikipedia.org/wiki/Pro-drop_language)):
  
  ```
  - Согласна?
  - Да  ⇒ я согласна
  ```
  
  Модель пытается "читать между строк" и восстанавливать подразумеваемые части реплики:
  
  ```
  - Ты разве ещё не ел?
  - Тебя ждал  ⇒  я еще не ел. я ждал тебя.
  ```
  
  Отрицания в диалоге:
  
  ```
  - Я не прав?
  - Нет. (Да.) ⇒ ты не прав
  ```
  
  Интерпретация не 