Я смотрел на свой экран, и там, зеленым цветом на моем черном фоне 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. Есть несколько способов обойти это.
Спасибо, что зашли так далеко! Мы также сделали доступным веб-приложение, в котором мы будем добавлять интерактивные способы использования этих небольших моделей. И мы уже добавили модель, которую вы только что видели. Вы можете проверить это здесь". Пожалуйста, сообщите нам свое мнение. Мы скоро вернемся с еще одним интересным постом и алгоритмом. А пока до свидания!