Skip to content

Instantly share code, notes, and snippets.

@pavlov200912
Last active November 11, 2021 14:28
Show Gist options
  • Save pavlov200912/ec2d2a93a3fc72aafb8df54bdcf1b207 to your computer and use it in GitHub Desktop.
Save pavlov200912/ec2d2a93a3fc72aafb8df54bdcf1b207 to your computer and use it in GitHub Desktop.
Отчет по проекту осень 2021

Comment Updater. Report Autumn 2020.

Про что проект?

Данные проект - попытка создать инструмент для определения comment inconsistency. Это ситуация, когда разработчик обновил код, но забыл обновить комментарий. Из-за таких несоответсвий усложняется читаемость и поддерживаемость кода.

Задача не новая, существует несколько статей, которые описывают различные подходы решения. Но на данный момент нет прикладного решения, которое можны было бы, например, использовать в современных IDE.

С другой стороны, существующие решения, в основном описывают rule-based подход (Решение о том, что комментарий устарел принимается на основе эмпирически выведенных правил, например если тип функции поменялся, а в комментарии есть прямое указание типа - его точно нужно поменять). Такие алгоритмы часто имеют недостатки, например у них могут возникнуть трудности при использовании другого языка программирования, стилизации или языка комментария. Совсем недавно (Октябрь 2020) вышла новая статья, предлагающая использовать методы машинного обучения, которые уже несколько лет популярны в задачах Natural Language Processing (далее NLP). (Сноска для знающих: авторы статьи испольщуют LSTM encoders вместе с MultiHead Attention & Self Attention для создания векторов из последовательности изменений кода и токенов комментария, далее вектор переходит в полносвязный слой и выдается ответ) . Это первая подобная статья, а значит задача не исследована до конца и представляет научный и прикладной интерес.

Именно подход, использующий техники NLP и машинного обучения, применяется в данном проекте для решения задачи.

Кто? Где?

Из студентов в команде я один, проектом руководит Зарина Курбатова (JetBrains Research) и Тимофей Брыксин (JetBrains Research), активно помогает Егор Богомолов (JetBrains Research).

Кому оно надо?

Из постановки задачи можно понять, что реализованный проект будет полезен многим разработчикам. Особенно забывчивым, которые не меняют свои комментарии (я среди них).

Задача

Глобальная задача проекта - исследовать и реализовать подходы обноружения и устранения comment inconsistency. В переспективе учебного года хотелось бы написать рабочий алгоритм обнаружения и обернуть его в плагин для Intellij Idea.

Как организована работа?

Каждую неделю я трачу 10+ (в среднем, наверное, 14) часов, чтобы решить задачу, которую выдал руководитель. Каждый четверг мы созваниваемся по видеосвязи (я, Зарина, Егор и иногда Тимофей) и обсуждаем: что я сделал, кто виноват, что мне делать дальше, кому на руси жить хорошо.

А что ты уже сделал?

  • Сначала я изучил существующие решения и статьи на данную тему.
  • После этого, я попробовал написать первые классификаторы для датасетов, которые собраны авторами статей на похожие темы. Классификаторы не обучались и не показывали хорошее качество. (Конкретнее - я писал простые классификаторы по типу SVM, kNN, которые использовали в качестве признаков предобученные эмбеддинги для кода и комментария. А также пробовали использовать LSTM сети и полносвязный слой для классификации).
  • Потом я написал классификаторы для других данных, уже размеченных руками и воспроизвел результат из другой статьи, получилось хорошее качество для этой задачи F1-score около 80. Попробовал перенести такую же модель обучения на первые данные - полное фиаско.
  • Мы решили, что нужно точнее определиться с данными и понять, с какими датасетами мы работаем на самом деле (опять же - они собраны не нами и не для этой задачи).
  • Последние две недели я изучаю данные, нахожу в них аномалии фильтрую и преобразовываю их к нужному виду. (Конкретнее - мне нужно использовать Byte pair encoding или похожие техники, чтобы убрать из данных шумные слова по типу isvector, которые на самом деле несколько слов)

А что неужели это так трудно?

На самом деле - да. Лично для меня, как для студента 3-го курса это сложная задача. (Глобально, кажется, это тоже сложная задача) Мне помогает, что NLP последние два года - моя любимая тема в программировании и у меня уже был опыт применения методов машинного обучения из NLP в своих проектах.

Когда я выбирал проект я понимал, что машинное обучение в JetBrains Research это трудно и в этом проекте нужно самому узнавать, искать и использовать совсем неочевидные вещи. Я надеюсь, что на данный момент я справляюсь со своей задачей. По-крайней мере, я уделяю этому много времени и старания.

Кроме этого, очень большая трудность - нет данных. Никто не собирал датасет для этой задачи, кроме авторов одной статьи, но они еще не выложили данные и код в открытый доступ (хотя обещали).

Чем ты пользуешься?

Программирую я все на Python. Когда обучал нейронки использовал Tensorflow. В целом, стандартные алгоритмы, техники и фреймворки для машинного обучения и анализа данных. В таком проекте важнее не инструменты программирования как таковые, а подходы и методы решения задачи. (Например понять уже написанные статьи было совсем не просто, потому что чего там только нет: LSTM, GRU, Attention (self, global, local), Embeddings, LCA, SWUM, Point Network, Gated Graph Sequence NN достаточно сложных слов?)

Можно код посмотреть?

Конечно, вот моя коллекция ноутбуков JetBrains-Research/comment-updating

Так как итогового алгоритма классификации пока нет, ноутбуки пока не преобразованы в файлы с кодом.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment