Нейронные сети для генерации новых грамматик языка программирования - PullRequest
8 голосов
/ 15 мая 2019

Недавно у меня возникла необходимость создать грамматику языка ANTLR для целей транспилятора (преобразования одного языка сценариев в другой).Мне пришло в голову, что Google Translate довольно хорошо переводит естественный язык.У нас есть всевозможные модели рекуррентных нейронных сетей, LSTM, и GPT-2 генерирует грамматически правильный текст.

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

Ответы [ 3 ]

6 голосов
/ 25 мая 2019

Я сомневаюсь, что такая модель существует.

Основная проблема заключается в том, что languages генерируется из grammars, и преобразование обратно практически невозможно из-за бесконечного числа parser trees (комбинаций), доступных для различных исходных кодов.

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

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

Ваш пример Google translate работает для реального перевода, поскольку допустимы небольшие ошибки, но эти модели не основаны на создании корневой грамматики для каждого языка. Есть некоторые инструменты, которые могут переводить языки программирования пример , но они не генерируют грамматику, работают на основе грамматики.

Обновление

Как выучить grammar у code.

После сравнения с некоторыми концепциями НЛП у меня есть список вопросов, которые могут возникнуть, и способ борьбы с ними.

  • Работа с variable names, coding structures и tokens.

    Для понимания грамматики нам придется разбить код на минимум. Это означает понимание того, что означает каждый термин в коде. Посмотрите на этот пример

Syntax tree

Уже простое выражение сводится к дереву разбора. Мы можем видеть, что дерево разбивает выражение и tags каждое число как factor. Это действительно важно, чтобы избавиться от человеческого элемента кода (например, имен переменных и т. Д.) И погрузиться в реальную грамматику. В НЛП эта концепция известна как Часть речевого тегирования . Вам нужно будет разработать свой собственный метод для создания тегов, поскольку это легко, если вы знаете грамматику для языка.

  • Понимание отношений

    Для этого вы можете tokenize сокращенный код и обучаться, используя модель, основанную на результате, который вы ищете. Если вы хотите написать код, используйте модель n grams, используя LSTM, например, пример . Модель выучит грамматику, но ее извлечение не простая задача. Вам нужно будет запустить отдельный код, чтобы попытаться извлечь все возможные отношения, изученные моделью.

* ** тысяча шестьдесят одна тысячи шестьдесят-дв * Пример * +1063 *

Фрагмент кода

# Sample code
int a = 1 + 2;
cout<<a;

Метки

# Sample tags and tokens
 int      a          =         1       +       2       ;
[int] [variable] [operator] [factor] [expr] [factor] [end]

Оставление operator, expr и keywords не должно иметь значения, если имеется достаточно данных, но они станут частью грамматики.

Это образец, чтобы помочь понять мою идею. Вы можете улучшить это, если глубже взглянуть на Теорию вычислений и понять работу automata и различных grammars.

2 голосов
/ 05 июня 2019

То, что вы описываете, - это «просто» структура обучения грамматик без контекста.

Я не уверен, что этот подход действительно сработает для вашего случая, но в НЛП это давняя проблема: введение грамматики для контекстно-свободных грамматик .Пример вступления о том, как решить эту проблему с использованием статистических методов обучения, можно найти в Статистическом изучении языка .

Чарниака. Обратите внимание, что то, что я описал, касается CFG в целом, но вы можете проверитьиндукция для грамматик LL, потому что генераторы синтаксического анализатора в основном используют эти типы грамматик.

0 голосов
/ 05 июня 2019

Я ничего не знаю о ANTLR, но есть довольно хорошие примеры перевода естественного языка, например в действительные запросы SQL: http://nlpprogress.com/english/semantic_parsing.html#sql-parsing.

...