File size: 15,891 Bytes
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cde930
 
 
 
2609fac
 
8cde930
 
 
 
 
 
 
 
 
 
 
2609fac
8cde930
 
2609fac
 
 
8cde930
 
2609fac
 
 
 
 
8cde930
 
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cde930
 
 
 
 
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
85c4b9b
2609fac
 
 
8cde930
 
 
 
 
2609fac
 
 
 
 
8cde930
2609fac
 
 
 
 
8cde930
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
5864c0d
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8cde930
 
 
 
2609fac
 
85c4b9b
2609fac
 
 
 
 
 
8cde930
2609fac
 
 
 
 
 
 
 
 
 
 
 
8cde930
2609fac
 
 
 
85c4b9b
 
2609fac
 
 
 
 
 
 
 
 
 
 
 
8cde930
 
 
861e39c
 
 
 
 
 
 
 
 
2609fac
 
 
 
 
 
 
 
 
 
 
 
 
8cde930
2609fac
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
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

# 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Для того, чтобы свернуть/развернуть блоки **Инструкций** или **Важной информации**,'
        ' кликните по заголовку этого блока или по стрелке (ᐯ / ᐱ), располагающейся в его правом верхнем углу.')
    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 = st.selectbox(
                label='Выберите языковой уровень',
                options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
                index=None,
                placeholder='-Выберите языковой уровень-')
            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', 'Модель-3'],
            key='-DISTRACTOR_MODEL_MODE-', horizontal=True)
        CEFR_NUM_DISTRACTORS_COL, UTW_COL = FORM.columns([2, 2])
        with CEFR_NUM_DISTRACTORS_COL:
            CEFR_TEXT_LEVEL = st.selectbox(
                label='Выберите языковой уровень',
                options=['A1', 'A2', 'B1', 'B2', 'C1', 'Без уровня'],
                index=None,
                placeholder='-Выберите языковой уровень-')
            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=3,
            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:
            # Initiate interface structure
            LOGS = st.status(label='Прогресс выполнения', expanded=True)

            PROGRESS_BAR = LOGS.progress(0)
            PROGRESS_BAR_DISTRACTORS = LOGS.progress(0)

            # Start generation process. Everything happens inside main_workflow func
            if DISTRACTOR_MODEL == 'Модель-3':
                from utilities_language_bert.esp_main_workflow_bert import main_workflow
                __TASK_DATA__ = main_workflow(
                    file=UPLOAD_FILE,
                    text=UPLOAD_TEXT,
                    logs=LOGS,
                    progress=PROGRESS_BAR,
                    progress_d=PROGRESS_BAR_DISTRACTORS,
                    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,
                    progress=PROGRESS_BAR,
                    progress_d=PROGRESS_BAR_DISTRACTORS,
                    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,
                    model_name=DISTRACTOR_MODEL)

            # 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_DISTRACTORS.progress(100)
            LOGS.update(label='**Все готово! Готовые задания и/или онлайн-тест доступны в соответствующих вкладках.**',
                        state='complete', expanded=False)
            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, allow=SAVE_IN_CLOUD)

        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.rerun()

    # LABEL
    st.markdown('*Автор-разработчик: А.В.Белый, кафедра математической лингвистики, филологический факультет СПбГУ,'
                ' 3 курс, бакалавриат, "Прикладная, компьютерная и математическая лингвистика (английский язык)"*'
                '\n\n*Научный руководитель: канд. филол. наук, доц. О.А.Митрофанова*')
    st.markdown('*E-mail: st087202@student.spbu.ru*')
else:
    st.warning('**Войдите или зарегистрируйтесь**')