423,4K подписчиков

Генерируем рецепты блюд на JS и цепях Маркова

Автор: Iskorkin Оригинальный материал.

Автор: Iskorkin Оригинальный материал. Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента.

Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента. Вероятно, действительно это была простенькая нейросеть вроде RNN или LSTM. К сожалению, последний пост в паблике датирован 2019 годом, а моя тяга к изысканным блюдам не угасла, поэтому было решено сделать генератор рецептов на JS и цепях Маркова. Почему не повторить эксперимент с более продвинутой доступной нейросетью вроде GPT-2? Потому что для ее обучения требуется достаточно много времени, ресурсов и данных.

Чтобы генерировать рецепты, мы будем использовать цепи Маркова — математическую модель, которая может предсказывать следующий элемент в последовательности на основе предыдущих. Для начала нам нужно собрать корпус данных — набор рецептов на определенную кухню. Затем мы обучим цепь Маркова на этом корпусе данных и будем генерировать новые рецепты на основе полученной модели. Да, про цепи Маркова было достаточно много статей и на Хабре, и вне его. Но меня восхищает простота реализации этого алгоритма, а результаты генерации веселят. Мы будем использовать простую реализацию, чтобы получить быстрый результат, а в конце статьи будут приведены лучшие из сгенерированных рецептов. Готовим корпус.

Когда-то у меня уже был собран датасет на 3000~ строк из кучи рецептов. Если мне не изменяет память, это результат парсинга одной из кулинарных групп в ВК. В txt файле все рецепты разделены пустыми строками.

Синхронно считаем данные, приведем к строке, и, разделим ее на массив абзацев по пустым строкам с помощью \n\n.

Корпус готов!

Разбираемся с Марковым.

Как и упоминалось в введении, будем использовать математическую модель цепей Маркова. Это модель, которая предсказывает следующий элемент в последовательности на основе предыдущих. В контексте генерации рецептов на основе цепей Маркова мы будем использовать модель, которая будет предсказывать следующее слово в рецепте на основе предыдущих слов. Для этого мы будем использовать статистический подход, который будет анализировать частоту встречаемости слов в корпусе данных и использовать эту информацию для генерации новых рецептов.

Для примера возьмем два заголовка, которые будут условным корпусом: “Тосты с сельдью и огурцом” и “Тосты с анчоусами и грецкими орехами”.

Представим матрицу переходов для этих предложений:

Следуя этой матрице, после слова “Тосты” с вероятностью 100% будет идти “с”, а вот после “с” с вероятностью в 50% может идти либо “сельдью”, либо “анчоусами”. Очевидно, что чем больше корпус — тем больше вариантов и тем больше статистический разброс.

Реализация.

Для начала соберем объект токенов в конструкторе класса генератора. Знаки препинания будут включаться в токены, а регистр букв останется оригинальным. Во-первых, это упростит токенизацию, во-вторых сделает абзацы более корректными.

Изначально tokens будет содержать ключ START для сбора стартовых слов. В процессе итеративно пройдем по всем элементам корпуса, разделив их по пробелу. Далее, работая с каждым словом по отдельности, будем добавлять их в качестве ключей в tokens, а следующее слово помещать в массив свойства этого ключа. Если же следующего слова нет, будет помещаться ключевое слово END, которое в дальнейшем будет сигнализировать генератору о том, что абзац сформирован.

Автор: Iskorkin Оригинальный материал. Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента.-4

Если залогировать получившийся объект tokens, он будет иметь такой вид:

Автор: Iskorkin Оригинальный материал. Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента.-5

Вы можете заметить, что токены могут повторяться. Мы их оставляем в таком виде, чтобы сохранить статистические вероятности. Например, после токена ‘муке’ с вероятностью в 75% будет идти ‘и’, а ‘ (20’ или ‘ (30’ с вероятностью в 7.5% соответственно.

Для генерации нового текста берем случайное стартовое слово. После, в цикле while, выбираем случайные слова для текущего токена и вставляем их в массив результата, пока не наткнемся на END. В конце возвращаем результат в виде строки, соеденив элементы массива пробелами.

Автор: Iskorkin Оригинальный материал. Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента.-6

В конце концов, можно протестировать:

Автор: Iskorkin Оригинальный материал. Когда-то меня очень радовал один паблик в соцсети ВК. По заявлениям администрации нейросеть генерировала рецепты, которые и составляли 99% контента.-7

Вместо заключения, отправляемся на кухню.

Самые забавные на мой взгляд получившиеся результаты:

ИНГРЕДИЕНТЫ: ● оливковое масло — перемешиваем. Для получения однородной массы. Каждое печенье достать из черного перца 1 чайная ложка. Готовим: Плавленый сырок нарезать и убрать форму. В центр выложить яблоки в духовке минут на 30-40 минут до 180 градусов и разровнять в салатник. Все мы будем добавлять муку, добавить мед — 0, 5 чайной ложки соевого соуса. Даем остыть и добавляем муку. Хорошенько перемешиваем курицу в предварительно добавить мед и я использовала замороженные ягоды, перед подачей на сметане без костей, ● лук, ● чеснок, ● оливковое масло и даем настояться 15-20 минут. Замечательное кунжутное печенье на 15-20 минут на средней терке. Колбасу и 1 шт. Кунжут — 3 шт, морковь натираем на пару часов или ужина. Особенно он превращается в разогретую до готовности. 💞 Салат «Венеция» Ингредиенты: ● 350-400 г. оливок; ● 60 г. слабосоленой семги; ● 40-50 г. слабосоленой семги; ● 40-50 г. куриной тушки. соль ИНГРЕДИЕНТЫ: ● 1 ст. л. Огонь нужно развести водой и потушить еще 65 минут. Подаем сырный суп с солью и морковь, покрывая весь салат. Из яичного белка. Приятного аппетита! Ингредиенты: 1 банка (140 г.); ● майонез. Приготовление: Лук очистить от Светланы Гуаговой Натереть рыбу сыром. Нарезаем полукольцами луком, смазывать им гостей. Готовится торт что-то простое в духовке. Выпекать булочки 25-30 мин до полного застывания. Обжарить печень с картофелем, готов. Приятного аппетита, радуйте своих близких, предлагаю попробовать приготовить и, не советую) ИНГРЕДИЕНТЫ: ● Свежий (500г) не суп!

Подпишись на наш блог, чтобы не пропустить новые интересные посты!

Пост автора Timeweb.Cloud.

Узнать, что думают пикабушники.