Zoibana
12 550
Блоги

Как я написал бота-комментатора для TJ. И не умер

История создания Нейро-Илюхера: от телеграм-бота до дерзкого и успешного бота в Аляске.

Поделиться

В избранное

В избранном

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

У меня есть особенность характера: иногда я должен сам себе доказать, что я что-то смогу. Особенно, если кто-то другой это что-то уже сделал, а я — ещё нет. И я уверен, что сделаю даже лучше. Благодаря этому я двигаюсь вперёд.

Например, в школе однажды одноклассник пришел на урок и рассказал свой собственный стих. Учительница и одноклассники его за это так хвалили, что во мне тогда взыграло это чувство: «да я могу сочинить ничуть не хуже, даже лучше». И через неделю уже я стоял перед всем классом и читал свои стихи. Класс аплодировал мне. Я был доволен.

Еще позже мой друг показал мне свой собственный html-сайт, который он написал своими руками. В груди защекотало знакомое чувство. Через неделю я показал ему свой собственный сайт. С фишками, которых не было у сайта моего друга.

Именно благодаря этому чувству я научился играть на гитаре, писать песни, программировать, готовить, рисовать, фотошопить и многое-многое другое.

И вот месяц назад я сидел в одном телеграм-чате и в груди вновь засвербело знакомое чувство. И причиной этого стал телеграм-бот, которого написал Вадим Краев — «погодный бот».

Я твердо решил сделать своего телеграм-бота. Идея для бота нашлась моментально.

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

Все вдруг сложилось: кто-то в чате вдруг вспомнил, как Илюхер триггерится на статьи про Маска, на наркоманов и слово «флешмоб».

«Мой бот будет триггериться на типичные Илюхеровские заскоки». И в качестве сообщений было решено использовать настоящие комменты всех двадцати трёх Илюхеров на tjournal.ru, плюс сообщения Илюхера из телеграм-чатов. Правда, некоторые фразы на определенные действия я всё же придумывал сам, подражая стилю Илюхера.

Для бота я решил попробовать собрать простенькое приложение на PHP из готовых composer-пакетов вместо использования самописных решений и тяжеловесных для такой простой задачи фреймворков.

Пара вечеров за ноутом и тестовая версия готова.

Те, кому не интересна техническая часть, могут сразу пролистать до следующего абзаца. А для интересующихся: алгоритм бота прост — если боту выданы полные права доступа в чате, то каждое сообщение в чате API Telegram присылает моему боту. Бот проходится по списку слов-триггеров и регуляркой ищет совпадения. При совпадении выбирает один из нескольких вариантов ответа и посылает ответ в чат.

Отдельное спасибо Наденьке и Александру Ашкинадзе за первоначальное наполнение бота триггерами.

Всё заработало.

Осталось проверить бота на настоящем чате. Сначала хотел добавить бота в чат Аляски без ведома Илюхера, но оказалось, что кроме него в чат добавить участников никто не может. Или не хочет. Поэтому я написал ему напрямую, и он с удовольствием добавил бота. А параллельно я добавил бота и в другой, более тесный и уютный ТЖ-чат, для тестирования в разных боевых условиях.

За первую неделю я выловил кучу багов, несколько раз менял алгоритм, пока не довел бота до удобоваримого состояния.

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

Бот жил, рос и совершенствовался на протяжении месяца, и я даже успел потерять интерес к нему, пока как-то раз в чате Аляски его не заметил Денис Ширяев, менеджер по продукту ИД «Комитет».

На меня накатила вторая волна «я могу» и я принялся за дело. Благодаря Денису Ширяеву и Илье Чекальскому я оперативно решал все вопросы по слабо документированному API TJ.

Для ТЖ было решено делать расширенную и более умную версию телеграм-бота. Я полностью перестроил архитектуру приложения. С сожалением пришлось убрать из ТЖ-бота несколько триггеров на локальные чатовские мемы, которые не поймут на ТЖ, но в то же время я сильно расширил словарный запас бота – вручную нашёл оставшиеся в живых (не удаленные) старые аккаунты Илюхера, вручную просмотрел, выбрал и сопоставил сотни его комментариев из нескольких тысяч. Выбросил из бота все фразы моего собственного сочинения.

Время поджимало. Быстро протестировали бота на тестовой версии ТЖ и запустили его в Аляску 15 апреля – в день рождения Илюхера.

В качестве иронии аватаркой был выбран отзеркаленный аватар настоящего Илюхера, на котором теперь вместо буквы «И» красовалась буква «N». Денис Ширяев предложил переименовать Илюхер-бота в Нейро-Илюхера и мы запустились.

Бот вызывался кроном (система автоматического запуска скриптов) каждую минуту, он брал последние 5 постов из Аляски, проходился по всем комментариям, пытался стриггериться на них. Если получалось – отвечал ответами на триггер, если нет – писал относительно «универсальные» комментарии.

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

Очевидные баги были оперативно исправлены и бот начал свою активную комментаторскую деятельность в Аляске.

И хоть он вполне успешно и смешно комментил, уже через пару дней стало очевидно, что словарный запас бота скуден, он плохо распознает содержимое комментариев, очень часто отвечает невпопад и часто повторяется. Поэтому пришлось внедрить кучу дополнительных проверок: отвечал ли уже бот на этот комментарий, комментировал ли пост, какие комментарии уже были в этом посте, чтобы не повторяться и т.д. Это сделало бота чуть разумнее, но всё равно я был им недоволен.

Бот правился прямо на ходу, но уже было понятно, что этого недостаточно. У бота были очевидные проблемы с алгоритмом работы.

Для следующей версии бота было решено добавить боту немного человечности: возможность отвечать персонально (я отобрал комменты Илюхера с упоминанием имен, никнеймов и навесил их на определенные аккаунты), научить бота распознавать вопросы «как», «где», «почему» и т.д., отвечать на них соответственно, научить бота лайкать и дизлайкать по определённой логике, а также распознавать тип содержимого коммента – видео, картинка и/или текст. Плюс было решено радикально увеличить базу комментариев. Для этого у настоящего Илюхера я запросил список всех его 23-х аккаунтов, написал парсер комментов и напарсил больше 14 тысяч комментариев, оставленных за все время присутствия Илюхера на ТЖ. И еще примерно столько же удалены кровавой администрацией ТЖ. Это позволило увеличить базу комментов практически втрое.

Новая версия бота увидела свет прямо перед майскими праздниками. И стала настолько эпичной, что благодарные поклонники бота даже создали телеграм-канал с лучшими диалогами с ботом.

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

Но вместе с новой версией обнаружились и новые недостатки. Из-за неверной логики приоритетов триггеров бот снова стал очень часто повторяться. Т.к. набор персональных ответов довольно скуден, то ответы определенным пользователям были почти всегда одни и те же. Другим недостатком стало и то, что вначале было даже плюсом – бот отвечает на любой комментарий, написанный в ответ на его комментарий. Т.е. ветка может продолжаться до тех пор, пока либо это не надоест человеку-собеседнику, либо пока не кончится база ответов. В постах, посвященных Илюхер-боту, это было очень даже уместно, а вот в постах на посторонние темы это стало проблемой – он комментил все подряд, триггерился невпопад и его стало СЛИШКОМ много. О чем справедливо стали заявлять как олдфаги ТЖ, так и ньюфаги.

И когда в очередной раз он загадил весь прямой эфир ответами невпопад, я понял, что пришло время отключить питание.

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

Как сказал бы сам Нейро-Илюхер,

А в это время в его мозгах происходит капремонт (или, в рамках новых веяний, реновация). Регулярные выражения, на которых были построены первые версии бота, были признаны исчерпавшими свой ресурс, и на смену им приходят нейросети, чтобы оправдать гордое имя Нейро-Илюхера.

Что из этого выйдет – никто не знает. 14 тысяч комментариев должно хватить на обучение нейронки. Но т.к. это будет первый мой опыт работы с нейросетями, то за результат я ручаться не могу. Буду рад любой помощи в области нейронок.

И хотя в груди у меня снова свербит то самое знакомое ощущение «я могу», у меня есть и другая особенность – я быстро загораюсь идеей и еще быстрее гасну. Что будет впереди – неизвестно. Но это был отличный опыт как в рамках программирования, так и в рамках понимания коммуникативных процессов.

Материал написан по просьбе Жени Кузьмина

Всем мира, всем спасибо, все – пидоры!

#истории

{ "author_name": "Zoibana ", "author_type": "self", "tags": ["\u0438\u0441\u0442\u043e\u0440\u0438\u0438"], "comments": 310, "likes": 303, "favorites": 94, "is_advertisement": false, "section_name": "blog", "id": "70206", "is_wide": "" }
Популярные материалы
Показать еще
{ "is_needs_advanced_access": true }

Популярные комментарии

Дискуссии по теме
доступны только владельцам клубного аккаунта

Купить за 75₽
Авторизоваться

Преимущества
клубного аккаунта

  • отсутствие рекламы
  • возможность писать комментарии и статьи
  • общение с членами клуба
Подробнее

Преимущества
клубного аккаунта

  • отсутствие рекламы
  • возможность читать и писать комментарии
  • общение с членами клуба
  • возможность создавать записи

Сколько это стоит?

Членство в клубе стоит всего 75₽ в месяц. Или даже дешевле при оплате за год.

Что такое клуб?

Клуб ТЖ это сообщество единомышленников. Мы любим читать новости, любим писать статьи, любим общаться друг с другом.

Вступить в клуб

Комментарии Комм.

Популярные

По порядку

0

Прямой эфир

Вы не против подписаться на важные новости от TJ?

Нет, не против
[ { "id": 1, "label": "100%×150_Branding_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox_method": "createAdaptive", "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "ezfl" } } }, { "id": 2, "label": "1200х400", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "ezfn" } } }, { "id": 3, "label": "240х200 _ТГБ_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "i", "ps": "cndo", "p2": "fizc" } } }, { "id": 4, "label": "240х200_mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "i", "ps": "cndo", "p2": "flbq" } } }, { "id": 5, "label": "300x500_desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "ezfk" } } }, { "id": 6, "disable": true, "label": "1180х250_Interpool_баннер над комментариями_Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "clmf", "p2": "ffyh" } } }, { "id": 7, "label": "Article Footer 100%_desktop_mobile", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byswn", "p2": "fjxb" } } }, { "id": 8, "label": "Fullscreen Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "fjoh" } } }, { "id": 9, "label": "Fullscreen Mobile", "provider": "adfox", "adaptive": [ "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "fjog" } } }, { "id": 10, "disable": true, "label": "Native Partner Desktop", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyb" } } }, { "id": 11, "disable": true, "label": "Native Partner Mobile", "provider": "adfox", "adaptive": [ "phone" ], "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "clmf", "p2": "fmyc" } } }, { "id": 12, "label": "Кнопка в шапке", "provider": "adfox", "adaptive": [ "desktop", "tablet" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "fdhx" } } }, { "id": 13, "label": "DM InPage Video PartnerCode", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox_method": "createAdaptive", "adfox": { "ownerId": 228129, "params": { "pp": "h", "ps": "cndo", "p2": "flvn" } } }, { "id": 14, "label": "Yandex context video banner", "provider": "yandex", "yandex": { "block_id": "VI-223677-0", "render_to": "inpage_VI-223677-0-130073047", "adfox_url": "//ads.adfox.ru/228129/getCode?pp=h&ps=cndo&p2=fpjw&puid1=&puid2=&puid3=&puid4=&puid8=&puid9=&puid10=&puid21=&puid22=&puid31=&puid32=&puid33=&fmt=1&dl={REFERER}&pr=" } }, { "id": 15, "label": "Плашка на главной", "provider": "adfox", "adaptive": [ "desktop", "tablet", "phone" ], "adfox": { "ownerId": 228129, "params": { "p1": "byudv", "p2": "ftjf" } } }, { "id": 17, "label": "Stratum Desktop", "provider": "adfox", "adaptive": [ "desktop" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "fzvb" } } }, { "id": 18, "label": "Stratum Mobile", "provider": "adfox", "adaptive": [ "tablet", "phone" ], "auto_reload": true, "adfox": { "ownerId": 228129, "params": { "pp": "g", "ps": "cndo", "p2": "fzvc" } } } ]