diff --git a/arzamaskina_milana_lab_7/README.md b/arzamaskina_milana_lab_7/README.md new file mode 100644 index 0000000..43e437a --- /dev/null +++ b/arzamaskina_milana_lab_7/README.md @@ -0,0 +1,46 @@ +# Лабораторная работа №7 + +## Рекуррентная нейронная сеть и задача генерации текста + +#### ПИбд-41 Арзамаскина Милана +#### Вариант №2 + +### Какие технологии использовались: + +Используемые библиотеки: +* numpy +* keras +* tensorflow + +### Как запустить: + +* установить python, numpy, keras, tensorflow +* запустить проект (стартовая точка - main.py) + +### Что делает программа: + +На основе выбранных художественных текстов происходит обучение рекуррентной нейронной сети для решения задачи генерации. +Необходимо подобрать архитектуру и параметры так, чтобы приблизиться к максимально осмысленному результату. + +* Читает текст из файлов (english.txt, russian.txt) +* Получает входные, выходные данные (X, y), размер словаря и токенайзер. Используем Tokenizer с настройкой char_level=True +* Создаёт объект Sequential (последовательная рекуррентная нейронная сеть) и добавление двух слоёв LSTM. Dropout — это метод регуляризации для нейронных сетей и моделей глубокого обучения, решение проблемы переобучения. Слой Dense с функцией активации softmax используется для предсказания следующего слова +* Компилирует модель +* Обучает модель +* Генерирует текст + + +#### Сгенерированные тексты: + +Генерация на русском языке: + +![Result](img1.png) + +Генерация на английском языке: + +![Result](img2.png) + + +### Вывод: + +Программа способна сгенерировать осмысленный текст в каждом из случаев. \ No newline at end of file diff --git a/arzamaskina_milana_lab_7/english.txt b/arzamaskina_milana_lab_7/english.txt new file mode 100644 index 0000000..fac4963 --- /dev/null +++ b/arzamaskina_milana_lab_7/english.txt @@ -0,0 +1,8 @@ +The cloud shuddered with blue flame. Thunder rumbled slowly. +It either intensified or almost died down. And the rain, obeying the thunder, began to fall harder at times and rustle widely through the leaves, then stopped. +Soon the sun broke through the clouds. The old Pushkin Park in Mikhailovskoye and the steep banks of Soroti were ablaze with red clay and wet grass. +A slender rainbow lit up across the cloudy distance. It sparkled and smoked, surrounded by wisps of ashen clouds. +The rainbow looked like an arch erected on the border of a protected land. Here, in Pushkin’s places, thoughts about the Russian language arose with particular force. +Here Pushkin wandered with his head uncovered, with his cold hair tangled by the autumn wind, listening to the wet hum of the pine tops, looking, squinting, +from where the autumn clouds rush, I rushed around the fairs. Here wonderful words overwhelmed him, oppressed his soul and, finally, were composed, one by one, with the stub of a goose feather, into ringing stanzas. +​ diff --git a/arzamaskina_milana_lab_7/img1.png b/arzamaskina_milana_lab_7/img1.png new file mode 100644 index 0000000..0be569d Binary files /dev/null and b/arzamaskina_milana_lab_7/img1.png differ diff --git a/arzamaskina_milana_lab_7/img2.png b/arzamaskina_milana_lab_7/img2.png new file mode 100644 index 0000000..04a0c65 Binary files /dev/null and b/arzamaskina_milana_lab_7/img2.png differ diff --git a/arzamaskina_milana_lab_7/main.py b/arzamaskina_milana_lab_7/main.py new file mode 100644 index 0000000..47e850b --- /dev/null +++ b/arzamaskina_milana_lab_7/main.py @@ -0,0 +1,62 @@ +import numpy as np +from keras.layers import LSTM, Dense +from keras.models import Sequential +from keras.preprocessing.sequence import pad_sequences +from keras.preprocessing.text import Tokenizer + +# Чтение текста из файла +# with open('russian.txt', 'r', encoding='utf-8') as file: +# text = file.read() +with open('english.txt', 'r', encoding='utf-8') as file: + text = file.read() + +# Обучение Tokenizer на тексте +tokenizer = Tokenizer(char_level=True) +tokenizer.fit_on_texts([text]) +sequences = tokenizer.texts_to_sequences([text])[0] + +# Создание x, y последовательностей +X_data, y_data = [], [] +seq_length = 10 +for i in range(seq_length, len(sequences)): + sequence = sequences[i - seq_length:i] + target = sequences[i] + X_data.append(sequence) + y_data.append(target) + +# Преобразование в массивы +X_mass = pad_sequences(X_data, maxlen=seq_length) +y_mass = np.array(y_data) + +# Создание модели +vocab_size = len(tokenizer.word_index) + 1 +model = Sequential() +model.add(LSTM(256, input_shape=(seq_length, 1), return_sequences=True)) +model.add(LSTM(128, input_shape=(seq_length, 1))) +model.add(Dense(vocab_size, activation='softmax')) + +# Компиляция +model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy']) + +# Обучение +model.fit(X_mass, y_mass, epochs=100, verbose=1) + +# Функция генерации +def generate_text(_text, gen_length): + generated_text = _text + for _ in range(gen_length): + seq = tokenizer.texts_to_sequences([_text])[0] + seq = pad_sequences([seq], maxlen=seq_length) + prediction = model.predict(seq)[0] + predicted_index = np.argmax(prediction) + predicted_char = tokenizer.index_word[predicted_index] + generated_text += predicted_char + _text += predicted_char + _text = _text[1:] + return generated_text + +# Генерация текста +# _text = "Она сверкала" +_text = "It sparkled and smoked" +generate_text = generate_text(_text, 250) +print(generate_text) \ No newline at end of file diff --git a/arzamaskina_milana_lab_7/russian.txt b/arzamaskina_milana_lab_7/russian.txt new file mode 100644 index 0000000..b49b3ac --- /dev/null +++ b/arzamaskina_milana_lab_7/russian.txt @@ -0,0 +1,7 @@ +Тучу передернуло синим пламенем. Медленно загремел гром. +Он то усиливался, то почти затихал. И дождь, подчиняясь грому, начал временами идти сильнее и широко шуметь по листве, потом останавливался. +Вскоре сквозь тучи пробилось солнце. Старый пушкинский парк в Михайловском и крутые берега Сороти запылали рыжей глиной и мокрой травой. +Стройная радуга зажглась нал пасмурной далью. Она сверкала и дымилась, окруженная космами пепельных туч. +Радуга была похожа на арку, воздвигнутую на границе заповедной земли. С особенной силой здесь, в пушкинских местах, возникали мысли о русском языке. +Здесь Пушкин бродил с непокрытой головой, со спутанными осенним ветром холодными волосами, слушал влажный гул сосновых вершин, смотрел, прищурившись, +откуда несутся осенние тучи, толкался по ярмаркам. Здесь чудесные слова переполняли его, стесняли его душу и, наконец, слагались по огрызком гусиного пера в звенящие строфы. \ No newline at end of file