?

Log in

No account? Create an account

Компьютерная лингвистика

Новостная лента www.solarix.ru

Previous Entry Share Flag Next Entry
shallow парсинг и grammar inference для нормализации грязных данных в MDM системе?
kelijah
В результате интерференции родилась такая мысль, надо ее застолбить :)

Задача

Вот, допустим, есть у нас некая MDM система, которая помимо прочего в рамках ETL процедуры должна уметь забирать описания товара из какой-нибудь 1C. Данные, как это водится, грязные. Вводят их вручную менеджеры, операторы склада или бухгалтеры. А даже если вводят специально выделенные люди (aka "эксперты НСИ"), то могут быть свои забавные способы впихнуть в короткую текстовую строку самую разную информацию. Хотя, казалось бы, для некоторых материальных сущностей эти описания регламентируются ГОСТами и т.д.

В общем, надо эти описания привести к нормальному виду. Один из способов - выделить из грязных данных атрибуты сущности и затем заново собрать описание, уже по регламенту. Вот пример такого разбора для текстовой строки "Круг h8 0,75 Г14955-77 / 20пс-А-75-ТО Г10702-16":


ОКВЭД2 24.10.2
Наименование изделия Круг
Сопроводительный документ->Сокращённое наименование ГОСТ 10702-2016
Длина ПП
Диаметр 0,75 мм
Испытание на горячую осадку
Прокаливаемость
Группа осадки
Материал->Марка материала 20пс
Удаление заусенцев
Серповидность
Обезуглероживание
Класс кривизны
Вид кромок
Качество химического состава А
Контроль ударной вязкости
Стандарт на сортамент->Сокращённое наименование ГОСТ 14955-77
Балл прокаливаемости
Состояние поставки ТО
Точность проката
Категория (фасонный прокат)
Точность по длине
Группа по макроструктуре
Назначение а
Квалитет h8
Класс прочности
Травление
Группа отделки поверхности А
Способ изготовления
Ультразвуковой контроль
Плоскостность
Твердость
Контроль макроструктуры
Гарантия свариваемости

Трудности
Сейчас разбор сделан на старом добром машобуче - набор классификаторов, градиентный бустинг, нейросеточки, CRF и т.д. И как обычно, там где машобуч, там проблемы генерализуемости и интерпретируемости моделей. Попросту говоря, когда на вход модели приходят какие-то необычные данные, которых она не видела при обучении, имеем неиллюзорные шансы получить на выходе лютый мусор. Обычная схема борьбы с таким явлением - добавление новых данных в обучающий датасет, возможно с аугментацией. Но размеченные данные это всегда очень дорогая штука. В энтерпрайзе, да еще в MDM системе это проявляется крайне выпукло. Попросту говоря, мало кто захочет просто отдать разработчику свои данные. Данные, которые, кстати, могут быть частью коммерческой тайны и т.д.

Интерпретируемость - вторая практическая беда. Я даже не говорю о нейросетках, которые обычно проще считать черным ящиком со злой нелинейной магией. В них небольшое изменение входной строки может перекинуть модель на какой-то дико далекий manifold. Поэтому очень трудно дать рекомендацию по аугментации или расширению датасета в случаях, когда модель явно лажает. Инструменты типа SHAP и LIME забавны, но лично мне не "зашли", больше времени всякий раз уходило на обход багов и анализ результатов анализа. Единственный надежный и практичный способ - обучать линейную модель и затем просто анализировать веса фич. Даже деревья решений в любом виде трудны для анализа, особенно если это ансамблевые модели. Матрица же весов линейной модели вкупе с конкретным входным примером позволяет дать четкий ответ - тут у нас такой-то ГОСТ, потому что модель из статистики обучающих данных учитывает "в плюс" такие признаки, а "в минус" такие, так что досыпайте примеров с такими-то атрибутами.

Идея

Все описанные выше проблемы типичны для NLP, в частности для синтаксического анализа. Обучив модель на каком-нибудь tree bank'е, нельзя рассчитывать на хорошее ее поведение. Небольшой мусор на входе, опечатки или необычный слить автора могут привести к нереальному бреду на выходе парсера.

А вот почему бы не использовать тут старые добрые методы NLP? Как и тексты на естественном языке, текстовые строки описания номенклатуры в MDM обычно структурированы в какой-то степени. В частности, ГОСТом может задаваться порядок вписывания размеров, марки материала и т.д.. Даже ограничения могут быть похожими, например, запрет на непроективность, однократность заполнения слота и т.д.

И вот это позволяет переформулировать задачу разбора строк в MDM как старую добрую задачу shallow парсинга, когда нам надо выделить, например, составляющие. Более того, так как у нас есть размеченный датасет, так что, наверное, можно реализовать и какую-то форму grammar inference, чтобы результатом работы была не модель-черный ящик со всем вышеперечисленными проблемами, а набор правил разбора для какого-нибудь простого LR-парсера. Вполне может оказаться, что интерпретация результатов в этом случае будет намного более простой.