Пишем Чехова на цепях Маркова: готовая библиотека
Что такое цепи Маркова и как они работают Простейший генератор текста на цепях Маркова
Пишем Чехова на цепях Маркова: готовая библиотека

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

Сего­дня сде­ла­ем то же самое, но как насто­я­щие про­грам­ми­сты — исполь­зу­ем гото­вую биб­лио­те­ку markovify, вме­сто того что­бы писать код самим и с нуля. 

Неко­то­рые рабо­то­да­те­ли ожи­да­ют имен­но тако­го под­хо­да от сво­их сотрудников.

Что делаем

Мы повто­рим наш про­шлый про­ект на гото­вой биб­лио­те­ке — посмот­рим, ста­нет ли код про­ще и про­ве­рим, что она уме­ет. Логи­ка такая:

  1. Уста­нав­ли­ва­ем библиотеку.
  2. Под­клю­ча­ем её к нашей программе.
  3. Пишем код, исполь­зуя новые возможности.
  4. Смот­рим на резуль­тат и срав­ни­ва­ем с тем, что было раньше.

Установка markovify

Для уста­нов­ки запус­ка­ем тер­ми­нал и пишем такую команду:

pip install markovify
Пишем Чехова на цепях Маркова: готовая библиотека

Теперь мы можем исполь­зо­вать эту биб­лио­те­ку в наших проектах.

Подключение библиотеки

Под­клю­ча­ем биб­лио­те­ку, как это обыч­но дела­ет­ся в питоне — коман­дой import пря­мо в коде программы:

import markovify

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

Переписываем код

Что­бы полу­чить то же самое, что и в про­шлом про­ек­те, нам пона­до­бит­ся все­го 5 строк кода, не счи­тая комментариев:

# подключаем библиотеку
import markovify

# отправляем в переменную всё содержимое текстового файла
text = open('che.txt', encoding='utf8').read()

# сразу обрабатываем весь текст одной командой
# на этом этапе библиотека уже взяла корпус, нашла все пары, построила связи между словами и выяснила вероятности появления новых слов
text_model = markovify.Text(text)

# выводим 30 предложений
for i in range(30):
    print(text_model.make_sentence())

Всё дело в том, что мы одной коман­дой markovify.Text() полу­ча­ем сра­зу многое:

  • отфиль­тро­ван­ный корпус;
  • цепоч­ки пар слов с веро­ят­но­стя­ми появ­ле­ния того или ино­го слова;
  • свя­зи меж­ду парами. 

В общем, одна коман­да поз­во­ля­ет нам сра­зу постро­ить все свя­зи меж­ду сло­ва­ми, что­бы потом на их осно­ве стро­ить пред­ло­же­ния с помо­щью мето­да .make_sentence(). Этот метод берёт всю цепоч­ку и стро­ит на её осно­ве одно пред­ло­же­ние. Биб­лио­те­ка зна­ет, что пред­ло­же­ние долж­но начи­нать­ся с боль­шой бук­вы и закан­чи­вать­ся точ­кой — нам не нуж­но про­пи­сы­вать это отдель­но. Всё, что нам нуж­но, — ука­зать, сколь­ко пред­ло­же­ний надо придумать. 

Было — стало

Срав­ни­те код из пер­во­го про­ек­та с руч­ной обра­бот­кой цепи и код с этой биб­лио­те­кой, кото­рый дела­ет то же самое. Ито­го­вый код раза в четы­ре коро­че (если не в пять). А уме­ет он гораз­до боль­ше, пото­му что биб­лио­те­ка markovify уме­ет не толь­ко стро­ить цепоч­ки, но и счи­тать веро­ят­но­сти, а так­же мно­гие дру­гие вещи.

В этом — вся сила биб­лио­тек: они эко­но­мят вре­мя и силы на раз­ра­бот­ку, а резуль­тат может полу­чить­ся даже лучше.

Было:

Пишем Чехова на цепях Маркова: готовая библиотека

Ста­ло:

Пишем Чехова на цепях Маркова: готовая библиотека

Проверяем результат

Запус­ка­ем про­грам­му и ста­вим вывод 5 пред­ло­же­ний. Резуль­тат такой:

🤖 И что зна­чит самый рассказ?

— Сего­дня едва ли это удоб­но, — ска­зал Орлов. — Я хочу мира, тиши­ны, хочу теп­ла, вот это­го моря, вашей близости.

— А, может, хоти­те конституции?

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

Осмот­рев боль­ни­цу, Андрей Ефи­мыч всё понял.

Пишем Чехова на цепях Маркова: готовая библиотека

Полу­чи­лось гораз­до луч­ше, чем в пер­вом про­ек­те. Это свя­за­но с тем, что внут­ри биб­лио­те­ки есть мно­го свя­зей и настро­ек, кото­рые поз­во­ля­ют созда­вать строй­ный текст. Конеч­но, до резуль­та­тов GPT3 нашей про­грам­ме ещё дале­ко, но мы уже можем полу­чать более-менее при­выч­ный и понят­ный текст, исполь­зуя все­го 5 строк кода.

Что дальше

Сде­ла­ем про­грам­му, кото­рая будет созда­вать заго­лов­ки к нашим ста­тьям. Когда сде­ла­ем — пере­на­стро­им её так, что­бы она сама ещё и ста­тьи писа­ла. Без шуток, так и сделаем.

Текст:

Миха­ил Полянин

Редак­ту­ра:

Мак­сим Ильяхов

Худож­ник:

Даня Бер­ков­ский

Кор­рек­тор:

Ири­на Михеева

Вёрст­ка:

Мария Дро­но­ва

Соц­се­ти:

Олег Веш­кур­цев