Данный проект является частью курсовой работы (2020 год) студента 1 курса магистратуры ОП "Анализ больших данных в бизнесе, экономике и обществе" НИУ "Высшая Школа Экономики" (СПб)
по теме "Тестирование веб-приложений с использованием машинного обучения"
Основная идея проекта: подробные (и говорящие) названия функций и аргументов заводятся разработчиками скорее для самих же себя в будущем (для читаемости кода). Однако эти же названия можно использовать и автоматического для поиска ошибок в коде. За основу взят алгоритм, разработанный компанией Google на основе нейронных сетей, Word2Vec. Он преобразует слова в векторное представление в зависимости от своего контекста употребления в обучающей выборке. Изначально этот алгоритм использовался для анализа новостей, однако в данном проекте применен для анализа кода.
- scripts - папка с js скриптами (это сырые данные, которые анализируем)
- scripts-parser - содержит код, который преобразует js скрипты из папки scripts в машиночитаемый формат для дальнейшего анализа
- ast - Abstract Syntax Tree
- tokenizer - создаёт данные-токены, чтобы после скормить их Word2Vec моделе
- word2Vec - содержит код для построения модели Word2Vec на python
- shared - вынесенные константы и ряд функций python
- function-based-bug-detector - применение модели Word2Vec для поиска неправильно использованных аргументов в функциях
В проекте используется Python и Typescript на Node.js:
- Typescript:
- Разбиение скриптов, написанных на Javascript, на токены (нужны для построение Word2Vec модели)
- Извлечение из скриптов, написанных на Javascript, Abstract Syntax Tree (нужно для применения Word2Vec модели и поиск багов)
- Python:
- Построение Word2Vec модели и написание алгорита для её применения
Шаги установки по typescript + nodeJS:
- Скачать и установить Node.js
- Устновить typescript командой в консоле:
npm install -g typescript
- Открыть терминал исполнить npm-команду
(для этой и всех последующих npm команд данного README использовать терминал от корня репозитория):
npm install
Шаги установки по Python:
- установить Python 3
- Открыть терминал и исполнить:
pip3 install pandas numpy json gensim multiprocessing tqdm
Нужно положить все интересуемые js-файлы в папку scripts ЛЮБОЙ вложенности (парсер сам найдёт js-файлы, которые лежат в папке, которая в папке, что завернута в папку ...).
Замечание: не существует ограничения на максимальную вложенность, но существует условие на минимальную: парсер будет ждать, что внутри scripts будут папки с названиями репозиториев (это нужно в дальнейшем, чтобы не возникало конфликтов в одинаковых названиях функциях между репозиториями). Поэтому если у вас просто много js-файлов, которые нужно проверить, без какой-либо вложенности, то внутри папки scripts создайте папку с любым названием и положите туда все эти js-файлы.
В качестве примера туда сложены уже файлы некоторых репозиториев, написанных на js.
Парсер настроен таким образом, что он игнорирует директории начинающиеся с точки или с названием node_modules.
В данной работе файлы брались с 150k Javascript Dataset.
Вне зависимости от выбранного типа парсинга - результаты будут сложены ./data
в формате json
npm run tokenize
Так как это весьма ресурсозатратная операция, то скорее всего дефолтных 1.5 гига у ноды не хватит. Для таких целей есть следующая команда (делает тоже самое, но использует больше ресурсов системы):
npm run high-memory-tokenize
Результат: разбивает код на слова (при этом проставляет каждому слову тип).
Это будет много json, с именами tokenized-scripts_{какая-та цифра}.json
Через Abstract Syntax Tree из скриптов js получилось извлечь места:
- где функции объявлялись (название самой этой функции и названия аргументов этой функции)
- где функции использовались / вызывались (также названия функций и названия аргументов)
Чтобы нода взяла необработанные никак скрипты из папки ./scripts
и извлекла нужную информацию,
необходимо исполнить npm-команду:
npm run ast-function-arguments
также существует команда, которая даст тот же результат, но будет использовать больше ресурсов системы
npm run high-memory-ast-function-arguments
Результат: ./data/ast-functions.json
Для построения данной модели нужно открыть файл ./word2Vec/buildWord2vecModel.ipynb
.
Результат выполнения данного скрипта (построенная модель) - word2Vec/word2VecModel
Скачать готовую модель можно здесь по ссылке
Внутри ./function-based-bug-detector
лежит блокнот в котором объяснен и реализован алгоритм по поиску
потенциально опасных моментов в использованиях функциях, объявленных разработчиков.
Он основан на предыдущем шаге 3 (использует построенную модель word2Vec).