Задача: найти упоминания компаний из определенного списка в тексте и для каждой компании предсказать тональность её упоминания.
pip install -r requirements.txt
python download_model.py
python run_me.pyrun_me.py читает json c текстами из папки data и складывает скоры сообщений в results/output_scores.json
Решение запускается на gpu при его наличии и на cpu в противном случае
Решение состоит из двух частей:
-
Поиск упоминаний компаний
-
Определение тональности упоминания компании
Так как список компаний не очень большой, а классические решения задачи NER весьма тяжеловесны (используют нейросетевые подходы), мы использовали строковые алгоритмы.
Чтобы применять строковые алгоритмы мы генерируем список синонимов и форм слова для каждого названия компании. Для этого используем pymorhy и gpt. Расширенный список синонимов хранится в final_solution/ner/new_names_and_synonyms.csv .
Далее с помощью алгоритма Ахо-Корасик находим все упоминания синонимов в тексте сообщений.
Идея этой части заключается в fine-tuning'e предобученной большой языковой модели.
В качестве предобученной модели используется основная модель LLM - она используется получения эмбеддингов, а кастомный classification head выдаёт вероятности для каждого класса тональности.
| Model | ~Inference Time (sec) | Num FC Layers | Accuracy |
|---|---|---|---|
| RuBERT-base | 9.2 | 2 | 68.1% |
| RuBERT-base | 9.2 | 1 | 68.1% |
| RuBERT-tiny2 | 3.9 | 2 | 66.5% |
| RuBERT-tiny2 | 3.0 | 1 | 64.7% |
Исходя из данных экспериментов было принято решение использовать rubert-tiny2 с classifcation head состял из двух линейных слоёв + softmax.
Для реализации использовалась бибилотека transofrmers . Веса модели можно найти на huggingface: ссылка
-
F1-Score для выделения компаний на валидации: 0.71
-
Accuracy для определения тональности упоминания компании на валидации: 0.66
-
Обе части решения крайне легковесные - извлечение компаний на датасете из тысячи текстов занимает порядка 2 секунд, работа модели на инференсе занимает порядка 3 секунд.

