/hacks-ai-international2023-BBBB

Решение кейса хакатона от Promobot: автоматизация процесса обработки обращений (классицикация, NER, summarizing)

Primary LanguageJupyter Notebook

hacks-ai-international2023-BBBB


Постановка задачи: автоматизация процесса обработки модераторами обращений в различные гос.учреждения за счет автоматической классификации текстов по обобщенным (25 классов) и более узким конкретным (195 классов) темам, а также вспомогательное выделение именновых сущностей внутри обращений (дата, адрес, номер телефона, организация) и суммаризация текстов (выжимка из короткого описания заявлений) + интеграция решений в первичный веб-MVP (минимально жизнеспособный продукт)

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

Целевая метрика классификации F1-weighted на закрытом тестовом датасете: 0.63. В совокупности с презентацией решение заняло 5-ое место

  • Screencast веб-сервиса: here

Технический ход решения:

  • решение проблемы дисбаланса классов за счет аугментации текстовых данных

    • аугментация через deep-translator редко встречающихся классов (дополнительно реализовали возможность аугментации через augmentex от SberDevices, но в итоговом варианте не использовали)
    • аугментация всего датасета через саммайризинг с помощью NER-модели IlyaGusev/rut5_base_sum_gazeta (для 20k строк использовали мощности Yandex DataSphere), но очищенных от ошибок и мусора данных через re и JamSpell

  • классификация обращений по их общим и узким темам

    • в первом случае на обычном и аугментированном датасете дообучили GPT-модель ai-forever/rugpt3small_based_on_gpt2, сделав из нее классификатор
    • во втором случае дообучили такую же модель ai-forever/rugpt3small_based_on_gpt2, но в качестве данных подавали конкатенированные строки вида '<общая тема>: <обращение>'
    • в итоговом пайплайне сначала по обращению предсказываем общую тему, а потом по этому классу и обращению с помощью второй модели предсказываем узкую тему
    • в первом и во втором пункте попробовали сделать то же самое, но с BERT-моделью cointegrated/rubert-tiny2 (ее не включили в MVP)
    • модели сохранены в папке models в формате modelname_modeltask_f1valscore (pt расширение или папка с сэйвпоинтами)

  • выделение NER

    • использовали дообученную NER-модель surdan/LaBSE_ner_nerel
    • модифицировали output модели, оставив часть именнованных сущностей и объединив соседние одинаковые сущности (модель могла ошибаться, выделяя подстроки одной строки одной сущностью, вместо выделения всей строки одной сущностью)

  • обернули все в web-интерфейс на flask
    • есть потенциальная возможность выбора профиля оператора
    • есть возможность расширить приложение до взаимодействия с СУБД (пока данные подгружаются из массива)
    • к каждому обращению выводится его summary (краткий пересказ)
    • к каждому обращению выводится список NER (дата, адрес, номер телефона, организация)
    • к каждому обращению выводятся классы по общим и узким темам (модератор их может исправлять) с вероятностью в прогнозе
    • все лежит в папке app (кроме моделей, которые на google-диске)
    • requirements всего репозитория находится в папке приложения
    • docker-файл лежит в папке

Contributors: