
Дайджесты FOSS News мы выпускаем с конца января 2020 г. (самому не верится). Робот собирает материалы из RSS и HTML-парсингом из нескольких десятков источников, я с помощью базы ключевых слов и интерактивного консольного скрипта фильтрую и категоризую, три человека вычитывают. Пару раз уже выступал про дайджесты на конференциях. И где-то уже полгода я хотел сделать подготовку распределённой, чтобы у самого появилось время для более творческой работы по улучшению дайджестов (давать больше контекста, добавлять авторские комментарии к главным материалам и прочее), но никак не мог найти время написать этого бота. И недавно, благодаря финансовой поддержке читателей, мы в PermLUG провели пару хакатонов, где наконец-то сделали этого бота.
Для начала напомню схему подготовки дайджестов до появления бота.

Немного подробностей по наиболее важным этапам:
-
FNGS (англ. FOSS News Gathering Server) — сервер, собирающий материалы из 46 русско- и англоязычных источников, в основном через RSS, и фильтрующий по вхождениям 2015 ключевых слов.
-
fncategorizer.py — интерактивный консольный скрипт, который показывает мне каждый собранный материал и предлагает решить, включать ли в дайджест (несмотря на фильтрацию по ключевым словам, «мусор» всё равно иногда попадает), ставить ли главным материалом, какой тип и категорию материала присваивать и есть ли материалы схожей тематики.
-
remotedatatohtml.py — скрипт, выкачивающий разобранные материалы текущего выпуска из базы данных и генерирующий HTML для загрузки в Google Drive (да, не «правоверно», но очень удобно).
-
Ручные правки: составление аннотаций главных материалов, перевод английских заголовков, рисование постера.
-
Вычитка тремя редакторами.
-
googledoctohtml.py — конвертация гуглодокумента в разметку Хабра, в том числе автоматическое составление оглавления.
-
Публикация на Хабр и размещение ссылок на эту статью по соцсетям и в RSS.
Теперь же планируется, что бот займёт место между пунктами 1 и 2.

Блок-схема работы бота следующая:
-
Пользователь добавляется к боту и нажимает кнопку начала работы.
-
Бот показывает кнопку «Следующая новость» от пользователя.
-
Пользователь запрашивает новость.
-
Бот загружает случайный некатегоризованный материал с FNGS.
-
Бот показывает для новости заголовок и ссылку и задаёт вопрос «Включить в дайджест?» и кнопки с тремя вариантами ответа: «Да», «Нет» и «Не знаю».
-
Пользователь нажимает одну из кнопок.
-
Бот загружает оценку пользователя на FNGS.
-
Бот переходит к пункту 2) и снова показывает кнопку, ожидая следующей команды на выдачу новости.

Далее, когда я сажусь работать с fncategorizer.py, скрипт показывает мне сводку оценок от пользователей бота и в данный момент это работает для отбрасывания материалов, которые хоть и прошли проверку на ключевые слова, но на самом деле сочтены лишними. Кроме сводки, скрипт на каждый материал показывает оценки пользователей. Ещё бот устроен таким образом, что один и тот же материал для оценки он может дать максимум трём пользователям, это нужно для «кворума», чтобы рекомендация о включении или невключении в дайджест была основана на нескольких голосах и чтобы можно было использовать мнение большинства. Например, пользователи работали с ботом пару дней и по N-ному числу материалов есть мнение большинства (2/2, 2/3, 3/3), что материал надо исключить. И я могу разом всё одобрить на исключение или же указать номера материалов, которые нужно оставить, а остальное исключить.

В разработке бота на двух PermLUG хакатонах (и вне них) помимо меня участвовало ещё два человека (@invasy, @lemonbro) и ещё несколько работало по другим направлениям, связанным с дайджестами. Бот уже две недели проходит внутреннее тестирование девятью людьми и не было найдено ни одного (!) существенного бага, что меня очень порадовало. Напомню, что средства на хакатоны мы получили от читателей дайджестов, за что мы очень благодарны.

Ещё в комплекте с используемым веб-фреймворком Django шла админка, которую легко настроить под свои нужды, вот одна из панелей в ней:

А для случаев, когда не хватает возможностей админки, есть консоль, тоже из фреймворка, вот простой пример её использования:

Теперь мы официально открываем бота для публичного тестирования и приглашаем всех заинтересованных подключиться к https://t.me/fossnewsbot, интерфейс простой, всё должно быть понятно.

Планы по улучшению у нас в данный момент следующие:
-
Помимо pull-модели, когда пользователи сами запрашивают материалы для оценки, сделать для более вовлечённых на выбор push-модель, когда материалы идут для оценки постоянным потоком и не надо постоянно нажимать кнопку для получения нового. Конечно это не значит, что пользователь должен непрерывно работать с ботом до конца собранных FNGS материалов, просто материал сохраняется для последующей оценки. Оценить сейчас или потом, решает пользователь.
-
Опять же для более вовлечённых мы хотим помимо оценки, стоит ли включать материал в дайджест, добавить возможность выбирать, является ли материал главным и какой тип и категорию ему установить.
-
Для более обоснованной оценки мы будем выводить ключевые слова, по которым материал прошёл автоотбор, или пометку о том, что источник является особо доверенным и из него собираются все материалы (как например с OpenNET).
-
Возможность добавлять материал в предложку.
-
Вывод количества материалов, оставшихся для разбора.
-
Геймификация: ачивки, рейтинги и прочее.
Ещё мы сейчас работаем над использованием Data Science инструментов для более интеллектуального отбора и категоризации материалов в FNGS.

Исходники всех инструментов автоматизации подготовки FOSS News доступны под публичными лицензиями, вот полный список:
Стэк: Python, Django, DRF, requests, aiogram, dynaconf.
По каждому из инструментов будет отдельная, более техническая, статья.
Продолжать разработку мы также будем в формате хакатонов, потому что всем понравилось. Мероприятия по совместной разработке показали высокую мотивирующую и объединяющую роль для нашего локального GNU/Linux сообщества, участники продолжили дорабатывать и вне них, хотя максимальная продуктивность конечно достигается, когда мы собираемся в одном помещении.
Вы можете поддержать наши хакатоны, нажав Хабра-кнопку «Задонатить» под статьёй и сделав перевод или просто поставив плюс статье (я участвую в программе поощрения авторов). Код мы делаем открытый, свободный и для общественной пользы и будем рады солидарности со стороны читателей.

[←] Предыдущий выпуск
ссылка на оригинал статьи https://habr.com/ru/articles/577178/
Добавить комментарий