File size: 10,096 Bytes
294bf18
468030d
 
294bf18
468030d
 
 
 
a31c007
 
294bf18
82f47f0
 
5af1322
82f47f0
 
 
 
513d6cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3126589
 
82f47f0
5af1322
 
513d6cb
5af1322
 
 
 
 
 
68864bd
 
e3f5def
68864bd
5af1322
d66a56e
5af1322
 
 
 
 
e3f5def
 
 
 
5af1322
68864bd
5af1322
e3f5def
5af1322
 
 
3126589
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
---
tags: Text generation

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 для обработки, включая регулярные выражения, классификаторы
интентов и т.д.

Подробнее о том, какие ситуации обрабатываются моделью, см. в конце страницы.


## Пример использования


```
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)
```

## Обрабатываемые ситуации

Модель разрабатывается с прицелом на использование в [чатботе](https://github.com/Koziev/chatbot). Она поддерживает некоторые
типичные ситуации в читчате, которые перечислены далее.

В примерах после символа ⇒ идет эталонная раскрытая реплика.

Эллипсисы:

```
- Как же тебя зовут, а?
- Меня – Стас, а тебя?  ⇒ Меня зовут Стас. Как тебя зовут?
```

В редких случаях и главное слово в словосочетании может опускаться:

```
- Мама, купи мне собаку.
- А ты будешь за ней ухаживать?
- А ты мне здоровую купи.  ⇒ купи мне здоровую собаку
```

Анафора:

```
- Ты собак любишь?
- Не люблю я их  ⇒ я не люблю собак
```

Иногда требуется привлечение здравого смысла:

```
- Мне на голову упала коробка.
- А что в ней было?  ⇒ что было в коробке|голове?
```

Гэппинг:

```
- Ты кошек любишь?
- Их – нет  ⇒  я не люблю кошек
```

Сложный гэппинг:

```
- В 25 лет вы получаете пенсию?
- Не я - отец.  ⇒  Я не получаю пенсию. Отец получает пенсию
```

Типичные паттерны: например, восстановление подлежащего (см. pro drop)

```
- Согласна?
- Да  ⇒ я согласна
```

Между строк:

```
- Ты разве ещё не ел?
- Тебя ждал  ⇒  я еще не ел. я ждал тебя.
```

Отрицания в диалоге:

```
- Я не прав?
- Нет. (Да.) ⇒ ты не прав
```

Интерпретация не сводится к копированию слов из контекста:

```
- Как прошли выходные?
- В Простоквашино ездила...  ⇒  я на выходных ездила в Простоквашино
```

Все вышесказанное может быть в разных сочетаниях одновременно:

```
- Где твой кот?
- Жена к ветеринару повезла.  ⇒ жена повезла моего кота к ветеринару
- Заболел?  ⇒  твой кот заболел?
```

Сложные предложения:

```
- Я сварила суп, иди ешь.
- Из чего?  ⇒  из чего ты сварила суп?
```

Замена подлежащего:

```
- Как себя чувствует твой попугай?
- Бедняга умер...   ⇒   мой попугай умер
```

Иногда от реплики остается только наречие:

```
- Девушка, а Вы животных любите?
- Очень!  ⇒ я очень люблю животных
```

Форма сказуемого иногда может меняться из соображений согласованности:

```
- Рабинович, как думаете, что будет делать правительство, если завтра население разом бросит курить?
- Таки, поднимут акцизы на алкоголь...  ⇒ правительно поднимет акцизы на алкоголь, если завтра население разом бросит курить
```

Во всех случаях модель не выдает никакой информации, откуда она взяла подстановку
для замены или заполнения в выходном тексте. На выходе получается просто текст реплики
в том виде, как ее мог бы сказать человек, безо всяких дополнительных отсылок и маркеров:

```
- У тебя брат есть?
- Да, есть
- Где он работает?  ⇒ Где работает твой брат?
```

В данном примере модель никак не сообщит нам, откуда она взяла подстановку “твой брат” для местоимения “он”.
Это сильно упрощает ручную разметку обучающего корпуса и не особо мешает диалоговой системе.

Во многих случаях модель приводит порядок слов к более-менее каноническому. Точнее говоря, она старается
выдать текст с таким порядком слов, который обычно используют носители языка в данном контексте диалога.
Если русскоговорящие предпочитают OVS вместо формального SVO, то модель будет выдавать именно OVS:

```
У тебя штрафы были?
Нет, их никогда не было ⇒ у меня никогда не было штрафов
```

Модель обычно вставляет личные местоимения, даже если форма глагола позволяет обойтись без них:

```
Жару любишь?
Ненавижу ее  ⇒ я ненавижу жару
```

Сложносочиненные ответы разбиваются на отдельные клаузы, чтобы downstream pipeline мог обработать их последовательно:

```
Тебя как зовут?
Кортана, а тебя как?  ⇒  Меня зовут Кортана. Как тебя зовут?
```

В качестве контекста можно подавать последние 2 или 3 реплики. Более длинные отношения весьма редки, чтобы ради них усложнять датасет. Кроме того, во многих случаях достаточно применить модель рекурсивно - подать вместо исходных реплик диалога результат их раскрытия моделью:

```
Где живешь?
В Шанхае  ⇒ я живу в Шанхае
Давно?   ⇒  ты давно живешь в Шанхае?
Два года уже  ⇒ я уже два года живу в Шанхае
Как там погода?  ⇒ как там погода в Шанхае?
```

Последнее, что хочется отметить: модель обучена только на диалоговых данных, с короткими репликами.
Она практически не способна раскрывать анафоры в художественных текстах, хотя это скорее не ограничение модели,
а особенность обучающего датасета.