Махалин С. А.
Полетайкин А. Н.
Кубанский государственный университет
г. Краснодар
Использование нейросети для распознавания
рукописного программного кода в учебных целях
В статье рассмотрены возможности внедрения современных
технологий в учебную сферу. Использование искусственных нейронных сетей может
очень облегчить работу преподавателей, а также обеспечить дополнительную
детализацию при рецензировании работы и помочь дать обучающимся больше
рекомендаций для улучшения работы, которые они обязательно закрепят, если будут
постоянно их допускать.
Makhalin S.
A.
Poletaikin
A. N.
Using a neural network to recognize handwritten program code for
educational purposes
The article considers the possibilities of
introducing modern technologies into the educational sphere. The use of
artificial neural networks can greatly facilitate the work of teachers, as well
as help give students more details and tips for their mistakes, which they will
definitely fix if they constantly make them.
Введение. Современные
технологии существенно облегчают работу людей во всех сферах народного
хозяйства. Это касается и сферы образования. Для преподавателя важно обучить
студентов важным навыкам, особенно если это касается университетов, которые
дают студентов профессиональные навыки. Например, важно не только правильно
писать программы, но и соблюдать определённые правила «хорошего стиля» в них.
Однако существует проблема, которая
касается любого преподавателя. Обучающихся очень много, что требует
значительных временных затрат на проверки их письменных работ преподавателем
вручную. Во время проверки работ простые человеческие факторы могут повлиять на
объективную оценку качества написанного кода. Однако дать знания всем является его
долгом.
Итак, в таком случае выходит наиболее
простой выход: осуществлять проверку письменных работ при минимальном участии
преподавателя в ней. Лишь благодаря отсканированным копиям работ возможно
провести полную оценку и дать конструктивное мнение по поводу работоспособности
программы, а также стиля её написания.
Обзор подобных решений. Данная задача не
нова и в целом сводится к задаче распознавания рукописного текста. Особенности
задачи заключаются в распознавании программного кода, имеющего специфические
синтаксис и семантику.
В работе [1] были применены технологии по
распознаванию языка программирования в файле с точностью выше 99%. Автор работы
реализовал это с применением технологии Keras
и Tensorflow. Основной метод заключается в том, что
вместо использования word2vec для создания встраивания слов символы квантуются
(превращаются в один горячий вектор), а затем документ представляется
последовательностью квантованных символов (векторов). По заявлению в
документации его проект может быть использован для определения языка через
фрагменты кода, и было подготовлено для этого путем разделения файлов на
фрагменты. Нейросеть способна распознавать 16 языков, среди них XML, Java, Python, C++, go, PHP, SQL и др.
В работе [2]
было представлено исследование на развёрнутую тему по оптимизации и улучшению
программного обеспечения путём анализа исходного кода на наличие ошибок. Это
допускает разноплановые ошибки, начиная от повышения производительности и энергопотребления
и заканчивая отладкой и безопасностью. С применением технологий глубокого
обучения это предполагается реальным, но в таком случае необходим правильный
выбор в техники реализации, используемой при выполнении данной задачи.
С этой целью было
проведено обсуждение последних разработок в области глубокого обучения распознавания
исходного кода, анализа кода, и сосредоточиться на методах сопоставления ядра
на гетерогенных платформах, выделяя последние результаты, проблемы и
возможности их применения в киберфизических системах.
Частой практикой при одобрении merge
request’ов в компаниях-разработчиках ПО являются линтеры. Линтеры – это
программы, выявляющие стилистические ошибки, которые программист обязан не
допускать. Код должен не только качественно работать, но и быть читабельным для
будущих исправлений и доработок. В качестве примера рассмотрим способ
реализации pipeline с применением линтерами. В работе [3] представлена
реализация такого pipeline для внедрения в любительский проект, при котором в
каждом push, отправленном на github-сервер, будет произведен ряд шагов. При их
исполнении pipeline уведомит пользователя о корректности синтаксиса и стиля
кода, а также успешного прогона пакета unit-тестов, если таковые имеются у
пользователя в проекте. В этой работе используется внешний линтер cpp-linter,
который осуществляет проверку стиля написания программного кода. Это
тривиальный пример того, как линтеры используют в промышленном программировании
в крупных IT компаниях.
Когда речь заходит о стиле программного
кода, важно понимать, что такой опыт не заканчивается на школьных и
университетских задачах. Подавляюще большое время при работе в компании
уделяется изучению чужого кода. Если он будет написан сложно, не имея никаких
аннотаций, то бизнес может застопориться. Поэтому такой навык крайне важен для
студента или школьника, желающего стать программистом в будущем. Рассмотрим на
тривиальном примере, какие вредные привычки часто используются учащимися при
написании программ.
Среди наиболее встречающихся плохих привычек учащихся есть такие, которые совершал каждый поначалу: некорректные названия переменных. По таким переменным невозможно понять, что они значат, и какой цели служат. В маленьких программах, например, как на рис. 1, несложно понять. Однако когда в файле очень много кода, в котором и так сложно что-то понять, такие не вызывающие никаких первоначальных мыслей об имеющейся семантике переменные только увеличивают время изучения программы.

Рис. 1 – Простой пример рукописного кода
Также важным аспектом является
обязательность соблюдения корректности табуляции и пробельных символов.
Нейросеть может самостоятельно их проставить, однако правильнее будет ставить
их только при определённом расстоянии между буквам и числами. Они не должны
быть слишком близко, чтобы в итоге заострять большое на себе внимание,
заставляя вглядываться, пытаясь в уме разделить их между собой.
Программирование – это не только о
работоспособности и оптимальности, но и о хорошем стиле. В корректно написанном
коде гораздо меньше шанс обнаружить ошибку, ведь уделяется большое количество
времени на рефлексию над стилем написанной работы, а если она и будет
обнаружена, то найти её будет гораздо проще, когда всё чисто и структурировано.
Постановка задачи. Изначально имеются сканы или изображения работ, которые должны пройти процесс распознавания с помощью нейронной сети и проанализированы линтером. На выход будут получены замечания о допущенных ошибках в синтаксисе, либо, если таких нарушений нет, замечания о стиле кода. Фактически, задачи сводится к набору датасетов для обучения нейронной сети, а также создания процесса, при котором полученный код будет обрабатываться линтером. Следующая схема описывает этот процесс.

Рис. 2 – Общая схема решения задачи
Таким образом можно получить
автоматизированный способ проверки работ учащихся, которые успешно можно
внедрять в обучающую программу, снижая давление на преподавателей в процессе
работы. Стоит отметить, что этот метод также применим для конкурсов, экзаменов,
тестирования и прочего. Примеры возможного использования обширны. Главное, что
это внесёт вклад в развитии учащихся и учёбы в целом.
Решение. Для получения
датасетов при обучении нейросети можно использовать много внешних источников,
таких как Kaggle [4], GitHub
[5] и
другие. Среди них датасеты для обучения искусственной нейронной сети на
распознавание текстов, состоящих из английского алфавита, русского алфавита,
цифр, основных символов: круглые и квадратные скобки, плюса, равно и т.д. Структура
датасетов следующая: имеется изображение в виде входных файлов. Поступая на
искусственную нейронную сеть, происходит обработка полученных данных. После
чего нейросеть выдаёт результат, который в соответствии с её структурой
нейронов будет считаться верным. В датасете также есть колонка с правильным
результатом. Обучение нейронной сети будет происходить с использованием языка
программирования Python и пакетов,
использующихся для упрощения работы с ним, таких как numpy, pandas, sklearn,
keras и пр. При этом если ответ не соответствует выходному результату, то
происходит оценка ошибки и пересмотр нынешних весов искусственной нейронной
сети.
Существуют готовые варианты существующих
линтеров для языка программирования C++. Среди таких
будут использоваться Cpplint и Cppcheck. Однако изначально эти линтеры не
удовлетворяют желаемым потребностям, так как имеют очень много лишнего
функционала в части проверки программного кода, что не так уж и необходимо в
условиях обучения. Чтобы не затруднять работу преподавателя, такие части необходимо
убрать самостоятельно. Среди таких ошибок: перенос строки в конце программы,
перенос перед открывающей операторной скобкой, корректное расположение пакетов
и библиотек и так далее.
Вывод. В результате была разработана
схема выполнения поставленной задачи на основе искусственной нейронной сети. Выполнен
анализ существующих подобных компьютерных разработок. На основе внешних
источников рассмотрены датасеты для обучения нейронной сети по распознаванию
текстов, чисел, знаков пунктуации. Изменены и использованы существующие линтеры
cpplint и cppcheck, которыми в последствии будет осуществляться проверка
программного кода, распознанного искусственной нейронной сетью.
Таким образом можно получить готовый
вариант программы, с помощью которого возможно решать простые, но трудоёмкие
проблемы преподавателей в обучении студентов и школьников. Это облегчает
процесс проверки, приближая причастность преподавателя в работе к минимуму, не
допуская неточностей и случайных помарок из-за невнимательности в силу разных обстоятельств.
В дальнейшем планируется реализация полнофункциональная
программная реализация искусственной нейронной сети для распознавания
рукописного программного кода с целью проверки при помощи переработанных
линтеров.
Литература:
1. Deep Learning Programming Language Detection. : [сайт] – 2019. – URL: – https://github.com/aliostad/deep-learning-lang-detection
(дата обращения 13.12.2022). – Текст : электронный.
2. Deep Learning Approaches to Source Code Analysis for Optimization
oа Heterogeneous Systems / F. Barchi, E. Parisi, A. Bartolini,
A. Acquaviva; Department of Electrical, Electronic, and Information Engineering
“Guglielmo Marconi” (DEI). – Bologna: MDPI, 2022. – с.1-13. : [сайт] – 2022. – URL: – https://www.mdpi.com/2079-9268/12/3/37
(дата обращения 15.12.2022). – Текст : электронный.
3.
C/C++ Linter Action. : [сайт] – 2022. – URL:
– https://github.com/cpp-linter/cpp-linter-action (дата обращения
13.12.2022). – Текст : электронный.
4.
Handwriting
Recognition. : [сайт] – 2020. – URL: – https://www.kaggle.com/datasets/landlord/handwriting-recognition?datasetId=818027
(дата обращения 11.12.2022). – Текст : электронный.
5. Распознавание
рукописного текста в школьных тетрадях. [сайт] – 2021. – URL: –
https://github.com/sergak0/text-recognition/blob/main/README.md (дата обращения
11.12.2022). – Текст : электронный.