diff --git a/faskhutdinov_idris_lab_7/Readme.md b/faskhutdinov_idris_lab_7/Readme.md new file mode 100644 index 0000000..dca7617 --- /dev/null +++ b/faskhutdinov_idris_lab_7/Readme.md @@ -0,0 +1,42 @@ +# Лабораторная работа №7. Рекуррентная нейронная сеть и задача генерации текста +## 1 вариант(27 % 2 = 1) +### Задание: +Использовать регрессию по варианту для данных из таблицы 1 по +варианту (таблица 10), самостоятельно сформулировав задачу. Оценить, +насколько хорошо она подходит для решения сформулированной вами задачи. + +Используемый текст: англоязычный + +### Как запустить лабораторную +1. Запустить файл main.py + +### Используемые технологии +1. Библиотека tensorflow +2. Библиотека keras +3. Python +4. IDE PyCharm + +### Описание лабораторной работы +Программа работает с библиотеками tensorflow и keras: изначально считывает текст, после чего производит процесс токенизации текста, а так же преобразует его в числовые последовательности. +После чего строится и обучается модель. В конце происходит генерация текста и запись его в файлы. Изначально обрабатывается текст на русском языке(Булгаков, "Мастер и Маргарита"), затем на английском(Оруэлл, "1984"). +Среднее время прохождения одного цикла при работе с русскоязычным текстом - 2,5 с +Среднее время прохождения одного цикла при работе с англоязычным текстом - 0,3 с + +### Результат +#### Оригинал русскоязычного текста: +Абрикосовая дала обильную желтую пену, и в воздухе запахло парикмахерской. Напившись, литераторы немедленно начали икать, расплатились и уселись на скамейке лицом к пруду и спиной к Бронной. +Тут приключилась вторая странность, касающаяся одного Берлиоза. Он внезапно перестал икать, сердце его стукнуло и на мгновенье куда-то провалилось, потом вернулось, но с тупой иглой, засевшей в нем. Кроме того, Берлиоза охватил необоснованный, но столь сильный страх, что ему захотелось тотчас же бежать с Патриарших без оглядки. Берлиоз тоскливо оглянулся, не понимая, что его напугало. Он побледнел, вытер лоб платком, подумал: «Что это со мной? Этого никогда не было... сердце шалит... я переутомился. Пожалуй, пора бросить все к черту и в Кисловодск...» +И тут знойный воздух сгустился перед ним, и соткался из этого воздуха прозрачный гражданин престранного вида. На маленькой головке жокейский картузик, клетчатый кургузый воздушный же пиджачок... Гражданин ростом в сажень, но в плечах узок, худ неимоверно, и физиономия, прошу заметить, глумливая. +Жизнь Берлиоза складывалась так, что к необыкновенным явлениям он не привык. Еще более побледнев, он вытаращил глаза и в смятении подумал: «Этого не может быть!..» +Но это, увы, было, и длинный, сквозь которого видно, гражданин, не касаясь земли, качался перед ним и влево и вправо. +Тут ужас до того овладел Берлиозом, что он закрыл глаза. А когда он их открыл, увидел, что все кончилось, марево растворилось, клетчатый исчез, а заодно и тупая игла выскочила из сердца. +#### Сгенерированный русскоязычный текст: +Абрикосовая дала обильную желтую пену и в воздухе запахло парикмахерской напившись литераторы немедленно начали икать расплатились и уселись на скамейке лицом к пруду и спиной к бронной тут приключилась вторая странность касающаяся одного берлиоза он внезапно перестал икать сердце его стукнуло и на мгновенье куда то провалилось потом вернулось но с тупой иглой засевшей в нем кроме того берлиоза охватил необоснованный но столь сильный страх что ему захотелось тотчас же бежать с патриарших без оглядки берлиоз тоскливо оглянулся не понимая что его напугало он побледнел вытер лоб платком подумал «что это со мной этого никогда не было сердце шалит я переутомился +#### Оригинал англоязычного текста: +It was a bright, cold day in April and the clocks were striking thirteen. Winston Smith hurried home to Victory Mansions with his head down to escape the terrible wind. A cloud of dust blew inside with him, and the hall smelled of dust and yesterday's food. +At the end of the hall, a poster covered one wall. It showed an enormous face, more than a metre wide: the face of a handsome man of about forty-five, with a large, black moustache. The man's eyes seemed to follow Winston as he moved. Below the face were the words BIG BROTHER IS WATCHING YOU. +Winston went up the stairs. He did not even try the lift. It rarely worked and at the moment the electricity was switched off during the day to save money for Hate Week. The flat was on the seventh floor and Winston, who was thirty-nine and had a bad knee, went slowly, resting several times on the way. Winston was a small man and looked even smaller in the blue overalls of the Party. His hair was fair and the skin on his face, which used to be pink, was red and rough from cheap soap, old razor blades and the cold of the winter that had just ended. +#### Сгенерированный англоязычный текст: +It was a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a + +В результате работы программы была успешно создана и обучена рекуррентная нейронная сеть для генерации текста. \ No newline at end of file diff --git a/faskhutdinov_idris_lab_7/eng_lang.png b/faskhutdinov_idris_lab_7/eng_lang.png new file mode 100644 index 0000000..5c2dac2 Binary files /dev/null and b/faskhutdinov_idris_lab_7/eng_lang.png differ diff --git a/faskhutdinov_idris_lab_7/english_text.txt b/faskhutdinov_idris_lab_7/english_text.txt new file mode 100644 index 0000000..56e731b --- /dev/null +++ b/faskhutdinov_idris_lab_7/english_text.txt @@ -0,0 +1,3 @@ +It was a bright, cold day in April and the clocks were striking thirteen. Winston Smith hurried home to Victory Mansions with his head down to escape the terrible wind. A cloud of dust blew inside with him, and the hall smelled of dust and yesterday's food. +At the end of the hall, a poster covered one wall. It showed an enormous face, more than a metre wide: the face of a handsome man of about forty-five, with a large, black moustache. The man's eyes seemed to follow Winston as he moved. Below the face were the words BIG BROTHER IS WATCHING YOU. +Winston went up the stairs. He did not even try the lift. It rarely worked and at the moment the electricity was switched off during the day to save money for Hate Week. The flat was on the seventh floor and Winston, who was thirty-nine and had a bad knee, went slowly, resting several times on the way. Winston was a small man and looked even smaller in the blue overalls of the Party. His hair was fair and the skin on his face, which used to be pink, was red and rough from cheap soap, old razor blades and the cold of the winter that had just ended. \ No newline at end of file diff --git a/faskhutdinov_idris_lab_7/generated_english_text.txt b/faskhutdinov_idris_lab_7/generated_english_text.txt new file mode 100644 index 0000000..a71747b --- /dev/null +++ b/faskhutdinov_idris_lab_7/generated_english_text.txt @@ -0,0 +1 @@ +It was a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a bright cold day to save the face were the big brother brother is brother watching you watching you watching watching you watching watching you you a small moustache the face were the words big brother is watching you you you you watching you watching watching watching you you a \ No newline at end of file diff --git a/faskhutdinov_idris_lab_7/generated_russian_text.txt b/faskhutdinov_idris_lab_7/generated_russian_text.txt new file mode 100644 index 0000000..cdb56a9 --- /dev/null +++ b/faskhutdinov_idris_lab_7/generated_russian_text.txt @@ -0,0 +1 @@ +Абрикосовая дала обильную желтую пену и в воздухе запахло парикмахерской напившись литераторы немедленно начали икать расплатились и уселись на скамейке лицом к пруду и спиной к бронной тут приключилась вторая странность касающаяся одного берлиоза он внезапно перестал икать сердце его стукнуло и на мгновенье куда то провалилось потом вернулось но с тупой иглой засевшей в нем кроме того берлиоза охватил необоснованный но столь сильный страх что ему захотелось тотчас же бежать с патриарших без оглядки берлиоз тоскливо оглянулся не понимая что его напугало он побледнел вытер лоб платком подумал «что это со мной этого никогда не было сердце шалит я переутомился \ No newline at end of file diff --git a/faskhutdinov_idris_lab_7/main.py b/faskhutdinov_idris_lab_7/main.py new file mode 100644 index 0000000..4b25401 --- /dev/null +++ b/faskhutdinov_idris_lab_7/main.py @@ -0,0 +1,97 @@ +import tensorflow as tf +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import Embedding, LSTM, Dense +import numpy as np + +# Загрузка и подготовка данных +with open('russian_text.txt', 'r', encoding='cp1251') as file: + russian_text = file.read() + +# Токенизация текста +tokenizer = tf.keras.preprocessing.text.Tokenizer() +tokenizer.fit_on_texts([russian_text]) +total_words = len(tokenizer.word_index) + 1 + +# Преобразование текста в числовые последовательности +input_sequences = [] +for line in russian_text.split('n'): + token_list = tokenizer.texts_to_sequences([line])[0] + for i in range(1, len(token_list)): + n_gram_sequence = token_list[:i+1] + input_sequences.append(n_gram_sequence) + +# Создание входных и целевых последовательностей +max_sequence_length = max([len(x) for x in input_sequences]) +input_sequences = np.array(tf.keras.preprocessing.sequence.pad_sequences(input_sequences, maxlen=max_sequence_length, + padding='pre')) +predictors, label = input_sequences[:, :-1], input_sequences[:, -1] + +# Построение и обучение модели +model = Sequential() +model.add(Embedding(total_words, 100, input_length=max_sequence_length-1)) +model.add(LSTM(150)) +model.add(Dense(total_words, activation='softmax')) +model.compile(loss='sparse_categorical_crossentropy', optimizer='adam') +model.fit(predictors, label, epochs=150, batch_size=64) + + +def generate_text(seed_text, next_words, model, max_sequence_length): + for _ in range(next_words): + token_list = tokenizer.texts_to_sequences([seed_text])[0] + token_list = tf.keras.preprocessing.sequence.pad_sequences([token_list], maxlen=max_sequence_length - 1, + padding='pre') + predicted = np.argmax(model.predict(token_list, verbose=0), axis=-1) + + # Поиск слова, соответствующего предсказанному индексу + output_word = "" + for word, index in tokenizer.word_index.items(): + if index == predicted: + output_word = word + break + + seed_text += " " + output_word + + return seed_text + +# Генерация и сохранение русскоязычного текста +russian_generated_text = generate_text('Абрикосовая', next_words=100, model=model, max_sequence_length=max_sequence_length) +with open('generated_russian_text.txt', 'w', encoding='utf-8') as file: + file.write(russian_generated_text) + + + +# Загрузка и подготовка данных +with open('english_text.txt', 'r', encoding='utf-8') as file: + english_text = file.read() + +# Токенизация текста +tokenizer = tf.keras.preprocessing.text.Tokenizer() +tokenizer.fit_on_texts([english_text]) +total_words = len(tokenizer.word_index) + 1 + +# Преобразование текста в числовые последовательности +input_sequences = [] +for line in english_text.split('n'): + token_list = tokenizer.texts_to_sequences([line])[0] + for i in range(1, len(token_list)): + n_gram_sequence = token_list[:i+1] + input_sequences.append(n_gram_sequence) + +# Создание входных и целевых последовательностей +max_sequence_length = max([len(x) for x in input_sequences]) +input_sequences = np.array(tf.keras.preprocessing.sequence.pad_sequences(input_sequences, maxlen=max_sequence_length, + padding='pre')) +predictors, label = input_sequences[:, :-1], input_sequences[:, -1] + +# Построение и обучение модели +model = Sequential() +model.add(Embedding(total_words, 100, input_length=max_sequence_length-1)) +model.add(LSTM(150)) +model.add(Dense(total_words, activation='softmax')) +model.compile(loss='sparse_categorical_crossentropy', optimizer='adam') +model.fit(predictors, label, epochs=150, batch_size=64) + +# Генерация и сохранение англоязычного текста +english_generated_text = generate_text('It', next_words=100, model=model, max_sequence_length=max_sequence_length) +with open('generated_english_text.txt', 'w', encoding='utf-8') as file: + file.write(english_generated_text) \ No newline at end of file diff --git a/faskhutdinov_idris_lab_7/russian_lang.png b/faskhutdinov_idris_lab_7/russian_lang.png new file mode 100644 index 0000000..cbdd618 Binary files /dev/null and b/faskhutdinov_idris_lab_7/russian_lang.png differ diff --git a/faskhutdinov_idris_lab_7/russian_text.txt b/faskhutdinov_idris_lab_7/russian_text.txt new file mode 100644 index 0000000..9347bb1 --- /dev/null +++ b/faskhutdinov_idris_lab_7/russian_text.txt @@ -0,0 +1,6 @@ + , . , , . + , . , - , , , . , , , . , , . , , : ? ... ... . , ... + , . , ... , , , , , . + , . , : !.. + , , , , , , , . + , . , , , , , . \ No newline at end of file