Задача CodeSearchNet была завершена
Мы хотели бы поблагодарить всех участников за их представления, и мы надеемся, что эта задача дала представление о практиках и исследователях о проблемах поиска семантического кода и мотивировала новые исследования. Мы хотели бы побудить всех продолжать использовать набор данных и человеческие оценки, которые мы сейчас предоставляем публично. Пожалуйста, см. Ниже для получения подробной информации, в частности, раздел оценки.
Никаких новых представлений о вызове не будет принято.
Оглавление
Если вы впервые читаете это, мы рекомендуем пропустить этот раздел и прочитать следующие разделы. Приведенные ниже команды предполагают, что у вас есть Docker и Nvidia-Docker, а также GPU, который поддерживает CUDA 9.0 или более. Примечание. Вам нужно запустить script/setup только один раз, чтобы загрузить данные.
# clone this repository
git clone https://github.com/github/CodeSearchNet.git
cd CodeSearchNet/
# download data (~3.5GB) from S3; build and run the Docker container
script/setup
# this will drop you into the shell inside a Docker container
script/console
# optional: log in to W&B to see your training metrics,
# track your experiments, and submit your models to the benchmark
wandb login
# verify your setup by training a tiny model
python train.py --testrun
# see other command line options, try a full training run with default values,
# and explore other model variants by extending this baseline script
python train.py --help
python train.py
# generate predictions for model evaluation
python predict.py -r github/CodeSearchNet/0123456 # this is the org/project_name/run_idНаконец, вы можете отправить свой пробег на эталон сообщества, следуя этим инструкциям.
Codesearchnet - это набор наборов данных и контрольных показателей, которые исследуют проблему поиска кода с использованием естественного языка. Это исследование является продолжением некоторых идей, представленных в этом сообщении в блоге, и является совместным сотрудничеством между GitHub и глубокой группой по пониманию программы в Microsoft Research - Cambridge. Мы стремимся предоставить платформу для исследований сообщества по поиску семантического кода через следующее:
Мы надеемся, что CodeSearchnet - это шаг к взаимодействию с более широким машинным обучением и сообществом NLP в отношении отношений между исходным кодом и естественным языком. Мы опишем здесь конкретную задачу, но мы ожидаем и приветствуем другие использование нашего набора данных.
Больше контекста относительно мотивации для этой проблемы находится в этом техническом отчете. Пожалуйста, цитируйте набор данных и задачу как
@article{husain2019codesearchnet,
title={{CodeSearchNet} challenge: Evaluating the state of semantic code search},
author={Husain, Hamel and Wu, Ho-Hsiang and Gazit, Tiferet and Allamanis, Miltiadis and Brockschmidt, Marc},
journal={arXiv preprint arXiv:1909.09436},
year={2019}
}
Основной набор данных состоит из 2 миллионов ( comment , code ) из библиотек с открытым исходным кодом. Конкретно, comment -это функция верхнего уровня или комментарий метода (например, Docstrings in Python), а code -это целая функция или метод. В настоящее время набор данных содержит Python, JavaScript, Ruby, GO, Java и PHP. На протяжении всего этого репо, мы ссылаемся на термины, которые докстронг и запросы взаимозаменяемо. Мы разделяем данные на поезда, проверка и тестирование, так что код из того же репозитория может существовать только в одном разделе. В настоящее время это единственный набор данных, на котором мы тренируем нашу модель. Сводная статистика об этом наборе данных можно найти в этой записной книжке
Для получения дополнительной информации о том, как получить данные, см. В этом разделе.
Метрика, которую мы используем для оценки, - это нормализованная дисконтированная кумулятивное усиление. Пожалуйста, обратитесь к этой статье для получения более подробной информации о оценке модели. Сценарий оценки можно найти здесь.
Мы вручную аннотировали результаты поиска для шести языков из 99 общих запросов. Этот набор данных используется в качестве данных Groundtruth только для оценки. Пожалуйста, обратитесь к этой статье для получения дополнительной информации о процессе аннотации. Эти аннотации использовались для вычисления баллов в таблице лидеров. Теперь, когда конкурс был завершен, вы можете найти аннотации вместе с комментариями аннотатора здесь.
Вы должны выполнить шаги настройки только один раз, чтобы загрузить данные и подготовить среду.
Из -за сложности установки всех зависимостей мы подготовили контейнеры Docker для запуска этого кода. Вы можете найти инструкции о том, как установить Docker в официальных документах. Кроме того, вы должны установить Nvidia-Docker для удовлетворения зависимостей, связанных с GPU. Для тех, кто новичок в Docker, этот пост в блоге предоставляет мягкое введение, ориентированное на науку о данных.
После установки Docker вам необходимо загрузить предварительно обработанные наборы данных, которые размещены на S3. Вы можете сделать это, запустив script/setup .
script/setup
Это создаст контейнеры Docker и загрузите наборы данных. По умолчанию данные загружаются в resources/data/ папку внутри этого репозитория, с описанной здесь структурой каталога.
Наборы данных, которые вы будете загружать (большинство из них сжали) имеют комбинированный размер всего ~ 3,5 ГБ.
script/console : script/console
/src . Вы можете отступить от/прикрепить к этому контейнеру, чтобы сделать паузу/продолжить свою работу.Для получения дополнительной информации о данных см. Подробности ниже, а также эту записную книжку.
Если вы запустили шаги настройки выше, у вас уже будут данные, и больше ничего не нужно сделать. Данные будут доступны в папке /resources/data этого репозитория с этой структурой каталога.
Данные хранятся в формате jsonlines. Каждая строка в несжатом файле представляет один пример (обычно функция с соответствующим комментарием). Приведенный пример одной строки показан ниже.
original_stringcodedocstringКод, комментарии и доктора извлекаются в специфическом языке, удаляя артефакты этого языка.
{
'code': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or \n"
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or \n"
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), 'v')",
'code_tokens': ['def',
'get_vid_from_url',
'(',
'url',
')',
':',
'return',
'match1',
'(',
'url',
',',
"r'youtu\.be/([^?/]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/embed/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/v/([^/?]+)'",
')',
'or',
'match1',
'(',
'url',
',',
"r'youtube\.com/watch/([^/?]+)'",
')',
'or',
'parse_query_param',
'(',
'url',
',',
"'v'",
')',
'or',
'parse_query_param',
'(',
'parse_query_param',
'(',
'url',
',',
"'u'",
')',
',',
"'v'",
')'],
'docstring': 'Extracts video ID from URL.',
'docstring_tokens': ['Extracts', 'video', 'ID', 'from', 'URL', '.'],
'func_name': 'YouTube.get_vid_from_url',
'language': 'python',
'original_string': 'def get_vid_from_url(url):n'
' """Extracts video ID from URL.n'
' """n'
" return match1(url, r'youtu\.be/([^?/]+)') or \n"
" match1(url, r'youtube\.com/embed/([^/?]+)') or "
'\n'
" match1(url, r'youtube\.com/v/([^/?]+)') or \n"
" match1(url, r'youtube\.com/watch/([^/?]+)') or "
'\n'
" parse_query_param(url, 'v') or \n"
" parse_query_param(parse_query_param(url, 'u'), "
"'v')",
'partition': 'test',
'path': 'src/you_get/extractors/youtube.py',
'repo': 'soimort/you-get',
'sha': 'b746ac01c9f39de94cac2d56f665285b0523b974',
'url': 'https://github.com/soimort/you-get/blob/b746ac01c9f39de94cac2d56f665285b0523b974/src/you_get/extractors/youtube.py#L135-L143'
}
Сводная статистика, такая как количество строк и гистограммы длины токена, можно найти в этой записной книжке
Shell Script /script/setup автоматически загружает эти файлы в каталог /resources/data . Вот ссылки на соответствующие файлы для видимости:
Ссылки S3 следуют этому шаблону:
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/bpython,java,go, php,javascript,ruby/zip
Например, ссылка для java :
https://s3.amazonaws.com/code-search-net/codesearchnet/v2/java.zip
Размер набора данных составляет приблизительно 20 ГБ. Различные файлы и структура каталогов объясняются здесь.
Для обучения нейронных моделей с большим набором данных мы используем комментарии документации (например, Docstrings) в качестве прокси. Для оценки (и таблицы лидеров) мы собрали суждения о актуальности человека о парах реалистичных запросов естественного языка и фрагментов кода. Теперь, когда задача была заключена, мы предоставляем данные здесь как .csv , со следующими полями:
URL в данных (см. Здесь).Мы призываем вас воспроизводить и расширять эти модели, хотя для обучения большинству вариантов занимает несколько часов (а некоторые занимают более 24 часов на экземпляре AWS P3-V100).
Наши базовые модели принимают параллельный корпус ( comments , code ) и научитесь получить фрагмент кода, учитывая запрос естественного языка. В частности, comments -это функция верхнего уровня и комментарии метода (например, DocStrings в Python), а code является целой функцией или методом. На протяжении всего этого репо, мы ссылаемся на термины, которые докстронг и запросы взаимозаменяемо.
Запрос имеет единый энкодер, тогда как на каждом языке программирования есть свой собственный энкодер. Доступными энкодерами являются нервные суммы слов, RNN, 1D-CNN, самоскрытие (BERT) и гибрид 1D-CNN+.
Диаграмма ниже иллюстрирует общую архитектуру наших базовых моделей:

Этот шаг предполагает, что у вас есть подходящий NVIDIA-GPU с установленным CUDA v9.0. Мы использовали экземпляры AWS P3-V100 (достаточно p3.2xlarge ).
Запустите среду запуска модели, используя script/console :
script/console
Это бросит вас в оболочку контейнера Docker со всеми установленными необходимыми зависимостями, включая код в этом репозитории, а также данные, которые вы скачали ранее. По умолчанию вы будете размещены в src/ папке этого репозитория GitHub. Отсюда вы можете выполнить команды для запуска модели.
Настройте W & B (бесплатно для проектов с открытым исходным кодом) в соответствии с инструкциями ниже, если вы хотите поделиться своими результатами на эталоне сообщества. Это необязательно, но настоятельно рекомендуется.
Точка входа в эту модель - src/train.py . Вы можете увидеть различные параметры, выполнив следующую команду:
python train.py --help
Чтобы проверить, работает ли все на небольшом наборе данных, вы можете запустить следующую команду:
python train.py --testrun
Теперь вы готовы к полному тренировке. Примеры команд для начала тренировок:
Обучение модели нейронной мешки слов на всех языках
python train.py --model neuralbow
Приведенная выше команда будет принять значения по умолчанию для местоположения (и) учебных данных и пункта назначения, где вы хотели бы сохранить выходную модель. Расположение по умолчанию для обучающих данных указывается в /src/data_dirs_{train,valid,test}.txt , Valid, test ).txt. Каждый из этих файлов содержит список путей, где существуют данные для соответствующего раздела. Если указано более одного пути (разделенного новой линией), данные от всех путей будут объединены вместе. Например, это содержимое src/data_dirs_train.txt :
$ cat data_dirs_train.txt
../resources/data/python/final/jsonl/train
../resources/data/javascript/final/jsonl/train
../resources/data/java/final/jsonl/train
../resources/data/php/final/jsonl/train
../resources/data/ruby/final/jsonl/train
../resources/data/go/final/jsonl/train
По умолчанию модели сохраняются в папке resources/saved_models в этом репозитории.
Обучение модели 1D-CNN только для данных Python:
python train.py --model 1dcnn /trained_models ../resources/data/python/final/jsonl/train ../resources/data/python/final/jsonl/valid ../resources/data/python/final/jsonl/test
Приведенная выше команда переопределяет местоположения по умолчанию для сохранения модели на trained_models , а также переопределяет источник поезда, валидацию и тестовые наборы.
Дополнительные примечания:
Параметры для --model в настоящее время перечислены в src/model_restore_helper.get_model_class_from_name .
Гиперпараметры специфичны для соответствующих классов модели/энкодера. Простой трюк, чтобы обнаружить их, - это начать пробег без указания выбора гиперпараметрических показателей, так как это напечатает список всех используемых гиперпараметров с их значениями по умолчанию (в формате JSON).
Мы используем эталон сообщества для этого проекта, чтобы поощрять сотрудничество и улучшить воспроизводимость. Он размещен в WeeSts & Mizees (W & B), который бесплатный для проектов с открытым исходным кодом. Наши записи в эталонной ссылке на подробные журналы наших метриков обучения и оценки, а также модельные артефакты, и мы призываем других участников предоставить как можно больше деталей.
Мы приглашаем сообщество представить свои пробежки на этот эталон, чтобы облегчить прозрачность, следуя этим инструкциям.
Мы ожидаем, что сообщество будет разработать пользовательские архитектуры и использовать рамки, отличные от Tensorflow. Кроме того, мы ожидаем, что дополнительные наборы данных будут полезны. Наше намерение интегрировать эти модели, подходы и наборы данных в этот репозиторий как суперсет всех доступных идей. Скорее, мы намерены поддерживать базовые модели и ссылки на данные в этом репозитории как центральное место. Мы принимаем PR, которые обновляют документацию, ссылку на ваш проект (ы) с улучшенными показателями, исправляют ошибки или вносят незначительные улучшения в коде. Вот более конкретные руководящие принципы для участия в этом хранилище; Обратите внимание, особенно наш кодекс поведения. Пожалуйста, откройте проблему, если вы не уверены в лучшем курсе действий.
Для инициализации W & B:
Перейдите к каталогу /src в этом репозитории.
Если вы впервые используете W & B на машине, вам нужно будет войти в систему:
$ wandb login
Вас будет спросить ваш ключ API, который отображается на странице настроек профиля W & B.
Лицензии на исходный код, используемые в качестве данных для этого проекта, предоставляются с загрузкой данных для каждого языка в файлах _licenses.pkl .
Этот код и документация для этого проекта выпускаются по лицензии MIT.