Статьи

Удовольствие от цепочек и марков

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

В этом блоге мы покажем, как создать приложение « Marky », которое использует цепочки Маркова для создания бессмысленных твитов на основе вашей истории в Твиттере. Он использует Couchbase Server для хранения и обработки данных для генерации этих твитов.

Marky использует Couchbase сервера взгляды на данные процесса
Функция карты Марки:

function (doc, meta) {
   if(doc.body) {
       var words = doc.body.split(/\s+/);
       if (words.length >= 1) {
           emit([null, words[0]], 1);
       }
       for(var i = 0; i < (words.length - 1); i++) {
           var pair = [words[i], words[i+1]];
           emit(pair, 1);
       }
   }
}

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

Например: учитывая введенный текст «В этом блоге мы покажем вам, как создать приложение», он выдаст пары Key, Value —

Значение ключа

[ null , «In» ]            1
[ «In» , «this» ]          1
[ «this» , «blog,» ]       1
[ «blog» , «we» ]         1
[ «we» , «will» ]          1
[ «will» , «show» ]        1
[ «show» , «you» ]         1
[ «you» , «как » ]          1
[ » как » ,«to» ]           1
[ «to» , «build» ]         1
[ «build» , «an» ]         1
[ «an» , «application» ]   1

Чтобы сгенерировать слово, мы запрашиваем представление, используя последнее слово, которое мы выводим. Например, чтобы получить кандидатов на слово для следования «the», мы используем параметры запроса startkey = [«the»] & endkey = [«the», {}] & group_level = 2 & redu = true

Это позволит получить все выведенные нами пары слов, начинающиеся с «the», сгруппировать одинаковые пары и запустить функцию уменьшения представления для каждой группы. Marky использует встроенный метод limit _sum , который сложит значения , которые ему даны. Выполнение этого на основе базы данных dkatz_ebooks дает:

Значение ключа
[ «the» , «# 1» ]                 1
[ «the» , «100» ]                1
[ «the» , «2» ]                  1
[ «the» , «Способность» ]            3
[ «the» , «absolute » ]           1
[ » the » , » answer » ]             1
[ » the » , » app «]                1
[ «the» ,«application» ]        1
[ «the» , «area,» ]              1
[ «the» , «background.» ]        1

Чтобы выбрать слово для вывода после «the», мы выбираем слово, которое следует за ним случайным образом, но взвешиваем наш выбор, основываясь на частоте пары слов, появляющейся на входе. Это означает, что мы даем «способность» с вероятностью 3/12 или 25% быть выбранной здесь, тогда как остальные слова имеют шанс выбора 1/12 или 8,3%.

Поскольку в начале предложения мы соединяем первое слово с нулем (например, [null, «In»] в предыдущем примере) , мы можем выполнить тот же запрос с нулем, чтобы начать новый вывод и получить слова, которые могут начать мысль, или твит, или что-то еще наш вклад. Мы также должны сделать это, если нам не повезло, и мы не получили никаких слов-кандидатов из первого запроса представления. Это может произойти, если слово в запросе появилось только в конце обработанных нами входных текстов.

Marky Application

Marky использует простую оболочку clojure, созданную сообществом. Чтобы настроить marky, создайте файл marky-config.clj и укажите его для кластера Couchbase Server и учетной записи Twitter. Добавьте некоторые начальные данные, учетные записи пользователей Twitter или каналы Atom, и вы готовы запустить приложение.

{:bucket "default"
:pass ""
:cburl "http://localhost:8091/"
:twitter {:app-key "XXXXXXXXX"
          :app-secret "XXXXXXXXXX"
          :user-token "XXXXXXXX"
          :user-secret "XXXXXXXX"}
:jobs
[; :period, :after are in seconds, :ttl is in days.
 {:type :twitter :user "user-handle1" :period 3600 :ttl 60}
 {:type :twitter :user "user-handle2" :period 3600 :ttl 60}
 {:type :send-tweet :period 3600 :after 600}
 {:type :atom :url "http://some-domain/rssfeed.php" :period 86400 :ttl 60}]}

Вот некоторые забавные твиты Марки —

Хотите получить Марки?

Вы можете загрузить исходный код Marky здесь
Вы также можете внести свой вклад в Clojure обертке проекта здесь

Have Fun!

—-

Спасибо Аарону за составление кода в ближайшем будущем.