Spaces:
Running
Running
import datetime | |
import streamlit as st | |
from utilities_database.user_database_utils import load_user_tasks_data | |
from utilities_database.user_database_utils import save_data_in_database | |
from utilities_database.user_database_widgets import user_save_text_table | |
from utilities_database.user_database_utils import load_users_particular_task | |
from streamlit_extras.no_default_selectbox import selectbox as custom_select_box | |
# Interface | |
if st.session_state.get('-LOGGED_IN_BOOL-'): | |
st.set_page_config(page_title='GenLexTasks', layout="wide", page_icon=':es:') | |
INSTRUCTION = st.expander(label='**ИНСТРУКЦИЯ**', expanded=False) | |
INSTRUCTION.markdown( | |
'**_I. Выберите режим работы._**' | |
'\n\n**_:red[СОЗДАНИЕ ЗАДАНИЙ]_**' | |
'\n\nПосле выбора данного режима работы появится форма, которую необходимо заполнить:' | |
'\n\n1. Придумайте **название** для файла с заданиями. ' | |
'Вы можете оставить это поле пустым - именем по умолчанию служит текущая дата и первые 20 символов ' | |
'введенного Вами текста.' | |
'\n\n2. Введите **текст** или выберите **текстовый файл** с исходным текстом, на основе которого Вы хотите ' | |
'создать задания. ' | |
'\n\n3. Укажите *способ выбора целевых слов*:' | |
'\n\t* *:green[Автоматически]*: программа сама выберет подходящие по сложности целевые слова.' | |
'\n\t* *:blue[Самостоятельно]*: введите в соответствующее поле целевые слова через запятую в той форме, ' | |
'в которой они встречаются в тексте. В этом случае *:orange[языковой уровень]* можно не указывать, но тогда ' | |
'дистракторы будут полностью случайными и несоотнесёнными с уровнем.' | |
'\n4. Если Вы выбрали *:green[автоматический поиск целевых слов]*, **_:red[обязательно]_** укажите ' | |
'*:orange[языковой уровень]*. Данный параметр отвечает за выбор лексического минимума, использующегося при ' | |
'подборе дистракторов.' | |
'\n5. Если Вы выбрали *:blue[самостоятельный ввод целевых слов]*, проверьте, что заполнили соответствующее ' | |
'поле. ️ ❗ **:red[Введите слова в той форме, в которой они встречаются в тексте]**.' | |
'\n6. Укажите число дистракторов - неправильных вариантов ответа. Если указано _более четырех_ ' | |
'дистракторов, возможно, что в некоторых заданиях будет выведено _меньшее количество, но не менее четырех_ ' | |
'вариантов. Данное обстоятельство связано с проверкой наличия дистракторов в лексических минимумах.' | |
'\n7. Выберите **способы вывода** готовых материалов.' | |
'\n8. Для начала работы нажмите на кнопку **"Запуск"**. Если все поля заполнены верно, ' | |
'начнется процесс генерации заданий. Прогресс будет отображаться на экране.' | |
'\n9. По окончании процесса генерации заданий будет выведено **_:green[соответсвующее сообщение]_**. ' | |
'Затем Вы можете перейти на вкладки **просмотра и 📥 сохранения** заданий, а так же 📝**онлайн-теста**.' | |
'\n\n**_:red[ЗАГРУЗКА ИЗ АРХИВА]_**' | |
'\n\nПосле выбора данного режима работы появится таблица, в которой перечислены названия заданий, ' | |
'которые Вы сохранили, языковой уровень и дата их создания.' | |
' Для загрузки определенного файла с заданиями:' | |
'\n1. Введите (или скопируйте из таблицы) название.' | |
'\n2. Укажите соответсвующий языковой уровень.' | |
'\n3. Нажмите на кнопку **"Загрузить"**.' | |
'\n4. Если все поля заполнены верно, Вы увидите сообщение о том, что **:green[задания успешно загружены]**.' | |
'\n\n\nДля того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**, ' | |
'кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.') | |
ANNOUNCES = st.expander('**ВАЖНАЯ ИНФОРМАЦИЯ**', expanded=False) | |
ANNOUNCES.success( | |
'**Уважаемые пользователи, пожалуйста, после генерации заданий перейдите на вкладку "📝Онлайн-тест" ' | |
'и заполните там опросник. Таким образом Вы очень поможете в улучшении качества заданий! Спасибо!🤗**') | |
ANNOUNCES.warning( | |
'**Сейчас генератор проходит завершающую настройку и отладку, для которой необходимо большое количество ' | |
'данных об уместности выбранных целевых слов и дистракторов к ним. Поэтому просим Вас отнестись с пониманием ' | |
'к излишне большому количеству заданий.**') | |
ANNOUNCES.warning( | |
'**❗️ㅤУбедительно просим Вас дожидаться окончания генерации или загрузки и не переходить на ' | |
'другие вкладки до выведения соответствующего сообщения.**') | |
ANNOUNCES.warning( | |
'**❗ㅤВ случае появления красных сообщений об ошибке, как правило, проблема решается ' | |
'повторными нажатиями на нужный Вам элемент. Приносим извинения за неудобства.**') | |
WHAT_TO_DO = st.radio( | |
label='**Выберите режим работы**', | |
options=[ | |
'Создать новые задания', | |
'Загрузить задания из моего архива'], | |
key='-WHAT_TO_DO_MODE-', | |
horizontal=True) | |
if WHAT_TO_DO == 'Загрузить задания из моего архива': | |
LOAD_FORM = st.form('LOAD_FORM') | |
UPLOAD_CLOUD_USER_NAME = st.session_state.get('-USER_NAME-') | |
loaded_data = load_user_tasks_data( | |
user_task_database=user_save_text_table, | |
save_type='download', | |
creator_name=UPLOAD_CLOUD_USER_NAME) | |
LOAD_FORM.table(loaded_data) | |
COL1, COL2 = LOAD_FORM.columns([1, 1]) | |
UPLOAD_CLOUD_FILE_NAME = COL1.text_input('Введите название заданий', placeholder='Жду название') | |
with COL2: | |
UPLOAD_CLOUD_CEFR_LEVEL = custom_select_box( | |
'Выберите языковой уровень', | |
['A1', 'A2', 'B1', 'B2', 'C1', 'C2', 'Без уровня'], | |
no_selection_label='-Выберите языковой уровень-') | |
st.session_state['-UPLOAD_CLOUD_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL | |
LOAD_BUTTON = LOAD_FORM.form_submit_button('Загрузить') | |
if LOAD_BUTTON: | |
if UPLOAD_CLOUD_USER_NAME in (None, '') or UPLOAD_CLOUD_FILE_NAME in (None, ''): | |
st.error('Вы не заполнили все поля') | |
st.stop() | |
__TASK_DATA__ = load_users_particular_task( | |
user_task_database=user_save_text_table, | |
load_mode='download', | |
creator_name=UPLOAD_CLOUD_USER_NAME, | |
save_name=UPLOAD_CLOUD_FILE_NAME, | |
cefr_level=UPLOAD_CLOUD_CEFR_LEVEL) | |
# In order to bypass further | |
st.session_state['UPLOAD_CLOUD_USER_NAME'] = UPLOAD_CLOUD_USER_NAME | |
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = UPLOAD_CLOUD_FILE_NAME | |
st.session_state['RESULT'] = __TASK_DATA__ | |
st.session_state['-LOADED_CEFR_LEVEL-'] = UPLOAD_CLOUD_CEFR_LEVEL | |
st.session_state['-DISPLAY_READY-'] = True | |
st.session_state['-DISPLAY_VERSION-'] = True | |
st.session_state['-DOWNLOAD_VERSION-'] = True | |
st.session_state['-ONLINE_TEST_READY-'] = True | |
st.success('Данные загружены. Можете переходить на следующие страницы.') | |
else: | |
# Upload text form | |
FORM = st.form('CREATE_FORM') | |
USER__SAVE_IN_CLOUD_FILE_NAME = FORM.text_input( | |
'**Введите название**', | |
placeholder='Жду название', | |
key='-USER__SAVE_IN_CLOUD_FILE_NAME-') | |
UPLOAD_TEXT = FORM.text_area( | |
label='**Вставьте текст:**', | |
value='', | |
placeholder='Жду текст', | |
key='-USER_INPUT_TEXT-') | |
UPLOAD_FILE = FORM.file_uploader( | |
label='**Или выберите файл:**', | |
type='txt', | |
key='-USER_INPUT_FILE-') | |
TW_MODE_COL, DISTRACTOR_MODEL_COL = FORM.columns(2) | |
TARGET_WORDS_MODE = TW_MODE_COL.radio( | |
label='**Как выбирать целевые слова?**', | |
options=['Автоматически', 'Самостоятельно'], | |
key='-TARGET_WORDS_MODE-', horizontal=True) | |
DISTRACTOR_MODEL = DISTRACTOR_MODEL_COL.radio( | |
label='**Модель для выбора неправильных вариантов**', | |
options=['Модель-1', 'Модель-2'], | |
key='-DISTRACTOR_MODEL_MODE-', horizontal=True) | |
CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2]) | |
with CEFR_NUM_DISTRACTORS_COL: | |
CEFR_TEXT_LEVEL = custom_select_box( | |
'Укажите уровень по CEFR:', | |
['Без уровня', 'A1', 'A2', 'B1', 'B2', 'C1', 'C2'], | |
no_selection_label='-Выберите языковой уровень-') | |
st.session_state['-CEFR_TEXT_LEVEL-'] = CEFR_TEXT_LEVEL | |
NUMBER_DISTRACTORS = CEFR_NUM_DISTRACTORS_COL.number_input( | |
label='**Выберите количество дистракторов в задании:**', | |
min_value=1, | |
max_value=9, | |
value=2, | |
key='-NUM_DISTRACTORS-') | |
TARGET_WORDS = UTW_COL.text_area( | |
label='**Если "Самостоятельно", введите целевые слова:**', | |
value='', | |
height=120, | |
placeholder='Через запятую и пробел', | |
key='-INPUT_TARGET_WORDS-') | |
FORM.markdown('**Выберите формат(-ы) вывода:**') | |
col1, col2, col3 = FORM.columns(3) | |
SAVE_IN_CLOUD = col1.checkbox( | |
label='**Сохранить в облаке**', | |
value=False, | |
key='-SAVE_IN_CLOUD-') | |
DOWNLOAD_VERSION = col2.checkbox( | |
label='**Скачать**', | |
value=False, | |
key='-DOWNLOAD_VERSION-') | |
ONLINE_TEST_VERSION = col3.checkbox( | |
label='**Онлайн тест**', | |
value=True, | |
key='-ONLINE_TEST_VERSION-') | |
START_COL, RERUN_COL, EXIT_COL = FORM.columns([1, 1, 1]) | |
START_BUTTON = START_COL.form_submit_button( | |
label='**Запуск**', | |
use_container_width=True) | |
RERUN_BUTTON = RERUN_COL.form_submit_button( | |
label='**Перезагрузка**', | |
use_container_width=True) | |
EXIT_BUTTON = EXIT_COL.form_submit_button( | |
label='**Выход**', | |
use_container_width=True) | |
if START_BUTTON: | |
LOGS = st.empty() | |
LOGS.success('**Готовые задания или онлайн-тест появятся на отдельных страницах**') | |
# Initiate interface structure | |
PROGRESS_BAR = st.progress(0) | |
LOGS_D = st.empty() | |
PROGRESS_BAR_D = st.progress(0) | |
PROGRESS_BAR_S = st.progress(0) | |
# Start generation process. Everything happens inside main_workflow func | |
if DISTRACTOR_MODEL == 'Модель-2': | |
from utilities_language_bert.esp_main_workflow_bert import main_workflow | |
__TASK_DATA__ = main_workflow( | |
file=UPLOAD_FILE, | |
text=UPLOAD_TEXT, | |
logs=LOGS, | |
logs_d=LOGS_D, | |
progress=PROGRESS_BAR, | |
progress_s=PROGRESS_BAR_S, | |
level=CEFR_TEXT_LEVEL, | |
tw_mode_automatic_mode=TARGET_WORDS_MODE, | |
target_words=TARGET_WORDS, | |
num_distractors=NUMBER_DISTRACTORS, | |
save_name=USER__SAVE_IN_CLOUD_FILE_NAME) | |
else: | |
from utilities_language_w2v.esp_main_workflow_w2v import main_workflow | |
__TASK_DATA__ = main_workflow( | |
file=UPLOAD_FILE, | |
text=UPLOAD_TEXT, | |
logs=LOGS, | |
logs_d=LOGS_D, | |
progress=PROGRESS_BAR, | |
progress_d=PROGRESS_BAR_D, | |
progress_s=PROGRESS_BAR_S, | |
level=CEFR_TEXT_LEVEL, | |
tw_mode_automatic_mode=TARGET_WORDS_MODE, | |
target_words=TARGET_WORDS, | |
num_distractors=NUMBER_DISTRACTORS, | |
save_name=USER__SAVE_IN_CLOUD_FILE_NAME) | |
# In order to bypass further | |
USER__SAVE_IN_CLOUD_FILE_NAME = USER__SAVE_IN_CLOUD_FILE_NAME if USER__SAVE_IN_CLOUD_FILE_NAME != '' \ | |
else __TASK_DATA__['name'] | |
st.session_state['RESULT'] = __TASK_DATA__ | |
st.session_state['-DISPLAY_READY-'] = True | |
st.session_state['-DISPLAY_VERSION-'] = True | |
st.session_state['-ONLINE_TEST_READY-'] = True | |
st.session_state['-LOADED_CEFR_LEVEL-'] = CEFR_TEXT_LEVEL | |
st.session_state['-UPLOAD_CLOUD_FILE_NAME-'] = USER__SAVE_IN_CLOUD_FILE_NAME | |
PROGRESS_BAR.progress(100) | |
PROGRESS_BAR_S.progress(100) | |
LOGS.success('**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**') | |
if SAVE_IN_CLOUD: | |
save_data_in_database( | |
user_task_database=user_save_text_table, | |
save_type='download', | |
save_name=USER__SAVE_IN_CLOUD_FILE_NAME, | |
cefr_level=CEFR_TEXT_LEVEL, | |
time_stamp=str(datetime.datetime.now())[:-7], | |
creator_name=st.session_state.get('-USER_NAME-'), | |
generated_result=__TASK_DATA__, | |
distractor_model=DISTRACTOR_MODEL) | |
PROGRESS_BAR = '' | |
PROGRESS_BAR_S = '' | |
LOGS_D = '' | |
if EXIT_BUTTON: | |
for key in st.session_state: | |
del st.session_state[key] | |
st.error('Я устал. Я ухожу') | |
st.session_state["START_GENERATION"] = False | |
st.stop() | |
if RERUN_BUTTON: | |
for key in st.session_state: | |
del st.session_state[key] | |
st.error('Что-то пошло не так?! Перезагружаюсь!') | |
st.session_state["START_GENERATION"] = False | |
st.stop() | |
st.experimental_rerun() | |
# LABEL | |
st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,' | |
' 3 курс, бакалавриат, "Прикладная, компьютерная и математическая лингвистика (английский язык)"*' | |
'\n\n*Научный руководитель: канд. филол. наук, доц. О.А.Митрофанова*') | |
st.markdown('*E-mail: [email protected]*') | |
else: | |
st.warning('**Войдите или зарегистрируйтесь**') | |