From e88d1e7fcd759d90f8b29ec6a5d22e57c0c6059b Mon Sep 17 00:00:00 2001 From: Meowweasy Date: Tue, 9 Jan 2024 16:55:23 +0400 Subject: [PATCH] itog --- gordeeva_anna_lab_7/README.md | 43 +++++++++++++++ gordeeva_anna_lab_7/laba7.py | 99 ++++++++++++++++++++++++++++++++++ gordeeva_anna_lab_7/texten.txt | 5 ++ gordeeva_anna_lab_7/textru.txt | 5 ++ 4 files changed, 152 insertions(+) create mode 100644 gordeeva_anna_lab_7/README.md create mode 100644 gordeeva_anna_lab_7/laba7.py create mode 100644 gordeeva_anna_lab_7/texten.txt create mode 100644 gordeeva_anna_lab_7/textru.txt diff --git a/gordeeva_anna_lab_7/README.md b/gordeeva_anna_lab_7/README.md new file mode 100644 index 0000000..3fd25d7 --- /dev/null +++ b/gordeeva_anna_lab_7/README.md @@ -0,0 +1,43 @@ +## Задание +Выбрать художественный текст и обучить на нем рекуррентную нейронную сеть для решения задачи генерации. + +## Зависимости +Для работы этого приложения необходимы следующие библиотеки Python: +* NumPy +* TensorFlow +* Streamlit + +## Запуск +```bash +streamlit laba7.py +``` + +## Описание кода +1. Импорт библиотек: + + Импортируются необходимые библиотеки, такие как docx для чтения текстов из файлов Word, streamlit для создания веб-приложения, numpy, tensorflow и keras для обучения нейронных сетей. + +2. Извлечение текста из файлов Word: + + Функция extract_text_from_docx используется для извлечения текста из двух файлов Word на русском (textru) и английском (texten). Это делается с помощью библиотеки docx. + +3. Подготовка данных для обучения моделей: + + Текст из файлов разбивается на последовательности для обучения рекуррентных нейронных сетей (LSTM). Текст разбивается на последовательности определенной длины (maxlen) и используется для обучения моделей на русском и английском текстах. + +4. Создание и обучение моделей: + + Два отдельных экземпляра модели (model_russian и model_english) создаются и обучаются на соответствующих данных русского и английского текстов. + +5. Генерация текста на основе обученных моделей: + + Функция generate_text используется для генерации текста на основе обученных моделей. Этот текст выводится с помощью streamlit в веб-приложении. + +## Результат +Сгенерированный русский текст: + +Ты к моему несчастью верь как в святыню верит монах как в чудо чудо верит дева как верят в вечернюю печальные странники в пути + +Сгенерированный английский текст: + +In the to my distress as the monk believes in a shrine as the maiden believes in a miracle as weary travelers believe in the evening star on their journey diff --git a/gordeeva_anna_lab_7/laba7.py b/gordeeva_anna_lab_7/laba7.py new file mode 100644 index 0000000..a4f278d --- /dev/null +++ b/gordeeva_anna_lab_7/laba7.py @@ -0,0 +1,99 @@ +import docx +import streamlit as st +import numpy as np +import tensorflow as tf +from tensorflow.keras.models import Sequential +from tensorflow.keras.layers import LSTM, Dense, Embedding + +def extract_text_from_docx(file_path): + doc = docx.Document(file_path) + full_text = [] + + for para in doc.paragraphs: + full_text.append(para.text) + + return '\n'.join(full_text) + +file_path1 = '"C:/Users/79084/Desktop/textru.doc"' +file_path2 = '"C:/Users/79084/Desktop/texten.doc"' + +# Извлечение текста из файла +textru = extract_text_from_docx(file_path1) +texten = extract_text_from_docx(file_path2) + +# Предобработка текста +tokenizer_russian = tf.keras.preprocessing.text.Tokenizer(char_level=True) +tokenizer_russian.fit_on_texts(textru) +tokenized_text_russian = tokenizer_russian.texts_to_sequences([textru])[0] + +tokenizer_english = tf.keras.preprocessing.text.Tokenizer(char_level=True) +tokenizer_english.fit_on_texts(texten) +tokenized_text_english = tokenizer_english.texts_to_sequences([texten])[0] + +# Создание последовательных последовательностей для обучения +maxlen = 40 +step = 3 +sentences_russian = [] +next_chars_russian = [] +sentences_english = [] +next_chars_english = [] + +for i in range(0, len(tokenized_text_russian) - maxlen, step): + sentences_russian.append(tokenized_text_russian[i: i + maxlen]) + next_chars_russian.append(tokenized_text_russian[i + maxlen]) + +for i in range(0, len(tokenized_text_english) - maxlen, step): + sentences_english.append(tokenized_text_english[i: i + maxlen]) + next_chars_english.append(tokenized_text_english[i + maxlen]) + +# Преобразование данных в массивы numpy +x_russian = np.array(sentences_russian) +y_russian = np.array(next_chars_russian) +x_english = np.array(sentences_english) +y_english = np.array(next_chars_english) + +# Создание модели для русского текста +model_russian = Sequential() +model_russian.add(Embedding(len(tokenizer_russian.word_index) + 1, 128)) +model_russian.add(LSTM(128)) +model_russian.add(Dense(len(tokenizer_russian.word_index) + 1, activation='softmax')) + +model_russian.compile(loss='sparse_categorical_crossentropy', optimizer='adam') + +# Обучение модели на русском тексте +model_russian.fit(x_russian, y_russian, batch_size=128, epochs=50) + +# Создание модели для английского текста +model_english = Sequential() +model_english.add(Embedding(len(tokenizer_english.word_index) + 1, 128)) +model_english.add(LSTM(128)) +model_english.add(Dense(len(tokenizer_english.word_index) + 1, activation='softmax')) + +model_english.compile(loss='sparse_categorical_crossentropy', optimizer='adam') + +# Обучение модели на английском тексте +model_english.fit(x_english, y_english, batch_size=128, epochs=50) + +# Функция для генерации текста на основе обученной модели +def generate_text(model, tokenizer, seed_text, maxlen, temperature=1.0, num_chars=400): + generated_text = seed_text + for _ in range(num_chars): + encoded = tokenizer.texts_to_sequences([seed_text])[0] + encoded = np.array(encoded) + predicted_probs = model.predict(encoded, verbose=0)[0] + # Используем temperature для более разнообразных предсказаний + predicted_probs = np.log(predicted_probs) / temperature + exp_preds = np.exp(predicted_probs) + predicted_probs = exp_preds / np.sum(exp_preds) + predicted = np.random.choice(len(predicted_probs), p=predicted_probs) + next_char = tokenizer.index_word.get(predicted, '') + generated_text += next_char + seed_text += next_char + seed_text = seed_text[1:] + return generated_text + +generated_russian_text = generate_text(model_russian, tokenizer_russian, 'Ты к моему', maxlen, temperature=0.5, num_chars=400) +st.write(generated_russian_text) + +generated_english_text = generate_text(model_english, tokenizer_english, 'In the', maxlen, temperature=0.5, num_chars=400) +st.write(generated_english_text) diff --git a/gordeeva_anna_lab_7/texten.txt b/gordeeva_anna_lab_7/texten.txt new file mode 100644 index 0000000..2fe917e --- /dev/null +++ b/gordeeva_anna_lab_7/texten.txt @@ -0,0 +1,5 @@ +Believe in me, to my distress, +As the monk believes in a shrine, +As the maiden believes in a miracle, +As weary travelers believe +In the evening star on their journey. diff --git a/gordeeva_anna_lab_7/textru.txt b/gordeeva_anna_lab_7/textru.txt new file mode 100644 index 0000000..062d46a --- /dev/null +++ b/gordeeva_anna_lab_7/textru.txt @@ -0,0 +1,5 @@ +Ты, к моему несчастью, верь, +Как в святыню, верит монах, +Как в чудо, верит дева, +Как верят в вечернюю звезду +Печальные странники в пути. -- 2.25.1