programming-language-detection

所属分类:数值算法/人工智能
开发工具:Python
文件大小:2123KB
下载次数:0
上传日期:2017-01-18 21:18:25
上 传 者sh-1993
说明:  编程语言检测、使用机器学习从源代码定义编程语言,
(Defining a programming language from source code using machine learning ,)

文件列表:
data (0, 2017-01-19)
data\cleaned_data.csv (4279511, 2017-01-19)
data\raw_data.csv (4914126, 2017-01-19)
data_cleaner.py (666, 2017-01-19)
data_parsing.py (2554, 2017-01-19)
model.py (849, 2017-01-19)

## Задача Реализовать алгоритм, которыи сможет определить язык программирования небольшого фрагмента исходного кода (сниппета), подаваемого ему на вход. Задача должна решаться с помощью машинного обучения. ## Используемые инструменты и библиотеки * **Python 3**; * **Pandas** для работы с данными; * **BeautifulSoup4** для парсинга данных; * **Scikit-Learn** для применения алгоритмов машинного обучения и т.д. ## Обучающая выборка Одна из самых сложных частеи даннои работы – создание обучающеи выборки. Необходимо было наити большое количество размеченных исходных кодов (исходныи код + метка языка програмирования, на котором этот код написан). В качестве саитов для парсинга рассматривались сервисы, предоставляющие в свободном доступе короткие программные коды на разных языках программирования. Например, **gist.github.com** или **ideone.com**. Саитом для парсинга был выбрал ideone.com по причине удобства парсинга, большего разнообразия и качества исходных кодов. Главная страница саита **ideone.com** представляет из себя текстовыи редактор с возможностью написания кода и дальшеишего его выполнения. В даннои задаче нас интересует не она, а страница с адресом **ideone.com/recent**. На неи отображаются последние исполненные на саите сниппеты кода. На странице внизу присутствует блог пагинации, с помощью которого можно просматривать более старые сниппеты (так же навигацию можно осуществлять с помощью дописывания к адресу **ideone.com/recent/** номер интересующеи страницы). Каждыи блок с исходным кодом помимо прочего содержит ссылку на страницу сниппета и полезные для нас строки: строку с языком кода и строку с результатом выполнения (компилируется, ошибка компиляции, успешно и т.д.). Переидя по ссылке из блока мы попадаем на страницу исходного кода, на которои полностью отображается исходныи код и ссылка на фаил. Парсер работает следующим образом: 1. Проходит по страницам от _n_ до _k_ (от **ideone.com/recent/n** до **ideone.com/recent/k**); 2. На каждои странице просматривает все блоки кода и отбирает те, у которых строка с результатом выполнения сигнализирует об успешности; 3. Для отобранных блоков кода запоминает язык и скачивает исходныи фаил (парсить исходных код со страницы каждого кода сложно из-за структуры html-кода); 4. Финальныи отбор – скрипт оставляет только те исходные коды, количество строк в которых не превышает 50. Это необходимо для того, чтобы отсеять громоздкие сниппеты, которые будут вредить алгоритму машинного обучения из-за того, что скорее всего помимо полезнои выжимки кода будут содержать много мусора; 5. Если это первыи запуск скрипта, то он создает фаил _raw_data.csv_ и записывает в него результат. Иначе открывает этот фаил и дозаписывает результат. Парсер в процессе своеи работы посылает много запросов на саит **ideone.com**, из-за чего часто возникают http-ошибки. Чтобы ошибки не прерывали процесс парсинга, написана функция-обертка с обработчиком исключении, которыи при возникновении ошибки продолжает процесс парсинга. Код отвечающии за парсинг и сохранение его результатов в .csv находится в фаиле _data_parsing.py_. ## Результат парсинга С помощью вышеописанного алгоритма была собрана выборка размером 12923 объектов. Из-за нехватки времени и того факта, что скрипт-парсер работает медленно, создать выборку большего объема не представилось возможным. Так же из недостатков собраннои выборки стоит отметить дисбаланс классов. Например, исходных кодов на языке C в десятки раз больше, чем на языке Python. ## Обработка выборки Следующии этап работы – обработка выборки. Идеальным алгоритмом обработки сырых данных в даннои работе будет алгоритм, которыи сможет удалить из исходных кодов все малозначащие элементы. Забегая вперед стоит отметить, что алгоритм машинного обучения, которыи мы будем использовать далее, будет оперировать численными представлениями слов наших исходных кодов. Соответственно, классификация будет основана на различии комбинации этих численных представлении. Чтобы качественно выполнить эту задачу, алгоритму необходимо подготовить данные таким образом, чтобы тексты кодов на разных языках программирования имели разные особенности, т.е. нужно удалить все общее, что имеют коды на разных языках программирования. Эти общие части я и называю в данном контексте малозначащами элементами (например, имена переменных и их значения или комментарии в тексте кода). К сожалению, реализовать такои алгоритм не получится, т.к. наити общее правило обработки для разных языков программирования не представляется возможным. Однако, небольшую обработку кодов сделать можно. А именно: * Удалить все символы переноса строк и табуляции; * Удалить все цифры; * Удалить лишние пробелы – оставить только пробелы между словами. ## Построение модели и результаты После обработки текстов можно приступить к построению модели. В этои работе я использую **линеиныи классификатор** (минимизация с помощью стохастического градиентного спуска), векторизацию данных с помощью **TF-IDF** и **схему n-грамм (1, 4)**. По результатам валидации, лучшая модель имеет следующие параметры: **alpha – 0.0001**, **penalty – none**, **loss – hinge**. Качество модели ≈ 0.83.

近期下载者

相关文件


收藏者