Материалы к хакатону по обработке естественного языка (NLP) НГ Hack 2019.
Вся запускабельная часть находится в папке solution
.
Часть подготовительных скриптов и блокнотов лежит в папке scripts
.
- Классификация интентов:
- Усреднение предсказаний fasttext и логистической регрессии
- Применялка
- Исправление ошибок:
- Применялка
- Эвристики для обработки уверенно распознаваемых ошибок по словарю
- Эвристики для обработки написания частиц то/либо/нибудь/таки через дефис с помощью pymorphy2
- Обучение fasttext bpe-level моделей для детекции ошибок в написании н/нн, тся/ться, чтобы/что бы, тоже/то же, предлогов типа в течение и т.д.:
- Генерация выборки по корпусу для обучения в scripts/generate_*_errors.py
- Генерация данных для обучения fasttext в scripts/train/grammar_*.py
- Обучение:
fasttext supervised -input <train_data> -output <model_name> -dim 100 -epoch 30 -lr 0.2
- Исправление "не/ни" и опечаток: n-граммная (статистическая!) языковая модель и эвристики для генерации гипотез. блокнот, n-grams, применялка
- Предсказание оценки:
- Логистическая регрессия поверх словных уни- и биграмм + символьных 1-5 грамм, взвешенных по TfIdf
- Обучение, модель, применялка
- Обнаружение фальсификаций: блокнот, модель, применялка модели. Довольно простой фича-инжиниринг и катбуст.
Доступные данные:
data/intent_train.csv
— примеры для обучения, колонкаtext
содержит текст сообщения,label
— название интентаdata/intent_check.csv
— пример входного тестового файла
Решению необходимо для всех тестовых примеров определить интент. На выходе должен быть файл с колонками id
(идентификатор примера из входного файла), label
(название интента).
Метрика качества: Multi-class F1 Macro-average (описание в scikit-learn docs)
Доступные данные:
data/grammar_train.csv
— примеры для обучения, колонки:id
— идентификатор примераsentence_with_a_mistake
— исходное предложениеcorrect_sentence
— корректная версия предложенияmistake_type
— тип допущенной ошибки
data/grammar_check.csv
— пример входного тестового файла (содержит только исходное предложение)
Решению необходимо для всех тестовых примеров исправить ошибки и записать корректную (исправленную) версию. На выходе должен быть файл с колонками id
и correct_sentence
.
Метрика качества — F1:
- По всем тестовым примерам подсчитываются счетчики TP, FP, FN:
- если исправление совпадает с тем, что в правильном ответе, то TP += 1
- если исправление не совпадает с тем, что в правильном ответе, но совпадает с исходным предложением, которое подавалось на вход, то FN += 2
- иначе FP += 30
- Метрика F1 вычисляется по формуле:
F1 = 2*(precision*recall)/(precision+recall)
precision = TP / (TP + FP)
recall = TP / (TP + FN)
Доступные данные:
data/support_train.csv
— примеры для обучения, колонкаtext
содержит текст сообщения,label
— метку класса (positive
,neutral
илиnegative
)data/support_check.csv
— пример входного тестового файла (не содержит колонкуlabel
)
Решению необходимо для всех тестовых примеров определить метку класса. На выходе должен быть файл с колонками id
(идентификатор примера из входного файла), label
(метка класса).
Метрика качества: Multi-class F1 Macro-average (описание в scikit-learn docs)Метрика
Доступные данные:
data/callcenter_train.csv
— примеры для обучения, содержит колонкуМетка
(1 — есть подмена, 0 — нет подмены)data/callcenter_before.csv
— как выглядели данные изtrain
до подменыdata/callcenter_check.csv
— пример входного тестового файла (не содержит колонкуМетка
)
Решению необходимо для входного журнала обращений в техподдержку выявить подмены в записях, в колонке Метка
записать индикатор подмены.
Метрика качества: F1 Score
В проверяющую систему необходимо отправить код решений, запакованный в ZIP-архив. Решения запускаются в изолированном окружении при помощи Docker, время и ресурсы для тестирования ограничены. В простом случае, участнику нет необходимости разбираться с технологией Docker.
Пример оформления решения находится в каталоге solution
.
В корне архива обязательно должен быть файл metadata.json
следующего содержания:
{
"image": "datasouls/python",
"entry_points": {
"intent": "python intent.py {input_csv} {output_csv}",
"grammar": "python grammar.py {input_csv} {output_csv}",
"support": "python support.py {input_csv} {output_csv}",
"callcenter": "python callcenter.py {input_csv} {output_csv}"
}
}
Здесь image
— поле с названием docker-образа, в котором будет запускаться решение, entry_points
— команды, при помощи которых запускаются соответствующие решения. Для решения текущей директорией будет являться корень архива.
Не обязательно решать все четыре задачи. Решение будет протестировано только на тех задачах, для которых указаны entry_points
.
В командах необходимо использовать шаблоны, в которые при запуске в тестирующей системе будут подставлены необходимые значения:
{input_csv}
— путь к входному CSV-файлу с тестовыми данными{output_csv}
— путь к CSV-файлу с колонкамиid
и целевой переменной
Контейнер с решением запускается в следующих условиях:
- решению доступны ресурсы
- 4 Гб оперативной памяти
- 2 vCPU
- лимит времени одного запуска решения: 20 сек
- решение не имеет доступа к ресурсам интернета
- максимальный размер упакованного и распакованного архива с решением: 2 Гб