The Daily Newsstand · Free, Always
Tuesday, September 15, 2026

Worldmapper.app

Translate

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

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

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

В общих чертах путь выглядит так:

Источники → сбор → обработка → объединение событий → географическая привязка → карта и лента.

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

Откуда берутся новости

В проекте есть отдельные сборщики для новостных сайтов и лент, Telegram и YouTube.

С обычными новостными источниками это RSS, API или разбор HTML. В Telegram сборщик читает сообщения выбранных каналов. Для YouTube используются текстовые расшифровки: из одного выпуска впоследствии можно извлечь несколько отдельных событий.

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

У каждого источника свои особенности. Где-то доступен полный текст, где-то только заголовок и короткое описание. Канал может перестать отвечать, запрос — упереться в ограничение. Поэтому сборщики запоминают, что уже забрали, а обработка вынесена отдельно.

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

Как публикация превращается в событие

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

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

Результат возвращается в заданной структуре. У события появляются поля, с которыми уже может работать приложение: текст, теги, география, оценка важности, ссылки на исходные сообщения.

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

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

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

Повторы встречаются на нескольких уровнях.

Самый простой случай — сборщик снова увидел ту же публикацию. Это можно проверить по идентификатору или содержимому, ещё до обращения к модели.

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

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

Здесь приходится выбирать между двумя ошибками. Можно оставить повторы и засорить карту. Можно слишком активно объединять похожие тексты и смешать разные происшествия. Вторая ошибка гораздо менее заметна при беглом просмотре, поэтому одного ощущения «вроде хорошо склеивает» недостаточно — нужны проверки на реальных новостных парах.

Как определяется место

География оказалась отдельной задачей.

В новости могут упоминаться несколько стран: где произошло событие, кто его прокомментировал, откуда приехал участник. Есть ещё страна самого издания, которая вообще не обязана иметь отношение к месту происшествия.

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

Поэтому название места дополнительно проверяется по географическому справочнику. Если город удаётся найти в указанной стране, используются координаты из справочника. Так текстовое понимание модели дополняется обычным поиском по данным.

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

Для такого проекта ошибка географии особенно неприятна. Текст может выглядеть вполне правдоподобно, а маркер при этом окажется за тысячу километров от нужного города.

Что происходит после обработки

Обработанные новости сохраняются и собираются в сводки по странам и дням.

Для завершённых дней есть дополнительный этап уточнения — refiner. Он получает уже собранную сводку, группирует связанные сообщения и обрабатывает эти группы небольшими порциями. При этом сохраняется происхождение записей, а сбой одной группы не должен приводить к потере всей сводки.

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

Значительная часть работы над проектом происходит именно здесь. На экране её не видно, пока всё работает: источник ответил, сообщение дошло, обработка завершилась, событие сохранилось.

Что в итоге видит пользователь

После этих этапов новость появляется на карте и в ленте. Её можно найти по месту, теме и выбранному периоду.

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

Для меня в этом и смысл WorldMapper: я могу начать с места, которое меня интересует, и посмотреть, что оттуда пришло. Открыть соседний регион, сменить дату, перейти к публикациям, на которых основано событие.

При этом пустое место на карте не означает, что там ничего не произошло. Возможно, у меня пока мало источников из этого региона или часть материалов не прошла обработку. Карта показывает собранный новостной поток, со всеми особенностями его покрытия.

Зачем я продолжаю

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

За год стало понятно, сколько решений скрывается между исходным сообщением и коротким текстом рядом с маркером. Какие источники подключить, что считать отдельным событием, какие сообщения объединять, насколько точно можно определить место — всё это влияет на результат.

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

WorldMapper доступен на worldmapper.app. Я продолжаю его развивать почти каждый день.

View the original on Хабр

KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.