Я смотрел на свой экран, и там, зеленым цветом на моем черном фоне VSCode, было следующее: `^(http|https|ftp):[\/]{2}([a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,4})(:[0-9]+)?\/?([a-zA-Z0-9\-\._\?\,\'\/\\\+&%\$#\=~]*) Я мог понять, что это, возможно, говорит о каком-то шаблоне URL. Но что это значит? Я чешу затылок. Один, два, много раз. Нет ответа. StackOverflow не будет очень полезным, поскольку у меня есть RegEx, и я хочу понять его цель. Не наоборот. Что мне делать? Я мало что знал, кроме того, что углублялся в эту загадочную строку и пытался понять ее по частям. "Уф". Я пробормотал: «Я бы хотел, чтобы это было проще. У меня приближается крайний срок. У меня действительно нет времени ».

Это моя история снова и снова. Сколько раз я проклинал предыдущего разработчика оставить после себя серию таинственного наследия RegEx? Я даже не умею считать. Джейми Завински верно сказал,

Некоторые люди, столкнувшись с проблемой, думают: «Я знаю, я буду использовать регулярные выражения». Теперь у них две проблемы.

Так родилась идея Codist AI. Мы хотели помочь разработчикам быстрее вводить исходный код. Мы используем машинное обучение и теорию традиционного языка программирования для экспериментов с несколькими задачами меньшего размера и обучающими моделями на них.

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

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

Хорошо, без лишних слов, давайте погрузимся в алгоритм.

Ну не совсем. Сначала нам нужно взглянуть на данные. Данные - одна из наиболее важных частей построения модели глубокого обучения. Итак, приступим.

Данные

Мы используем набор данных, предоставленный вместе со статьей, опубликованной в 2016 году Николасом Локашио и др. Цель статьи была прямо противоположна тому, что мы делаем здесь. Переход от намерения к RegEx. Это конкретное исследование имеет долгую историю, и мы настоятельно рекомендуем вам просмотреть исходную статью, чтобы узнать о нем больше.

Данные и код из этой статьи (частично на Python и Lua) можно найти в сопровождающем репозитории Github.

После получения данных и выполнения некоторой предварительной обработки (вы можете проверить код предварительной обработки в колабе, который я упомянул выше), если мы посмотрим на окончательный результат и выберем один случайный {X, Y} (что означает Источник и Target) кортеж из него, тогда он может выглядеть так:

RegEx =>\ b ( [ <CAP> ] ) & ( [ <VOW> ] ) \ b 
Intent => lines that have words containing a capital letter as well as a vowel

Мы заменили обычные выражения RegEx, такие как A-Z или AEIOUaeiou, на <CAP> или <VOW>. Фактически, мы заменяем все подобные выражения RegEx специальными символами. Ради нормализации модели. Мы также токенизируем регулярное выражение, чтобы позже, когда мы будем использовать какой-то считыватель данных для чтения, было легче разделить каждый символ. Таким образом, у нас будет (надеюсь) меньший словарный запас.

Эта предварительная обработка в значительной степени следует за предварительной обработкой исходной бумаги.

Модель

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

SimpleSeq2Seq(
  (_source_embedder): BasicTextFieldEmbedder(
    (token_embedder_tokens): Embedding()
  )
  (_encoder): PytorchSeq2SeqWrapper(
    (_module): LSTM(256, 256, num_layers=3, batch_first=True, dropout=0.25)
  )
  (_attention): LinearAttention(
    (_activation): Tanh()
  )
  (_target_embedder): Embedding()
  (_decoder_cell): LSTMCell(512, 256)
  (_output_projection_layer): Linear(in_features=256, out_features=230, bias=True)
)

Как видите, это сеть Seq2Seq с одним исходным и одним целевым встраиванием, трехуровневым LSTM в качестве кодировщика и однослойным LSTM в качестве декодера. А также мы используем классический механизм внимания Bahdanau в декодере.

Если все вышеперечисленное звучит для вас немного незнакомо, я бы посоветовал вам взглянуть на Официальное руководство PyTorch по Seq2Seq, или, если вы действительно хотите глубоко погрузиться, я не могу порекомендовать достаточно пройти открытый курс из Стэнфорда. », Которым учил не кто иной, как сам Кристофер Мэннинг!

И последнее: мы активно используем AllenNLP в CodistAI. И я не могу вспомнить время, когда этой библиотеки не было, и я делал всю беспорядочную предварительную обработку текстовых данных вручную. Какой ужас! Так что спасибо всей команде AllenNLP. Ребята, молодцы!

Тренировка

Мы обучили эту модель для 100 эпох, но с patience = 10 (что означает, что тренажер AllenNLP автоматически остановит обучение, если потеря проверки не уменьшилась в течение 10 смежных эпох). В нашем случае, похоже, модель достигла пика на 23-й эпохе. И, конечно же, обучение прекратилось после 32 эпох.

Результат

Теперь, когда обучение закончено, настало время для некоторых прогнозов. Мы выбрали первые 30 примеров из набора для проверки и выполнили на нем прогнозы. Результат выглядит многообещающим. И, если я осмелюсь сказать, иногда прогнозы модели на самом деле лучше, чем золотой стандарт. Но также в некоторых случаях прогнозы не так хороши. Как и в случае с любым продуктом, основанным на глубоком обучении, нам нужно сделать гораздо больше, прежде чем мы сможем достичь еще лучшего результата.

Вот несколько образцов

Соответствие -

Prediction => lines with words ending with a number before lower - case letter
Gold => lines with words ending with number before lower-case letter

Лучше -

Prediction => lines with the string < M0 > before a vowel and the string < M1 > at least once in them
Gold => lines with the string <M0> before a vowel and string <M1>

Худший -

Prediction => lines with the string < M0 > followed by 2 capital letters
Gold => lines with the string <M0> followed by a capital letter , 6 or more times in them

Честно говоря, единственное, что хуже в последнем - это то, что вместо 6 в предсказании говорилось 2. Есть несколько способов обойти это.

Спасибо, что зашли так далеко! Мы также сделали доступным веб-приложение, в котором мы будем добавлять интерактивные способы использования этих небольших моделей. И мы уже добавили модель, которую вы только что видели. Вы можете проверить это здесь". Пожалуйста, сообщите нам свое мнение. Мы скоро вернемся с еще одним интересным постом и алгоритмом. А пока до свидания!