Мир и человечество развиваются и не стоят на месте, однако с течением времени растет не только прогресс, но и количество данных. Исследования любой из сфер нашей жизни требуют новых данных, и многие из них хранятся в текстовом формате. В связи с этим появляется большое количество методов обработки и генерирования текстовых данных: например перевод из одного языка в другой, генерирование текста, анализ текста и его распознавание, и многие другие задачи. Для использования любого из этих методов необходимо написать свою соответствующую программу, которая тоже является текстовыми данными.
Современные методы обработки естественного языка обеспечивают нам решение множества задач, связанных с текстом, но несмотря на это многие из таких методов не применялись ранее к техническим языкам, таким как языки программирования
Любая существующая программа написана на особенном языке программирования, который имеет свой собственный синтаксис. Каждый из таких языков можно трактовать как новый иностранный язык. С ними проводятся различные операции: это не только перевод и обработка языка, но и самостоятельное генерирование предложений, текстов, прогнозирование фраз по их началу. Похожий подход возможно использовать для того , чтобы облегчить написание кода и сократить время разработки продукта. Такой подход, позволяющий ускорить написание программы, называется автодополнением.
Проблема скорости написания кода часто встречается и остро стоит у профессионалов в данной области. Это связано с тем, что им необходимо писать похожие части кода из раза в раз. Для специалистов было бы полезно, если бы программа умела предугадывать и подсказывать наиболее подходящие слова, которые программист теоретически мог бы хотеть написать.
Автоматическое дополнение кода - технология,обеспечивающая интерактивный ввод кода, предсказывая его по уже введенной части. Она необходима в первую очередь для того, чтобы ускорить написание каких- либо шаблонных и наиболее часто употребляемых частей кода.
В данной дипломной работе будет рассмотрена проблема скорости написания кода. Способы ее решения будут заключаться в поиске специальных моделей, различных методов, уместности их применения, способах их улучшения, и сравнении их плюсов и недостатков.
Воплотить это в жизнь можно при помощи машинного обучения. Написание автодополнения — это трудоемкая задача. Каждый язык программирования имеет свою структуру и свои особенности, поэтому нужны особые наборы данных. В настоящей работе был выбран язык Python, который является одним из самых наиболее часто используемых языков, так как позволяет решать различные задачи : начиная от разработки программной части , заканчивая проектами по машинному обучению. Обучив технологию на одном языке, ее можно будет распространить на другой, заменив обучающее множество данных.
Решить задачу можно различными способами. Один из первых методов — генерирование последовательностей при помощи seq2seq мо- дели,чья архитектура реализована при помощи рекуррентных нейросетей глубинного обучения: на такой их разновидности как LSTM (long- short term memory). С развитием технологий появилась state-of-the-art модель BERT, соединяющая в себе идею маскирования токенов и архитектуру transformer. Она сделала прорыв в обработке естественного языка и показала важность авторегрессионных моделей, совмещающих прямой и обратный ход и учитывание контекста предложения.
Для практического применения в данной работе в основе будет рассмотрена модель BERT вместе со своими достоинствами и недостатками. Основой является идея маскирования токенов и их предсказывания по контексту, однако она не решает проблему влияния замаскированных токенов друг на друга. В связи с этим будет рассмотрена модель BISon, которая должна решить эту проблему, но эта модель применялась только к корпусу текста, не включая корпус кода. В работе будет рассмотрено применение данных архитектур к задаче автодополнения кода.
Актуальность работы
Актуальность работы обусловлена практическим аспектом поднятой проблемы. Сфера it-технологий с развитием мира и машинного обучения находится в стадии постоянного совершенствования. Практически каждый it-продукт связан с программированием и написанием кода соответственно. Ускорение написания кода поможет программистам тратить меньшее количество времени на создание продукта.
Автодополнение также помогает начинающим специалистам быстрее выучить язык, а опытным профессионалам ускорить изучение новых библиотек. Это связано с тем, что технология предлагает различные варианты дополнения одной и той же строки. Просматривая их, человек видит и запоминает разнообразие методов, предлагаемых языком. Открывая неизвестные ему методы, узнает новую информацию и улучшает свою квалификацию.
Цель и задачи работы
Цель работы: исследование различных нейросетевых методов для задачи автодополнения кода и генерирование новых методов на основе изученных.
Задачи работы:
• Изучить научную литературу по теме исследования;
• Рассмотреть популярные методы, используемые для генерирования текста;
• Рассмотреть применение существующих методов к задаче автодополнения кода;
• Сформулировать собственные идеи, которые можно использовать для автодополнения кода;
• Реализовать наиболее возможные в плане обучения идеи.
Было изучено множество различных архитектур для решения поставленной задачи. Выбранная для исследования архитектура BiSon содержит в себе важные идеи использования замаскированных токенов для выявления дополнительного контекста между ними, улучшающего результаты генерирования последовательностей.
Интересной также является идея векторного представления кода в виде деревьев, а в дальнейшем и в виде последовательностей, и ее использование совместно с другими архитектурами для автодополнения кода. Были получены теоретические алгоритмы, позволяющие это сделать. В результате проведенного эксперимента были получены положительные результаты, которые могут являться индикатором оправданности использования данной архитектуры.
Проведенные исследования показали, что методы и нейросети, применяемые для задач обработки естественного языка, также можно успешно перенести и расширить на класс задач, связанный с автодополнением кода.
[1] A Sherstinsky. Fundamentals of Recurrent Neural Network (RNN) and Long Short-Term Memory (LSTM) Network. — Access mode: https: //arxiv.org/abs/1808.03314 (online; accessed: 09.08.2018).
[2] Alammar Jay. Illustrated transformer. — 2018. —Access mode: http:// jalammar.github.io/illustrated-transformer/ (online; accessed: 27.06.2018).
[3] Alon U. Levy O. Brody S. Yahav F. code2seq: Generating Sequences from Structured Representations of Code. — Access mode: https:// arxiv.org/pdf/1808.01400.pdf (online; accessed: 04.08.2018).
[4] Devlin J. Ming-Wei Chang M. Lee K. Toutanova K. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding. — Access mode: https://arxiv.org/abs/1810.04805 (online; accessed: 11.10.2018).
[5] Kostadinov Simeon. Understanding encoder decoder sequence-to-sequence model. — 2019. — Access mode: https://towardsdatascience.com/understanding-encoder-decoder-sequence-to-sequence-model-679e04a: (online; accessed: 05.02.2019).
[6] Lawrence C. Kotnis B. Niepert M. Attending to Future Tokens For Bidirectional Sequence Generation. — Access mode: https://arxiv. org/abs/1908.05915 (online; accessed: 16.08.2018).
[7] Mittal Aditi. Understanding encoder decoder sequence-to-sequence model. — 2019. — Access mode: https://aditi-mittal.medium. com/understanding-rnn-and-lstm-f7cdf6dfc14e (online; accessed: 12.06.2019).
[8] Sutskever I. Vinyals O. Le Q.V. Sequence to Sequence Learning with Neural- Networks. — Access mode: https://arxiv.org/abs/1409. 3215 (online; accessed: 10.09.2014).
[9] Vaswani A. Shazeer N. Parmar N. Uszkoreit J. Jones L. Gomez A. Kaiser L. Polosukhin I. Attention Is All You Need. — Access mode: https: //arxiv.org/abs/1706.03762 (online; accessed: 12.06.2017).