Узнайте о моделях Маркова и обратите внимание на разницу в сложности между случайными фразами, генерируемыми моделями первого порядка, и моделями второго порядка. В этом руководстве предполагается, что у вас есть серьезный опыт программирования на Python и JavaScript.

Я знаю, что это длинный урок. Вот основные пункты, которые мы рассмотрим:

  • Введение в марковские модели первого и второго порядков
  • Подготовка (анализ и очистка) наших данных
  • Обучение модели первого порядка
  • Обучение модели второго порядка
  • Создайте веб-API, который генерирует случайные фразы, используя любую из моделей (Flask - минимальный фреймворк на Python для обслуживания API)
  • Создайте простой пользовательский интерфейс, который позволяет пользователям переключаться между генерацией фразы из вашей модели второго / первого порядка (я буду использовать React😍❤️)

Введение в марковские модели первого и второго порядков

Марковские модели первого порядка

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

Что, черт возьми, это значит? Что ж, на самом деле это сводится к простой идее, которую легко визуализировать. Марковские модели (имейте в виду, что я не говорю о скрытых марковских моделях, которые будут представлены в более позднем посте) могут быть представлены как цепи Маркова. Математически так выглядит цепь Маркова первого порядка.

Если вы не особо разбираетесь в математике, ничего страшного - вот как выглядит рисунок цепи Маркова:

И уравнение, и рисунок выше представляют цепи Маркова первого порядка. X представляет собой какое-то состояние, в этом уроке наши состояния представлены словами. Например, если Трамп напишет в Твиттере: «Сделайте Америку снова великой!», Наши штаты можно будет представить так:

Когда мы имеем дело с марковскими моделями первого порядка, состояние в момент времени t (X_t) зависит ТОЛЬКО от состояния, которое было до него (X_t-1). Если в этом есть смысл, то модели второго порядка также должны казаться интуитивно понятными.

Марковские модели второго порядка

Если вы зашли так далеко, то понимание моделей Маркова второго порядка будет не таким уж большим скачком. По сути, состояние (X_t) зависит от (X_t-1) AND (X_t-2). Итак, вместо того, чтобы зависеть только от предыдущего состояния, мы фактически зависим от двух предыдущих состояний. Вот уравнение для цепи Маркова второго порядка.

И ... вот рисунок ... мой любимый. Просто нарисуйте больше стрелок!

Подготовить данные

Если вы предпочитаете пропустить этот шаг, вы можете найти все мое репо и данные / методы, которые я использовал для синтаксического анализа, здесь: https://github.com/3mi1y/Markov_Trump_Tweets

Данные: https://github.com/3mi1y/Markov_Trump_Tweets/blob/master/server/trumpTweets.csv

Код Python для анализа данных:

Если вы хотите получить свои собственные данные Twitter о Трампе, это очень полезный ресурс: http://trumptwitterarchive.com, вы можете использовать Twitter API, но у них есть некоторые жесткие ограничения, которые затрудняют объединение пользователей. временная шкала, особенно временная шкала того, кто твитнул более 30 000 раз. Если вы не хотите обучать свои модели Маркова, используя данные Twitter Трампа, это тоже круто! Вы можете использовать любую литературу (использование данных Шекспира дает некоторые интересные результаты).

Обучение модели первого порядка

Все еще со мной? Вот где становится хорошо ...

Чтобы обучить Марковскую модель любого измерения, нам нужно создать матрицу перехода. Для каждого уникального слова, которое когда-либо произносил Трамп, нам нужно подсчитать, сколько раз уникальное слово переходит к каждому другому уникальному слову в модели. Если вы думаете о 2D-матрице, вы на правильном пути. Фактически, для модели Маркова первого порядка вам необходимо создать 2D-матрицу с размерами (количество уникальных состояний) ². Когда я изучал твиты Трампа, я обнаружил, что он хорошо произнес более 600 000 уникальных слов. Это огромная матрица, в основном заполненная нулями. По этой причине я решил создать вложенный словарь Python, а не двухмерный массив, он отражает ту же идею, но позволяет нам вырезать огромные массивы нулей.

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

Результирующая структура данных:

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

Обучение модели второго порядка

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

Вот как выглядит код: (извините, пожалуйста, за мои иногда расплывчатые комментарии)

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

И… тада! Соберите все это вместе, и у вас будут инструменты, необходимые для создания Маркова второго порядка!

Создание веб-API, генерирующего случайные фразы

Теперь, когда мы проделали тяжелую работу, пришло время повеселиться, чтобы мы могли увидеть, какие классные фразы придумывают наши модели. Для этого я покажу вам, как настроить минимальный API с помощью Flask. (Я большой поклонник NodeJS, но я никак не могу написать свой собственный взвешенный генератор случайных чисел на JS, если он так легко у меня под рукой с помощью numpy.random.choose).

Убедитесь, что вы устанавливаете Flask с помощью pip и импортируете Flask в начало файла python.

Оттуда мы можем определить несколько маршрутов и вызвать наши функции внутри этих маршрутов, чтобы получить наши случайные фразы:

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

Теперь вы можете продолжать разработку локально, используя ваш API, работающий на другом порту, чем ваш клиент, и отправлять данные туда и обратно между ними, или вы можете попробовать развернуть свой API в Heroku. Я решил развернуть свой API для целей этого руководства, вы можете получить к нему доступ здесь: https://flask-markov-api.herokuapp.com/

Я не думаю, что собираюсь подробно рассказывать, как развернуть серверный Flask API в Heroku, но если вам интересно, я думал, что README этого репозитория отлично объясняет пошаговый процесс получения та настройка бэкэнда. Https://github.com/datademofun/heroku-basic-flask

Вперед… к клиенту!

Ладно, ура! React - это супер круто, и если вы глобально установили команду create-response-app через npm, все будет в порядке. Если нет, .. перейдите сюда: https://www.npmjs.com/package/create-react-app

После того, как вы настроили свою среду, вам нужно запустить команду create-response-app (или, если вы клонируете мое репо, вы можете просто cd в папку клиента и запустить установку npm).

Я буду краток и предполагаю, что у вас есть некоторый опыт работы с JavaScript и React. Итак, что мы собираемся сделать, так это двигаться вперед и начать создавать экран домашней страницы.

Наша конечная игра с точки зрения пользовательского интерфейса довольно проста. Мы просто хотим позволить нашим пользователям генерировать фразу из нашей модели первого или второго порядка. Мы можем добиться этого, имея две кнопки, которые нажимает пользователь, каждая из которых запускает запрос на получение к конечным точкам, которые мы создали для нашего сервера Flask. Эти функции будут выглядеть примерно так:

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

Это действительно внутренняя часть интерфейса, я призываю вас стилизовать так, как вы считаете нужным, и сходить с ума, настраивая свою домашнюю страницу с потрясающими изображениями POTUS. Я не чувствую особого вдохновения потратить 2 часа на работу над CSS, но с небольшой помощью MaterialUI я создал монстра, который, по крайней мере, ненамного более отвратительный, чем Франкенштейн.

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

Https://markov-model-trump-tweets.herokuapp.com/

Надеюсь, вам понравилась статья / учебник! Спасибо за прочтение.