StKirill commited on
Commit
50127aa
·
verified ·
1 Parent(s): d267e43

Update README_Ru.md

Browse files
Files changed (1) hide show
  1. README_Ru.md +117 -0
README_Ru.md CHANGED
@@ -0,0 +1,117 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Intro
2
+ В этом репозитории методы обработки естественного языка (NLP) используются для изучения стиля речи Рейчел из сериала "Друзья", проведения мультиязыкового анализа английского языка и обучения нейронной сети общению в стиле Рейчел.
3
+ Перенос стиля очень популярен в НЛП и сейчас используется в самых разных сферах, от образования до персонализации электронных помощников. А с развитием больших моделей-трансформеров, которые демонстрируют выдающиеся способности в понимании естественного языка и имитации самых разных стилей, передача стиля вышла на новый уровень. Сегодня большие языковые модели, такие как GPT3, благодаря своим объемам и миллиардам параметров способны идеально изучить все особенности обучающей выборки (т. е. обучить распределению) и сгенерировать реалистичный текст в определенном стиле.
4
+ В этом посте я исследую возможности языковых моделей для генерации текста в стиле Рейчел из знаменитого сериала "Друзья". Для этого используется корпус английских транскриптов сериала, который был собран для поиска чатбота и обучения двуязычных моделей для общения в стиле Рейчел Грин.
5
+ Кроме того, я провела анализ стиля, изучила особенности речи Рейчел.
6
+ Таким образом, проект можно условно разделить на 3 части:
7
+ * Cбор данных
8
+ * Стилистический анализ речи персонажей
9
+ * Фреймворк для обучения моделей, которые пишут текст в стиле Рейчел.
10
+ Весь код можно найти в этом репозитории HF.
11
+
12
+ # Данные
13
+ ## Выбор персонажа
14
+ Я решил продолжить использовать сериал, на котором остановился в предыдущем проекте, ситком "Друзья", который шел с 1994 по 2004 год. Несмотря на свой возраст, он остается популярным и по сей день. Этот комедийный сериал рассказывает о жизни шести друзей (Росс, Фиби, Моника, Рейчел, Джоуи и Чендлер), которые живут в Нью-Йорке и постоянно попадают в какие-то неприятности и забавные ситуации. Почему мы выбрали именно этот сериал? По трем причинам:
15
+
16
+ 1. Я нашел в открытом доступе расшифровки 236 эпизодов. Это очень много данных, которые я могу использовать для обучения языковой модели.
17
+
18
+ 2. В сериале есть диалоги не одного, а целых шести персонажей, что открывает мне возможности для сравнительного анализа
19
+
20
+ 3. Это популярный сериал, который многие из нас смотрели и хорошо знают. Это значит, что я могу сделать предположения о данных (например, Фиби говорит более простыми словами и т. д.) и оценить реалистичность стиля сгенерированного текста, основываясь на своем опыте просмотра.
21
+
22
+ ## Сбор данных
23
+ Оригинальные транскрипты, которые я взял из Интернета, были на английском языке. Затем я выполнил следующую предварительную обработку текста:
24
+
25
+ 1. Во-первых, я очистил данные от мелких графемных ошибок, характерных для транскриптов. Например, если персонаж говорил что-то длинное, его слова могли содержать повторы гласных для имитации длинного звука ("nooooooooooooooooooooooooooooooooooooooooooooooooo").
26
+
27
+ 2. Во-вторых, я заметил, что некоторые слова содержат повторы одного и того же слова для комичности. Я также удалял такие повторы, оставляя только одну копию повторяющегося слова.
28
+
29
+ 3. В-третьих, поскольку я хотел передать стиль, присущий каждому персонажу, я отбросил общие фразы, используемые всеми 6 главными героями ("Знаете что!", "О Боже!" и т. д.).
30
+
31
+ Таким образом, я собрал корпус диалогов для 6 персонажей, включающий около 8 тысяч предложений для каждого персонажа. Подробное распределение по количеству предложений для каждого персонажа вы можете увидеть в таблице ниже:
32
+ !["Number of replicas for every character"](./images/NumberOfReplicasOverCharacter.png)
33
+
34
+ ### Анализ данных
35
+ Количество реплик для всех сезонов показано ниже:
36
+ !["Number of replicas for every character"](./images/NumberOfReplicasOverSeason.png)
37
+ Как видно, среднее значение количества реплик за все сезоны составляет 6000 при стандартном отклонении около 400.
38
+
39
+ Количество реплик для всех эпизодов показано ниже:
40
+ !["Number of replicas for all seasons"](./images/NumberOfReplicasInEpisode.png)
41
+ Как видно, среднее значение количества реплик в эпизоде составляет 265. Стандартное отклонение составляет около 65 реплик.
42
+
43
+ Самые частые слова в наборе данных:
44
+ !["Number of replicas for episode"](./images/MostFrequentWords.png)
45
+
46
+ # Анализ стилей персонажей
47
+ Прежде чем обучать языковые шаблоны, я исследовал стилевые особенности Рэйчел. В частности, чтобы определить особенности речи, я сделал следующее:
48
+
49
+ * Подсчитал описательную статистику: количество слов, среднее количество слов в предложении, индекс читабельности, доля сложных слов и т. д.
50
+
51
+ * Наиболее частотные слова для персонажей;
52
+
53
+ * Доля положительных и отрицательных слов.
54
+
55
+ Исходя из приведенного сюжета, можно сделать предварительные выводы о специфике речи персонажей. Например, Росс и Рейчел самые разговорчивые, у них максимальное количество предложений.
56
+
57
+ После такого первичного анализа речи я более детально исследовала словарный запас и проанализировала его с точки зрения сложности слов, используемых персонажами. За "трудные" слова мы условно приняли длинные слова, состоящие более чем из 4 слогов. Долю сложных слов для каждого персонажа можно увидеть на графике ниже:
58
+
59
+ ## Самые частые слова Рейчел
60
+ Я провел анализ наиболее частотных слов Рейчел, исключив стоп-слова из nltk.stopwords("english"). Результат этого анализа показан ниже.
61
+ !["Most frequent Rachel's words"](./images/RachelMostFrequentWords.png)
62
+ Или эти данные можно представить в виде изображения
63
+ !["Most frequent rachel's words in image"](./images/RachelWords.png)
64
+
65
+ # Подготовка данных
66
+ Итак, мы собрали фразы Рейчел и разделили их на два набора данных: реплики и фразы. Для целей моделирования мы снабдили все реплики дополнительным набором лексем и тегов:
67
+
68
+ Специальные лексемы <s> и </s>, обозначающие начало и конец примера.
69
+
70
+ Имя персонажа пишется заглавными буквами.
71
+
72
+ Специальный псевдоним NOTFRIEND, который являлся маркером реплики другого говорящего в диалоговых парах "реплика НЕФРИЕНДА - ответ ГЕРОЯ". Мы использовали такой псевдоним, чтобы отделить чужие реплики от героя, чьему стилю мы хотим подражать.
73
+
74
+ Используя данные с дополнительными лексемами, я создал два набора данных для Рейчел на английском языке. Ниже приведено краткое описание каждого из них:
75
+
76
+ 1. Сырые монологи - набор данных, содержащий отдельные реплики одного из персонажей. Этот набор данных позволяет модели получить максимум информации о стиле конкретного персонажа.
77
+
78
+ !["raw monologues"](./images/phrases.png)
79
+
80
+ 2. Необработанные диалоги - набор данных, содержащий пары "реплика НЕдруга - ответ ГЕРОя", разделенные символом переноса строки \n. Набор данных диалогов необходим, потому что мы хотим, чтобы наша модель могла поддерживать разговор с пользователем в стиле Friends, а не просто генерировать текст.
81
+
82
+ !["raw dialogs"](./images/replicas.png)
83
+
84
+ # Обучение
85
+ Для обучения модели передачи стиля Рейчел чатботу я использовал несколько моделей. Обучение моделей проходит в два этапа. На первом этапе модель пытается уловить личность Рейчел и изучает ее монологи. На втором этапе модель пытается узнать, как Рейчел ведет себя в диалогах, поэтому на этом этапе модель обучается на диалогах.
86
+ 1. Первый этап - GPT2. Для наборов данных я использовал TextDataset от PyTorch и библиотеку трансформаторов от huggingface.
87
+ Результаты показаны на изображении ниже
88
+ !["gpt2-results"](./images/gpt2-results.png)
89
+
90
+ 2. Вторая модель - GPT2-medium. Результаты обучения на монологах показаны ниже
91
+ !["gpt2-medium-mono-train"](./images/gpt2-medium-mono-train.png)
92
+ Обучение диалогам показано на следующем изображении
93
+ !["gpt2-medium-mono-train"](./images/gpt2-medium-replics-train.png)
94
+ Результат обучения показан ниже
95
+ !["gpt2-medium-results"](./images/gpt2-medium-results.png)
96
+
97
+ 2. Последняя модель - GPT2-large. Обучение на монологах показано ниже
98
+ !["gpt2-large-mono-train"](./images/gpt2-large-mono-train.png)
99
+ Обучение диалогам показано на следующем изображении
100
+ !["gpt2-large-mono-train"](./images/gpt2-large-replics-train.png)
101
+ Результат обучения показан ниже
102
+ !["gpt2-large-results"](./images/gpt2-large-results.png)
103
+
104
+ # Архитектура
105
+
106
+ - PrepareData.ipynb <- Парсер данных из Интернета, очистка, токенизация и подготовка к набору данных
107
+ - train_data <- папка datasets с монологами и диалогами
108
+ - Training_gpt2_medium.ipynb <- обучение gpt2-medium
109
+ - en_gpt2-medium_rachel_replics <- модель gpt2-medium
110
+ - Training_gpt2_large.ipynb <- тренировка gpt2-large
111
+ - en_gpt2-large_rachel_replics <- gpt2-large модель
112
+ - images <- изображения для README.md
113
+ - app.py <- основной файл
114
+ - requirements.txt <- необходимые библиотеки
115
+ # Заключение и планы на будущее
116
+ Итак, я использовал методы обработки естественного языка для изучения стиля речи Рейчел из известного сериала "Друзья", провел мультиязычный анализ для английского языка и обучил языковые модели на основе GPT говорить в стиле Рейчел.
117
+ В будущем я хочу поэкспериментировать с еще более крупными моделями. Например, с LLama, а также с методами генерации управляемого текста для них.