Как машинное обучение помогает проекту «ЗабастКом» освещать трудовые конфликты
В посте расскажу о моем успешном взаимодействии с некоммерческим проектом ЗабастКом, который поддерживает наемных работников в отстаивании своих трудовых прав и интересов. Моя цель была реализовать что-то похожее на ML4SG проект, где волонтеры-специалисты по анализу данных направляют свою энергию на пользу обществу. Например, применяют алгоритмы искусственного интеллекта для спасения потерявшихся людей, для мониторинга качества воздуха или для анализа новостного потока.
Для Забасткома получилось улучшить систему автоматической обработки новостей с помощью алгоритмов машинного обучения. Это привело к увеличению охвата важных событий и уменьшению ручного труда редакторов. Добавлю, что работа с ребятами была похожа на мечту любого DS специалиста: “заказчик” легко шел на контакт; присутствовала заинтересованность и неплохое понимание ML алгоритмов; некоторая продакшн-система уже функционировала; данные для обучения алгоритмов легко собирались. А под катом — поделюсь подробностями и кодом.
О проекте
ЗабастКом — это содружество технических специалистов, которые неравнодушны к проблемам наемных работников и которые решили вместе освещать трудовые конфликты в России и странах ближнего зарубежья. Среди волонтеров этого проекта есть ребята из Yandex, VK, Tinkoff, OZON и других известных компаний. Трудовой конфликт – это когда ваш рабочий коллектив “нагрели” с зарплатой, обманули в процессе трудоустройства или как-то несправедливо поступили, а вы — организованно возмутились. Как показывает практика, чем громче и шире подобная новость разойдется в обществе, тем быстрее будет оказана помощь работникам, сглажена несправедливость и решена проблема. А Забастком как раз нацелен на максимальную огласку новости. Для этого у проекта есть свой новостной интернет-портал, база данных, мобильные приложения, telegram канал и др. соцсети, где оперативно публикуются отобранные редакторами новости. Отобранная информация может быть полезна другим активистам, которые оперативно оказывали бы бастующим юридическую и другую помощь. Все ПО Забасткома разработано и поддерживается добровольцами-активистами. Внутри проекта чувствуется атмосфера небольшой НКО или ИТ стартапа.
Подобной активностью занимаются и международные организации. Например, BHHRC следит за влиянием компаний на своих работников по всему миру. В своем октябрьском докладе и документе BHHRC приводит данные о систематическом нарушении прав трудящихся на предприятиях легкой промышленности в странах Азии. В документе приводятся причины возникающих забастовок и трудовых конфликтов между собственником предприятия и коллективом наемных работников:
- ухудшение условий труда;
- необоснованное снижение заработной платы;
- отмена оплаты сверхурочных работ;
- сокращения и увеличение нагрузки;
- экономия на защите жизни и здоровья;
- увеличение продолжительности рабочего дня;
- хищение заработной платы, выходных и др. пособий.
API и база данных
У проекта ЗабастКом есть собственный API. Любой желающий может написать программный запрос и получить доступ к пополняющейся базе данных. База данных накоплена за 5 лет и содержит информацию об освещенных забастовках, пикетах, жалобах и результатах этих конфликтов. Использование API может осуществляться свободно и бесплатно, но без целей извлечения прибыли.
Если кто-то захочет “подписаться” на API, то он может использовать код ниже. Алгоритм следит за появлением всех новых трудовых конфликтов, которые редакторы добавляют в API, и пересылает их в выбранный tg бот.
Визуализируем данные
На визуализации показана кластеризация трудовых конфликтов на основе поля ‘titleRu’ для всех данных из API. Алгоритм кластеризации объединил схожие по смыслу тексты в группы. Для каждой группы на графике показано самое частое словосочетание. Оси графика не являются интерпретируемыми, однако похожие тексты лежат близко друг к другу, а менее похожие — дальше друг от друга. По рисунку видно, что проблемы работников в СНГ мало чем отличаются от проблем, описанных в докладе BHHRC, и от проблем зарубежных наемных работников в странах Азии, Европы или Америки.
Разрабатываем классификатор новостей
Ребятам нужно уметь оперативно выделять информацию о забастовках в огромном новостном потоке. За 5 лет существования проекта подходы к поиску интересующих новостей постоянно улучшались. В ноябре 2022 года процесс был настроен так: парсеры автоматически собирали тексты новостей из сотен источников; далее работали алгоритмы фильтрации на основе простых правил и ключевых слов; после – редакторы в ручном режиме проверяли каждую новость. Алгоритмы фильтрации работали, но могли пропускать важные новости о забастовках или, наоборот, могли выдавать много новостей на сторонние темы. Поэтому улучшение алгоритмов фильтрации с помощью ML-классификатора стало очень актуальной задачей. Без решения этой задачи было невозможно масштабирование проекта без привлечения значительных усилий.
Пояснение для неподготовленных читателей
Про модели: Ребята уже задумывались о внедрении машинного обучения в процесс фильтрации и даже пробовали конструировать прототип. Им хотелось, чтобы ML-алгоритм мог относить каждый текст новости к одному из двух классов: класс 1 — если текст о трудовом коллективном конфликте и его стоит посмотреть редактору, класс 0 – если новость про что-то другое и на нее не нужно тратить время. Этот ML-алгоритм мог бы работать вместе с правилами фильтрации или вместо них. Поэтому после короткого обсуждения было решено взять побольше данных для обучения, сделать качественную предобработку текстов и обучить линейную модель для бинарной классификации с tf-idf векторизацией. Word2Vec/FastText, CNN/RNN сеточки, трансформерные эмбеддинги решили пока не применять, так как вычислительные ресурсы проекта пока слабы.
Обучающие данные собрать было легко: примеры новостей класса 1 взяли из базы данных проекта, выгрузив из API. Примеры новостей класса 0 запарсили за тот же временной промежуток. Класс 0 можно было бы дополнить известными датасетами новостей. В итоге получился такой баланс классов: класс 1 — около 5 тыс. примеров; класс 0 — около 300 тыс. примеров.
Про предобработку текстов: линейным моделям можно помочь — для этого нужно как можно сильнее уменьшить размер общего словаря слов в данных с помощью удаления неинформативных слов и лемматизации. А с помощью NER моделей из библиотеки natasha можно автоматически заменять группы слов на один и тот же токен:
- все ФИО заменяются на слово _пер
- все названия организаций заменяются на слово _орг
- все названия стран, городов, районов и тд заменяются на слово _лок
- все числа, написанные цифрами или буквами, заменяются на слово _чсл
- все названия месяцев, год и др. заменяются на слово _дат
Для анализа обученного классификатора можно посмотреть на самые сильные слова-триггеры, на которые модель обращает внимание при отнесении текста к классу 1. Метрика ROC AUC, равная 0.992 на валидации, выглядит неплохо, но в триггерах присутствуют слова, обозначающие профессии людей:
Для повышения универсальности модели слова-профессии можно заменить на какой-нибудь токен _прф в следующих экспериментах. Для этого, по хорошему, нужно применить NER модель. Но можно обойтись костылем на основе большого словаря профессий и синонимов, найденных с помощью word2vec.
Разрабатываем дедубликатор новостей
В новостном потоке появляется много дубликатов, когда несколько СМИ пишут про одно и то же событие. Иногда СМИ просто перепечатывает новость из другого источника с минимальными изменениями текста. Чтобы редакторы не тратили время на просмотр текстовых копий, нужна система, которая автоматически удаляет дубликаты. Для этого в NLP существует задача text similarity. При решении этой задачи каждый текст превращается в вектор чисел (BOW, tf-idf, doc2vec, взвешенная сумма эмбеддингов слов word2vec, эмбеддинг из sentence-трансформера) и полученные вектора сравниваются по некоторой метрике. Я реализовал через tf-idf векторизацию и косинусное расстояние с высоким порогом сходства.
Результаты
За месяц работы с командой проекта удалось разработать и запустить в работу классификатор и дедубликатор новостей. Это привело к увеличению охвата важных событий и уменьшило количество ручного труда редакторов. Косвенно возросла оперативность реагирования на новость о конфликте, так как старые алгоритмы могли пропускать некоторые события и редакторам приходилось публиковать информацию намного позже — вечером, после дополнительной проверки. Теперь появилась возможность масштабировать решение на большее количество источников информации — в планах постепенное увеличение источников с 800 до 8-10 тысяч.
Если вы знаете, как сделать что-то круто/правильно/красиво с помощью вашей экспертизы в некоторой области — свяжитесь с проектом через tg bot или почту. Уверен, что ребята будут рады всем здравым предложениям для решения различных технических вызовов: от улучшения бэкенда до дизайна сайта и приложений. Есть интересные задачи и для Data Science специалиста:
- Настроить автоматическое создание документов-отчетов по шаблону, подобно годовым отчетам за 2021 и 2022 год.
- Сделать более глубокий анализ данных из API и дополнить им раздел сайта со статистикой.
- Автоматизировать поиск подобных новостей о травмах/трагедиях на работе.
- Обучить (или применить существующую) NER модель для автоматического выделения профессий и других важных слов.
- Улучшить текущий классификатор с помощью увеличенного количества данных, быстрого трансформера, разнообразных текстовых аугментаций.
- Автоматизировать заполнение большинства полей из API нужными словами, обрабатывая текст новости (сейчас все поля конфликта заполняются редактором): ‘titleRu’ — заголовок, ‘conflictReasonId’ — причина трудового конфликта, ‘conflictResultId’ — итог конфликта, ‘industryId’ — индустрия, ‘companyName’ — название предприятия и др.
- Настроить показ интерактивных дашбордов на сайте.
- Научиться определять необычные формулировки трудовых конфликтов (поиск текстовых аномалий).
Вместо заключения
ЗабастКом передает пламенный привет всем единомышленникам и призывает других технических специалистов быть неравнодушными к проблемам людей. Людей, которые лечат, учат, строят, готовят, доставляют, водят, делают уборку и многое необходимое другое. Благодаря разделению труда и профессиям, создающим все блага для жизни, другие люди могут заниматься умственным трудом (программированием, наукой, искусством) и целенаправленно работать над улучшением жизни всех трудящихся масс.
Последнее время меня всё больше интересуют социально-экономические аспекты устройства общества. Возможно, поэтому тема поста оказалась на пересечении нескольких направлений. Во время работы с данными по этой теме увидел, как могут быть устроены отношения между рабочим коллективом и работодателем. Больнее всего видеть и чувствовать, какой несправедливости и издевательствам подвергают многих трудящихся эти “эффективные собственники”. Несправедливость, в свою очередь, всегда вызывала, вызывает и будет вызывать наш коллективно-трудовой отпор. Еще вспоминается известная фраза: ничего личного, просто бизнес. Ее можно переформулировать, когда речь идет о праве Человека на достойный труд: это не бизнес, это личное.
Решин
Источник: habr.com
Примеры кода ищите в оригинальной статье