Введение
С каждым годом ЕГЭ по русскому языку становится все сложнее и сложнее. Так, например, в 2022 году увеличили материал для проверки умения производить пунктуационный анализ в девятнадцатом задании и расширили спектр возможных заданий в номере шестнадцать, где требуется раскрытие скобок в предложениях, а в 2021 году усложнили девятый номер: если в предыдущие годы корневая гласная, которую следовало отнести с одной из трёх групп была в слове пропущена, то в КИМах последующих годов в словах не будет пропусков, это значит, что c этого момента выпускникам нужно самостоятельно определять корень слова и решать, есть ли в нём искомый тип гласного. В связи с этим, возрастает количество необходимых часов, уделённых на подготовку к этому экзамену.
С 01.09.20 во всех российских школах был введён новый образовательный стандарт (ФГОС) — профильного общего образования. Это привело к тому, что у многих десятиклассников и одиннадцатиклассников появились большие временные промежутки между уроками и, соответственно, свободное время, которые они вынуждены проводить в школе. А это, в свою очередь, отличная возможность для подготовки к предстоящему экзамену.
Для подготовки в школе смартфон подходит больше всего ввиду его компактности и портативности. Чтобы готовиться к ЕГЭ с помощью телефона можно выбрать разные способы: приложения, браузер или бот. Приложения требуют свободное место в памяти, сайты браузера для подготовки на телефоне не удобны, ведь эти сайты предназначены для персональных компьютеров, а вот боты не обладают такими недостатками: они есть в уже установленных на большинстве телефонах мессенджерах, которые были созданы для смартфонов.
Самым подходящим мессенджером для такого бота является Telegram, так как он является самым популярным среди целевой аудитории бота — школьников.
На сегодняшний момент существует несколько telegram ботов для подготовки к единому государственному экзамену по русскому языку, и у каждого из них есть один серьёзный недостаток — невозможность выбора задания для подготовки. Эти боты случайным образом выбирают одно из двадцати шести заданий и отправляют его пользователю. Такой способ выдачи заданий нельзя назвать удобным, ведь очень часто человеку нужно подтянуть определённые номера. Также немаловажным недостатком таких ботов является недостаточная проработанность или полное отсутствие статистики правильности ответов пользователей. Только у одного уже существующего бота есть возможность просмотра своей статистики, но эта статистика хранит только общий процент верности ответов, что не позволяет проанализировать, с какими номерами возникает больше всего трудностей.
Исходя из вышеописанного можно сформулировать проблему: необходимость использования специальных приложений, занимающих память телефона, или сайтов, неудобных для применения на смартфоне, для подготовки к ЕГЭ.
Для решения проблемы была поставлена цель — создание telegram бота для подготовки к ЕГЭ по русскому языку, в котором возможно выбирать номер задания для подготовки и который способен собирать, обрабатывать и выводить личную статистику верности ответов пользователя.
Для достижения этой цели были поставлены следующие задачи:
Зарегистрировать бота;
Заполнить базу данных;
Создать базовые функции для работы бота;
Описать особенности вывода условия задачи и обработки ответа пользователя для каждого номера;
Создать систему изменения, хранения и вывода статистики
Регистрация бота необходима для того, чтобы получить доступ к серверам Telegram, которые отправляют сообщения.
База данных необходима для любого бота, которому нужен доступ к большому количеству информации. В этом случае данные нужны для условий заданий, ответов на них, а также статистики пользователей.
Под базовыми функциями подразумеваются те функции, без которых работа бота невозможна, поэтому они обязательны.
В ЕГЭ по русскому языку достаточно много разных типов заданий, поэтому бот должен по-разному принимать и выводить информацию, соответственно нужно описать каждый из этих типов.
Статистика записывается в базу данных sqlite с помощью библиотеки sqlite3, далее ее можно выводить и менять этой же библиотекой.
Основная часть
Теоретическая часть.
Работу бота можно описать следующим образом: человек пишет команду “/start”, после этого, для хранения информации о нём, создаются две строки в разных таблицах базы данных. В одну из них записываются telegram ID пользователя и его текущий статус, тем самым эти два параметра связываются между собой; это необходимо для того, чтобы бот знал кому и что надо писать. В другую строку записывается тот же ID, а также начальная статистика. Статистика в чистом виде представляет собой достаточно длинную строку таблицы базы данных с количеством правильных и неправильных на каждый номер ответов, данных пользователем. Начальная статистика у всех одинаковая — строка нулей.
Каждый пользователь сначала получает статус “MAIN”, а после того, как он выбрал задачу, ему присваивается другой статус — “TASK” с номером на конце. Получив его, человеку отправляется условие случайной задачи из базы данных для выбранного им номера. Ответившему на вопрос пользователю сообщается его результат, который также записывается в базу данных, далее ему опять присваивается статус “MAIN”.
Для претворения в жизнь данных задумок были выбраны python библиотеки sqlite3 и telebot. С помощью sqlite3 выполняются специфические запросы к базе данных SQLite, а telebot способствует взаимодействию с серверами telegram.
Чтобы сделать бота нужно использовать документации необходимых библиотек. Ссылки на них находятся в списке источников (документация к telebot, документация к sqlite3).
Практическая часть.
Для регистрации и наименования бота я написал @BotFather в телеграме (см. список источников), этот бот выдаёт специальный “токен”, который, по сути, является паролем от вашего собственного бота. Этот набор символов нельзя никому разглашать, иначе сторонние лица получат доступ к изменению поведения бота.
После получения токена была создана база данных SQLite с помощью приложения SQLiteStudio. В этой базе данных будут хранится всё что нужно для работы бота.
Далее были созданы главные таблицы “statuses” и “stats”. В “statuses” были добавлены столбцы “id” и “status”, чтобы для каждого пользователя хранилось его текущее состояние, а в “stats” - 55 столбцов: “id”, “tc”, “ti”, “t1c”, “t1i”, “t2c”, “t2i” и так далее до 26-ого номера включительно. Название столбцов таблицы “stats” расшифровываются следующим образом: “tc” - общее количество данных пользователем правильных ответов, “ti” — общее количество неправильных; “t{номер задания}c”, “t{номер задания}i” — то же самое, но для каждого номера. Структуры таблиц представлены на рисунках 1 и 2.
Рисунок 1
Рисунок 2
Структура таблицы “stats”, ввиду её однотипности и большого объёма, была создана программным путём. Код, написанный для создания данной таблицы изображён на рисунке 3. Переменная “blank”, создаваемая на третей строке, выполняет роль шаблона. Этот шаблон используется в последующем цикле (строки 4-6): в него вставляются номер задания, обозначение правильного и неправильного номера. Затем эти шаблоны добавляются к строке “STAT_INFO”, которая была объявлена ранее. После исполнения цикла создаётся список “f” (строка 7), хранящий в себе переменную “STATS_INFO”, но с четким разделением каждого наименования столбца. В дальнейшем производится соединение с базой данных и создаётся “исполнитель”, который способствует изменению базы данных (строки 9-10). Ранее сформированный список “f” перебирается циклом (строки 12-14). Каждый объект списка последовательно используется в специальной строке, принимаемой методом “execute” нашего “исполнителя”. Эта строка — команда SQLite, которая добавляет колонку к таблице. В конце (строка 15) просто сохраняются ранее совершённые изменения.
Рисунок 3
Основные строки, импортирующие функционал библиотек и создающие экземпляры классов этих библиотек можно лицезреть на рисунке 4. “config”, импортирующийся на 3 строке, является обычным py файлом. В нём хранится токен и путь к базе данных.
Рисунок 4
Затем, для возможности регистрации в боте, была написана функция “send_welcome”. Структура и содержание функции находятся на рисунке 5. Первые две линии данной функции создают две начальные строки базы данных для пользователя. Далее этому же пользователю отправляется приветственное сообщение, объясняющее назначение бота.
Рисунок 5
После написания функции “send_welcome”, была описана функция “send_statistic”. Код функции представлен на рисунке 6. Переменная “msg”, которая объявлена на 84 строке, заполняется всей статистикой циклом (строки 91-100) и отправляется пользователю. Перед началом цикла проверяется, начинал ли пользователь выполнять задания. Если начинал, то цикл выполняется, а если нет, то отправляется соответствующее сообщение. В самом цикле есть три условных оператора: “if”, “else”, “elif”. Они нужны для предотвращения деления на ноль при расчёте статистики. Само отправление статистики и исполнение тела функции “send_statistic” происходит при использовании пользователем команды “stats”.
Рисунок 6
В “send_statistic” можно заметить написанные мной ранее функции “two_digit_percent_normalize” и “matrix_grouping”, их коды представлены на рисунках 7 и 8 соответственно.
Изображённая на рисунке 7 функция принимает на вход число с одни или двумя знаками после запятой (модуль числа меньше одного) в обычном для python формате, а возвращает его же, но в виде процентов. К примеру, из числа 0,1 получается 10. На первой строке данной функции срезается начало любого числа такого типа — “0,”, далее, исходя из длины оставшейся части числа, возвращается необходимый процент: если длина равна единице, то просто возвращается этот остаток с нулём на конце; если длина равна двум и начало остатка является нулём, то возвращается второе число остатка; если предыдущие условия не исполняются, то остаток возвращается без изменений.
Рисунок 7
“matrix_grouping” просто принимает на вход список с длиной чётной двум и возвращает этот же список, но с каждыми двумя объектами, объединёнными в другой список. Тем самым получается список со множеством других списков внутри.
Рисунок 8
Далее началось написание самой объёмной функции — “task_choice”. Эта функция отвечает за выбор номера задания. В ней описываются условия и формат отправки той или иной задачи. Большой объём данной функции объясняется разнообразностью условий заданий самого единого государственного экзамена по русскому языку. Суть работы функции можно описать следующим образом: если пользователь пишет номер от одного до 26 включительно, то его статус в таблице базы данных “stats” меняется на соответствующее значение — “TASK” и номер задания, затем с помощью команды sqlite производится запрос к базе данных для получения информации о случайном упражнении данного номера, далее эти данные вставляются в определённый шаблон для заданий заданного типа и отправляются пользователю; если же пользователь вводит что-то кроме номера задний, то ему отправляется сообщение о том, что бот ожидает от него. С фрагментом функции можно ознакомиться на рисунке 9.
Рисунок 9
Во время работы над вышеупомянутой функцией были сделаны другие — “get_status” и “status_change”. Эти функции представлены на рисунках 10 и 11 соответственно.
“get_status” просто возвращает статус определённого пользователя, принимая в качестве аргумента его id. Функция нужна для того, чтобы сделать код более понятным и компактным.
Рисунок 10
“status_change” меняет статус пользователя, принимая в качестве аргументов новый статус и id. По сути, функция просто сокращает длину кода и делает его более читабельным.
Рисунок 11
Далее началась последовательная настройка работы бота с каждым номером. Для каждого задания заполнялась таблица в базе данных, описывалась отправка его условий и метод проверки правильности ответа.
Первым функционирующим номером в боте был номер четыре — задание на ударения. Для заполнения базы данных был взят текст с сайта https://ctege.info/russkiy-yazyik-teoriya-ege/orfoepicheskiy-slovnik-minimum-ege-po-russkomu-yazyiku.html. Этот текст был продублирован в текстовый редактор, затем считан, обработан и вставлен в таблицу sqlite-документа. Для этого была написана программа, фрагмент которой представлен на рисунке 12. Переменная “b” хранит ссылку на список строк скопированного, необработанного текста. В этом тексте есть как и строки с одним словом, так и с двумя через тире. Условные операторы в коде предназначены как раз для того, чтобы каждое из этих слов добавлялось в базу данных.
Рисунок 12
Другой фрагмент данной программы находится на рисунке 13. Это функция, которая определяет ударный слог введённого в неё слова, при условии, что ударная гласная слова находится в верхнем регистре. Осуществляется это посредством определения количества безударных гласных перед ударным.
Рисунок 13
После заполнения необходимых для номера данных, нужно было добавить в ранее упомянутую функцию “task_choice” условия перехода пользователя к заданию четыре. Таким условием является получение от занимающегося сообщения “4”. Если текущий статус пользователя “MAIN”, и он пишет боту цифру четыре, то начинает исполняться фрагмент кода, изображённый на рисунке 14. На 135 строке используется ранее описанная функция “status_change”, меняющая статус на “TASK4”. Далее осуществляется запрос случайного элемента базы данных, информация о котором хранится в переменной “task_data”. В данном случае в “task_data” находятся слово и номер ударного слога. Затем пользователю отправляется шаблон с вставленным в него словом: “На какой по счету слог падает ударение в слове {место для слова}?”.
Рисунок 14
После изменения статуса поведение бота меняется. Выполняемый затем код находится на рисунке 15. На первой строке фрагмента объявляется статус, при котором для обработки ответов пользователя будет использоваться функция ниже. Далее проверяется введённый боту ответ. Осуществляется это посредством обычного сравнения текста сообщения и верного ответа. Если ответ пользователя неправильный, то он об этом оповещается и информация об этой ошибке записывается в базу данных с помощью “statistic_update”. Если же ответ совпадает с верным в таблице, то пользователь также оповещается и его статистика обновляется. После внесения изменений в таблицу со статистикой, статус отправителя меняется на первоначальный.
Рисунок 15
Следующий работающим упражнением был пятый номер из ЕГЭ по русскому языку, задание с паронимами. Информация для него была взята с сайта https://paronymonline.ru/ege.html. Так же, как и с номером четыре, информация для номера была занесена в базу данных программным путём. Фрагмент кода написанной для этого программы находится на рисунке 16. Изменённый для удобства текст из источника хранится в переменной “red_inf”. “red_inf” — список, содержащуюся им информацию можно описать следующим образом: первый его элемент — это строка с двумя или более словами через дефис — самими паронимами; следующие элементы, количество которых равняется количеству слов первого элемента — определения для паронимов. Этот список перебирается последовательно двумя циклами (строки 13-15 и 19-20). В первом цикле заполняется словарь “gr”, который нужен для того, чтобы знать сколько слов хранится в элементе, перечисляющем паронимы. Во втором цикле производится непосредственная работа с базой данных. Наличие в перебираемом элементе знака “-” свидетельствует о том, что начинается следующая связка паронимов; а значит, что нужно добавить в базу данных информацию о предыдущей, если же дефиса нет, то продолжается заполнение предыдущей связки.
Рисунок 16
Структура таблицы пятого номера представлена на рисунке 17.
Рисунок 17
Структура пятого номера является самой простой и это связано с тем, что при настройке этого задания было решено попробовать сделать задания более случайными и разнообразными. Формулировка задания в боте отличается от формулировки в едином государственном экзамене по русскому языку, она больше нацелена на понимание отличий паронимов одного типа: в ЕГЭ нужно просто заменить неправильно употреблённое слово, в моём же боте пользователю нужно сопоставить определения с похожими словами. Фрагмент кода, отвечающего за переход к номеру пять представлен на рисунке 18. Весь этот код можно разделить на три части: обработка информации из базы данных (строки 141-152), случайное распределение слов и определений (строки 153-169), составление верного ответа для перемешанных слов и определений (строки 170-173). Для перетасовки в этом номере была частично импортирована библиотека “random”.
Рисунок 18
Далее была описана функция обработки ответов на пятое задание, она практически не отличается от функции с тем же назначением для четвёртого задания. С этой функцией можно ознакомиться на рисунке 19.
Рисунок 19
Стремление к разнообразию заданий привело к сильному усложнению кода, поэтому было решено отказаться от него: во всех остальных номерах был сделан упор на усложнение структур таблиц, что благоприятно повлияло на компактность и быстроту действия бота.
После окончательной настройки пятого задания добавление номеров было последовательным, то есть следующим был первый. Таблица для этого номера заполнялась вручную, и формулировка была точно такой же, как и в ЕГЭ по русскому языку. В базу данных добавлялись не целые условия, они делились на колонки. В данном случае это были “text”, “test”, “answers”. Это было сделано для того, чтобы не заполнять таблицы лишней информацией, одинаковой для всех задач данного типа. Структура этой таблицы представлена на рисунке 20.
Рисунок 20
Условие перехода к первому номеру, то есть фрагмент кода за это отвечающий, находится на рисунке 21. Сильных отличий от переходника к четвёртому номеру тут нет, только шаблон условия задачи (строки 114-118), который подстроен под первый номер.
Рисунок 21
Ну, в принципе, как и с условием перехода, обработчик ответов первого номера схож с обработчиком четвёртого. Убедиться в этом можно, посмотрев на рисунок 22. Фактически, отличается он только тем, что вместо четвёрочек стоят единички и что изменён индекс ответа в полученном ответе базы данных.
Рисунок 22
Дальнейшая работа над ботом была более-менее стандартизирована: таблицы для заданий заполнялись вручную, переходники к номеру отличались только условиями задач, а обработчики так и вообще циферками. Исключения были только у номеров с неоднозначностью ответов. Под неоднозначностью подразумевается наличие разных правильных ответов. Неоднозначность, например, есть во втором номере ЕГЭ по русскому языку, в котором нужно подставить недостающую частицу.
Для обработки неоднозначных ответов была написана специальная функция “is_all_in”. Код функции расположен на рисунке 23. Суть функции проста - сообщить, все ли элементы первого списка есть во втором. Для осуществления задумки была применена рекурсия, то есть функция вызывала сама себя. Первым условием было полное сходство списков. Если списки равны, то не имеет смысла их проверять - элементы первого схожи со вторым. Иначе начинал исполнение блок с рекурсией. Выходом из неё были условия на строке 34 и 39, а рекурсивным случаем - строка 36. Функция последовательно проверяла последние элементы первого листа: если элемент был во втором списке, то рекурсия продолжалась, если не было - прерывалась с последующим выводом “False”, если же первый список был пуст, то выводилось “True”.
Рисунок 23
Отличие обработчиков заданий с неоднозначными ответами было только одно — использование “is_all_in” для сравнения текста сообщения, полученного от пользователя, и ответа, хранящегося в базе данных.
Однотипное добавление номеров продолжалось до 22 задания. Именновнёмпроизошлаошибка, оповещениеокоторыйбылотаким— “(__init__.py:688 MainThread) ERROR - TeleBot: "A request to the Telegram API was unsuccessful. Error code: 400. Description: Bad Request: message is too long"”. Еёпричинауказанавконце — “message is too long”, чтопереводитсякак “сообщениеслишкомдлинное”. Это неудивительно, ведь ограничение по длине сообщения в Telegram — 4096 символов, когда в условии двадцать второго номера единого государственного экзамена по русскому языку находится достаточно объёмный фрагмент текста (около 4100 символов).
Для решения этой проблемы сначала было решено следующее: с помощью самодельной программы размещать условия задач на картинках, сохранять их в специальную папку на компьютере, а затем записать путь к каждому изображению в таблицу базы данных с ответами.
Чтобы вставлять текст в картинку была написана программа, фрагмент которой изображён на рисунке 24. Для работы с изображениями использовалась библиотека “PIL”. Также была написана функция “add_line_breaks”, которая переносила строки, исходя из размера изображения.
Рисунок 24
Но перед началом работы над вышеупомянутой программой не было учтено, что Telegram сжимает картинку, из-за чего текст становится неразборчивым. Поэтому нужно было отправлять достаточно большое количество картинок, что не очень удобно. В связи с этим пришлось отказаться от данной задумки.
Другим более удачным решением этой проблемы стало обычное разделение сообщения на две последовательно отправляемые части. Для этого была написана функция “dividing_msg_into_parts”, представленная на рисунке 25. Она просто делит текст на две примерно равные в данном случае части и выводит их в виде кортежа.
Рисунок 25
Функция применяется в обработчиках от двадцать второго до двадцать шестого заданий. Пример использования “dividing_msg_into_parts” представлен на рисунке 26.
Рисунок 26.
В связи с отсутствием важного функционала у нынешних ботов для подготовки к единому государственному экзамену по русскому языку была поставлена цель — создание telegram бота для подготовки к ЕГЭ по русскому языку, в котором возможно выбирать номер задания для подготовки и который способен собирать, обрабатывать и выводить личную статистику верности ответов пользователя.
В результате проделанной работы были выполнены все поставленные задачи:
С помощью самого мессенджера был зарегистрирован бот.
Программным и ручным путями заполнена база данных.
Созданы базовые функции для работы бота.
Описаны особенности вывода условия задачи и обработки ответа пользователя для каждого номера.
Создана система изменения, хранения и вывода статистики.
Выполнение поставленных задач способствовало достижению цели.
Проблемы виртуального общения [Электронный ресурс] / Леонтович О. А. // Полемика. – No 7. – 2000. http://www.irex.ru/press/pub/polemika/07/leo.
Михайлов В.А. Особенности развития информационно –коммуникативной среды современного общества / В. А. Михайлов, С. В.
Михайлов // Сборник научных трудов «Актуальные проблемы теории коммуникации». СПб. – 2004.
Плешаков В. А. Киберсоциализация человека в информационном
пространстве / В. А. Плешаков // Информация и образование: границы
коммуникаций INFO'2009: Сборник научных трудов – Горно–Алтайск:
РИОГАГУ, – 2009.
Ушакова Г. Д. Особенности виртуального общения посредством
чатов / Г. Д. Ушакова, Ю. В. Балабанова // Филологический журнал:
межвузовский сборник научных статей. – 2004. – Вып. XII.
Телеграм - https://web.telegram.org/
Документация к telebot - https://core.telegram.org/bots/api
Документация к sqlite3 - https://docs.python.org/3/library/sqlite3.html