Подход машинного/глубокого обучения к прогнозированию фрагментов языка программирования

Представляем команду, стоящую за нашим проектом Data Associate Program (DAP)!

Наставник: Яр Кхин Пхё

Участники: Ав Кхай Лун, Феличе Пнг, Ли Ю Хао, Бингю Яп

Наша группа хотела бы искренне поблагодарить Phyo за его поддержку и опыт в течение семестра, этот проект был бы невозможен без его руководства.

Как мы начали...

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

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

Это краткое изложение нашего конвейера, и мы подробно расскажем об этом ниже!

Обратите внимание, что мы пытались предсказать языки C, HTML, Java, PHP, Python и Ruby. (поскольку функции достаточно различны, чтобы мы могли их предсказать)

Набор данных

Поскольку у нас нет структурированных наборов данных, которые мы могли бы легко использовать, мы решили вручную извлечь данные из репозиториев github с помощью Beautiful Soup.

Процесс парсинга

Сначала мы начали парсить наиболее распространенные языки кодирования, просматривая опросы Stack Overflow. После чего мы удалили все имена репо в HTML и начали клонировать репозитории с Github (например: мы клонировали репозитории python с https://github.com/trending/python?since=monthly.)

Предварительная обработка

Как только мы получили текстовые данные, мы поняли, что слова бесполезны для нас, если мы не можем преобразовать их в полезные числовые данные, которые можно использовать в наших моделях.

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

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

Важно отметить, что обучающий и тестовый наборы были разделены до обучения модели, чтобы модель не могла изучить какие-либо сигналы из тестового набора (чего не должно быть!)

Машинное обучение

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

В целом, мы получаем вполне приличные результаты от наших моделей:

Глубокое обучение

Предварительная обработка

Однако мы решили пойти еще дальше, чтобы посмотреть, смогут ли модели глубокого обучения лучше изучать тенденции из словаря токенизатора. В частности, нас беспокоило то, что наш конвейер машинного обучения был смоделирован просто набором слов и не мог учиться на основе порядка токенов, поэтому мы решили использовать нейронные сети, чтобы увидеть, сможем ли мы получить лучший результат.

Для этого мы решили использовать готовый токенизатор (Keras tokenizer), который разделял бы символы вместо слов. Мы сделали это, потому что чувствовали, что нейронные сети смогут извлечь больше информации из присутствующих персонажей.

После этого мы заполнили последовательности, чтобы учесть разную длину файлов, а затем сделали одно горячее кодирование, чтобы преобразовать информацию в числовые данные для использования в нашей модели долговременной кратковременной памяти (LSTM)!

Модель LSTM

Мы использовали слои LSTM, а также плотные слои, чтобы позволить нейронным сетям правильно учиться на данных во входном слое.

Из LSTM мы получили точность 96,88%! Неплохо! Здесь следует отметить 2 вещи.

Во-первых, кажется, что наша модель ML со случайным лесом работает намного лучше, чем наша модель LSTM, показывая, что большое количество нейронных сетей, возможно, обучались некоторому шуму вместо того, чтобы фактически изучать тенденцию данных, что приводит к немного более низкой точности.

Что еще более важно, кажется, что все результаты наших тестов относительно высоки (> 90%). Это, хотя и кажется обнадеживающим, может просто означать, что наша модель смогла предсказать новые данные из кода github и не обязательно может привести к хорошей точности для фрагментов кода в целом. Это важный момент, на который следует обратить внимание, поскольку точность результата также следует учитывать в контексте, в котором он измеряется.

Поэтому, поскольку трудно увидеть, применимы ли результаты к реальной жизни, мы попытались развернуть и протестировать нашу модель.

Развертывание

Мы хотели развернуть нашу модель, чтобы все могли ее опробовать! Для этого мы сохранили нашу модель с помощью библиотеки Pickle, а затем создали приложение Streamlit, которое могло считывать ввод пользователя и выполнять классификации с использованием сохраненной модели. После этого мы докеризовали наше приложение Streamlit и развернули его на AWS EC2.

Улучшения, на которые стоит обратить внимание

Мы отметили, что когда мы проверяли результаты на новых результатах тестов, нам удалось получить достойные результаты, однако нам может потребоваться извлечь данные из большего пула репозиториев, а также получить данные за пределами GitHub, чтобы успешно получить надежный классификатор языка программирования. .

Репозиторий кода

Не стесняйтесь обращаться к нашему репозиторию github по адресу https://github.com/awwkl/github-DAP!

Мы приветствуем любые предложения / будущие улучшения проекта! :)