Извлечение атрибутов из прайс-листов без ручной чистки
Извлечение атрибутов из прайс-листов помогает свести к одному виду единицы, бренды и фасовки, даже если поставщики присылают Excel, PDF и CSV вразнобой.

Почему прайс-листы ломают каталог
Каталог редко ломается из-за одной крупной ошибки. Обычно его портят сотни мелких расхождений, которые приходят с каждым новым файлом поставщика. Для человека это просто разные способы записи. Для системы это уже разные товары.
Одна и та же позиция может приехать как "Кофе Jacobs Monarch 95 г", "Jacobs Monarch кофе 95гр" и "Монарх Якобс 0,095 кг". Смысл один, но строки не совпадают. Если загружать такие данные без подготовки, в каталоге появляются дубли, цены расходятся, а остатки делятся между похожими карточками.
Проблема не только в названии. Поставщики смешивают единицы измерения в одном поле: кг, гр, g, уп, шт. Кто-то пишет вес через пробел, кто-то слепляет его с числом, кто-то переводит граммы в килограммы. Даже простое сравнение товаров начинает сбоить, потому что "500 г", "0.5 кг" и "500гр" выглядят по-разному.
Бренд тоже редко стоит на одном и том же месте. В одной строке он идет первым, в другой прячется в середине, в третьей уезжает в конец после вкуса, цвета или серии. Если каталог не умеет отделять бренд от остального текста, поиск и фильтры быстро теряют смысл.
С фасовкой еще больше путаницы. Поставщик может написать "12x500 мл", "0,5 л х 12", "12 шт по 500 мл" или "уп 12 бут 0.5л". Для закупщика это привычная запись. Для импорта это набор кусочков, где неясно, что означает объем одной единицы, что относится к количеству в коробе, а что описывает тип упаковки.
Названия колонок меняются не меньше. Сегодня это "Наименование" и "Цена", завтра - "Номенклатура", "Артикул поставщика", "Цена с НДС", "Ед. изм.". Послезавтра часть полей вообще окажется внутри одного столбца. Импорт не может сам угадать, что именно где лежит.
В результате каталог получает одни и те же проблемы: дубли карточек, ошибки в фильтрах и поиске, сломанную аналитику по брендам и фасовкам и ручную разборку после каждой загрузки.
Прайс-лист почти никогда нельзя считать готовыми данными. Это сырой текст, в котором смысл есть, но форма каждый раз новая.
Какие поля привести к одному виду
Когда поставщики пишут все в одной строке, каталог быстро расползается на дубли. Недостаточно просто вытащить текст из файла. Его нужно разложить по полям, которые потом можно сравнивать, фильтровать и проверять.
Сначала отделяйте бренд от общего названия товара. В строке "Сахар Белый Almaz 1 кг" слово "сахар" описывает тип товара, а Almaz - бренд. Если хранить это вместе, поиск по категории и склейка одинаковых позиций начнут путаться. Один поставщик напишет бренд в начале, другой в конце, третий добавит его латиницей.
Дальше выберите базовые единицы измерения и не меняйте их от файла к файлу. Обычно хватает простого набора: л, мл, кг, г, шт. Самое полезное правило здесь такое: число хранится отдельно от единицы. Тогда "0,5 л", "500 мл" и "0.500 L" можно привести к одному виду и не гадать, одинаковый это товар или нет.
Минимальный набор полей обычно выглядит так: исходная строка без правок, общее название товара, бренд, числовое значение и единица измерения, количество в упаковке. Иногда этого уже достаточно, чтобы перестать плодить дубли.
Фасовку лучше сразу выносить в отдельные поля. "Сок яблочный 1 л 12 шт" содержит как минимум два разных признака: объем одной единицы и число единиц в коробке. Если слить их в одно поле, система не поймет, что 12 относится к упаковке, а не к литрам.
Удобно держать два слоя данных. Первый описывает одну товарную единицу: 1 л, 500 мл, 250 г. Второй описывает упаковку поставки: 6 шт, 12 шт, 24 шт. Это сильно снижает ошибки в закупке и остатках. Иначе "вода 0,5 л x 12" легко превращается либо в 12 литров, либо в 12 отдельных карточек.
Исходную строку сохраняйте всегда. Даже если вы уже выделили бренд, единицу и фасовку, сырая запись нужна для проверки спорных случаев, обучения правил и разбора жалоб от закупщиков. Когда нормализация ошибется, именно она покажет, где сломался разбор.
Если коротко, к одному виду нужно приводить не весь товар целиком, а его части. Тогда каталог живет дольше и требует меньше ручной чистки.
Как собрать словарь и правила по шагам
Словарь для нормализации не пишут по памяти. Его собирают из свежих файлов, которые поставщики реально присылают сейчас. Старые выгрузки часто только мешают: в них остаются бренды, фасовки и обозначения единиц, которых уже нет.
Сначала возьмите последние прайс-листы от всех поставщиков и сложите их в один рабочий набор. Нужна не случайная горсть строк, а нормальная выборка: Excel, CSV, PDF после распознавания, письма с вложениями. Чем шире стартовый набор, тем меньше сюрпризов после запуска.
Потом пройдитесь по полям и выпишите все варианты, которые встречаются в сыром виде. Быстрее всего начать с трех групп: единицы измерения, бренды и фасовки. Уже на этом этапе видно, где больше всего шума: "мл", "ml", "мл.", "литр", "л", "L"; "Nestle", "NESTLE", "Нестле"; "12x500 мл", "12 шт по 0,5 л", "уп 12".
Дальше сведите одинаковые значения в один список и назначьте каждому варианту одно каноническое значение. Если вы решили, что все объемы храните в миллилитрах, не оставляйте часть строк в литрах "для удобства". Если бренд в каталоге пишется "Nestle", то "Нестле" и "NESTLE" должны вести туда же, а не жить как три разные записи.
Спорные случаи лучше сразу отделять от понятных. Если система не уверена, дешевле отправить запись на ручную проверку, чем тихо присвоить неверный бренд или фасовку. Одна спорная строка почти всегда обходится дешевле, чем сотня испорченных карточек.
Еще одна важная вещь - порядок правил. Сначала чистите строку: убирайте лишние пробелы, приводите регистр, заменяйте запятые в числах, удаляйте служебный шум, если он мешает. Только потом разбирайте бренд, единицы и фасовку. Если сделать наоборот, разбор начнет цепляться за мусор и давать лишние совпадения.
Хороший словарь легко узнать по простому признаку: новый файл не ломает схему, а только иногда добавляет пару новых вариантов в уже понятную систему.
Как нормализовать единицы
Сначала выберите одну базовую форму для каждого типа измерения и храните ее в данных, а не только в названии товара. Для веса это обычно граммы, для объема - миллилитры, для счета - штуки. Тогда "0,5 кг", "500 гр" и "0.500 kg" станут одним и тем же значением: 500 г.
Именно на этом часто ломается разбор прайс-листов. Один поставщик пишет "1 л", другой - "1000мл", третий - "1,0 литр". Если оставить все как есть, каталог получит дубли и ошибки в фильтрах.
Полезно хранить четыре вещи отдельно: числовое значение в базовой единице, исходную единицу из файла, тип единицы - вес, объем, штуки или упаковка, и нормализованную запись для каталога. Так вы не теряете исходный текст и можете проверить спорные случаи.
Для веса лучше сразу сводить кг и г к одной логике. Если товар пришел как "2 кг", система переводит его в 2000 г. Если в строке стоит "250гр" или "250 гр.", результат тот же: 250 г. Все сокращения вроде "гр", "г", "kg", "кг" и "g" стоит собрать в словарь заранее.
С объемом правило такое же. "1 л", "1л", "1000 мл", "1000ml" и "1.0 l" должны храниться одинаково, например как 1000 мл. На витрине потом можно показывать "1 л", но внутри лучше держать одно число и одну базовую единицу.
С десятичными числами тоже не нужно спорить. В прайсах встречаются и "0,5", и "0.5". Если разбор читает только один вариант, часть значений просто выпадет. Простое правило такое: сначала заменить запятую на точку, потом сохранить число в числовом поле, а не строкой.
Отдельная проблема - "шт" и "уп". Их нельзя смешивать, даже если поставщик сам так сделал. "12 шт", "1 уп", "упак", "pcs" и "2 уп по 6 шт" описывают разный смысл. В одном случае это единица продажи, в другом - упаковка, в третьем - структура фасовки. Если свалить все в одно поле, потом неясно, что именно продается.
Для спорных записей работает простое правило: храните отдельно единицу продажи и фасовку. Тогда строка "2 уп x 6 pcs" превращается в понятную структуру: 2 упаковки, по 6 штук в каждой. Именно такие мелкие правила потом экономят часы ручной чистки.
Как разбирать бренды и фасовки
Бренд и фасовка чаще всего ломаются там, где поставщик пишет товар так, как привык его менеджер. В одной строке будет "Coca-Cola 12x500 мл", в другой "Кока кола 0,5л х 12", в третьей "ТОО Ромашка / Coca Cola regular 6 по 1 л". Если не разобрать это на части, каталог быстро расползается на дубли.
С брендов лучше начать со словаря синонимов и частых ошибок. Он нужен даже для известных марок. Поставщики пишут "Coca-Cola", "Coca Cola", "CocaCola" и просто "Кока-кола". Все эти варианты должны сводиться к одному нормализованному значению, а исходный текст лучше сохранить отдельно для проверки.
Юрформы в бренде почти всегда мешают. "ООО", "ТОО", "ИП", "LLP" и похожие части обычно относятся к продавцу или производителю по документам, а не к тому, как покупатель ищет товар. Их лучше убирать до сопоставления бренда. Иначе "ТОО Apple City" легко становится ложным брендом.
Отдельно нужно решить, где у вас проходит граница между брендом и линейкой. В строке "Nestle NAN Optipro 3 800 г" бренд может быть "Nestle" или "NAN" - это зависит от модели каталога. А "Optipro 3" при этом будет серией или вариантом. Если такого правила нет, одна и та же линейка уйдет в каталог как бренд, серия и даже модель.
С фасовкой проще работать по шаблонам. Записи вроде "12x500 мл", "6 по 1 л", "4*250 г" и "2 шт x 5 кг" описывают одно и то же: сколько единиц в упаковке и какой объем или вес у каждой единицы. Эти части нужно хранить раздельно. Для "12x500 мл" удобная запись такая: количество - 12, базовый объем - 500 мл, общий объем - 6000 мл. Общий объем можно посчитать потом, но исходные части лучше не терять.
Такой подход сильно упрощает поиск и сравнение. Тогда "6 по 1 л" и "12x500 мл" уже не выглядят разными товарами только из-за формы записи. Если в строке есть и бренд, и серия, и фасовка, лучше разбирать ее по порядку: сначала убрать служебный шум, потом найти бренд по словарю, затем выделить серию и только после этого разбирать упаковку.
Пример с одним товаром в трех файлах
Если смотреть только на исходные строки, кажется, что это три разных товара. Один поставщик пишет "BrandX вода 0,5л 12 шт", второй - "Вода Brand X 500 мл уп.12", третий - "BrandX water 12x0.5 L". Каталог без нормализации часто создает три карточки, а закупка потом получает дубли и путаницу в ценах.
Смысл разбора в том, чтобы отделить товар от формы записи. В этих трех строках меняются порядок слов, язык, пробелы в бренде и способ записи фасовки. Сам товар при этом один и тот же.
Сначала система выделяет бренд. "BrandX" и "Brand X" нужно свести к одному виду, иначе бренд распадется на две записи. Обычно для этого хватает словаря с частыми вариантами написания и простого правила для склейки пробелов внутри известных названий.
Потом система приводит объем к одной единице. Записи "0,5л", "500 мл" и "0.5 L" говорят об одном объеме - 500 мл. После этого разбирается фасовка: "12 шт", "уп.12" и шаблон "12x0.5 L" все указывают на упаковку из 12 единиц по 500 мл.
Что получается после разбора
После нормализации карточка уже выглядит не как строка из прайс-листа, а как набор полей:
- бренд: BrandX
- тип товара: вода
- объем одной единицы: 500 мл
- фасовка: 12 шт
Запись "water" здесь тоже не мешает. Если у вас есть словарь синонимов, система сопоставит "water" и "вода" с одной товарной группой. Без этого одна и та же позиция легко уедет в разные категории.
На практике такой разбор решает очень простую задачу: все три строки можно свести к одной карточке товара. Дальше вы сравниваете цены поставщиков по одной позиции, а не вручную ищете, где "Brand X" совпадает с "BrandX".
Где команды чаще всего ошибаются
Большинство сбоев начинается не на сложных строках, а на слишком смелых допущениях. Команда видит колонку "Бренд" или "Объем" и верит, что внутри именно это. На практике в "Объем" легко лежит "6 шт", а в "Комментарий" - половина нужных атрибутов. Пока вы не посмотрите на сами строки, схема разбора будет строиться на неверных предположениях.
Еще одна частая ошибка - путать размер товара и транспортную упаковку. Запись "вода 1,5 л x 6" описывает бутылку 1,5 л и короб из 6 штук, а не товар объемом 9 литров. Если система складывает это в одно поле, каталог ломается быстро: фильтры показывают странные фасовки, закупка сравнивает несопоставимые позиции, а склад получает лишние коробки.
Плохая привычка - перезаписывать исходный текст после очистки. Допустим, строку "0,5л/12 шт" вы превратили в "500 мл". Выглядит аккуратно, но след ошибки пропал: уже непонятно, куда делись "12 шт" и почему товар теперь выглядит как поштучный. Сырой текст, результат разбора и причина правки должны жить рядом, а не вместо друг друга.
Автоправка спорных строк без очереди на проверку тоже дорого обходится. Модель или правило может угадывать бренд в 95% случаев, но оставшиеся 5% часто самые неприятные. Если разбор делает LLM через OpenAI-совместимый шлюз вроде AI Router, правило остается тем же: модель не должна молча править строку с низкой уверенностью.
Есть простой минимум, который спасает от повторных ошибок:
- храните исходную строку без изменений;
- разделяйте товарную единицу и короб;
- помечайте сомнительные разборы уровнем уверенности;
- отправляйте спорные строки в очередь на проверку;
- записывайте версию словаря и правила для каждой загрузки.
Последняя проблема выглядит скучно, но бьет сильно. Команда меняет словарь брендов, добавляет новое правило для "гр", "g" и "гр.", а через неделю уже никто не помнит, что именно изменилось. Без версий нельзя понять, после какого шага выросли ошибки и как откатить неудачную правку.
Не доверяйте файлу на слово. Смотрите на реальные строки, храните след каждого решения и оставляйте человеку право проверить сомнительный случай. Это дешевле, чем потом чинить каталог вручную.
Быстрая проверка перед загрузкой
Перед импортом полезно смотреть не только на итоговые колонки, но и на пару "как было" и "как стало" для каждой строки. Если система превратила "12 шт х 0,5 л" в аккуратные поля, человек должен быстро понять, откуда взялся каждый кусок. Иначе ошибки прячутся до момента, когда товар уже попал в каталог.
Хорошая проверка занимает несколько минут и ловит большую часть сбоев. Достаточно пройтись по пяти точкам:
- сохраняйте исходный текст рядом с нормализованным результатом;
- держите все единицы измерения в одном справочнике, а не в правилах по разным файлам;
- пропускайте бренды через словарь синонимов, чтобы "P&G", "Procter and Gamble" и русская запись сходились в одно значение;
- разбивайте фасовку на количество и базовую единицу отдельно;
- складывайте спорные строки в отдельный список, а не смешивайте их с чистыми.
Особенно часто ломается фасовка. Строки "6х1.5л", "6 x 1,5 l" и "уп. 6 бут по 1,5 л" выглядят по-разному, но смысл у них один. Если хранить отдельно количество 6 и базовую единицу 1,5 л, дальше проще считать цену за литр, сравнивать товары и искать дубли.
С единицами работает то же правило. Один справочник для "кг", "kg", "килограмм", "гр", "g" и других вариантов снимает половину шума. Не заставляйте модель или правила каждый раз угадывать заново. Пусть они приводят строку к тем значениям, которые вы уже приняли.
Список спорных строк нужен не для отчета. Он экономит время оператору. Вместо просмотра всего файла человек открывает только те 3-7% строк, где система сомневается: не нашла бренд, увидела две возможные фасовки или встретила новую единицу.
Последний экран проверки должен показывать простую цифру: какую долю строк система разобрала без ручной правки. Если вчера это было 92%, а сегодня 61%, файл лучше не загружать. Такой сигнал полезнее длинного отчета, потому что сразу показывает, что изменилось: правила, словарь или формат поставщика.
Что делать после первого запуска
После первого прогона не пытайтесь сразу охватить весь каталог. Лучше сузить задачу: взять одну товарную категорию и 1000 самых частых строк. Так вы быстро увидите, где система уже справляется, а где путает бренд, единицу и фасовку.
Такой старт дает честную картину. Если в этих 1000 строках много ручных правок, на остальных файлах ошибок будет еще больше. Если частотные позиции разбираются ровно, можно двигаться дальше без лишнего шума.
Раз в неделю полезно разбирать все новые неизвестные варианты, которые накопились после загрузок. Не откладывайте это на месяц. За неделю список обычно еще короткий, и команда успевает понять, откуда взялись новые записи: новый поставщик, странное сокращение, лишний текст в названии или другая фасовка.
Здесь помогает простой цикл: собрать строки, которые не прошли разбор или получили низкую уверенность, сгруппировать их по типу ошибки, добавить новые правила и синонимы, а потом повторно прогнать только проблемный набор. После этого стоит проверить, не выросло ли число дублей.
На самых грязных строках полезно сравнить два подхода: правила и LLM. Правила обычно ведут себя ровно на понятных шаблонах, а модель лучше вытаскивает смысл из хаотичных названий вроде "Сахар белый меш 25кг ГОСТ" или "Coca Cola ж/б 0,33 x12". На практике редко побеждает что-то одно. Чаще всего лучше работает связка: сначала простые правила, потом модель для сложных случаев.
Метрики стоит сохранять с первого дня, даже если процесс еще сырой. Минимальный набор такой: доля ошибок после разбора, доля ручных правок, число дублей после нормализации и доля строк, которые система не смогла разобрать. Если через две недели эти числа не снижаются, проблема обычно не в объеме данных, а в слабых правилах или в плохом разборе редких форматов.
Если команда проверяет несколько моделей, удобно гонять один и тот же набор строк через единый OpenAI-совместимый API и сравнивать результат по журналам. Например, AI Router позволяет тестировать разные модели через один эндпоинт и вести аудит-логи, не меняя привычные SDK и код. Это удобно, когда нужно сравнивать качество разбора на одинаковом наборе, а не спорить по ощущениям.
Часто задаваемые вопросы
Можно ли загружать прайс-листы в каталог как есть?
Нет. Сначала приведите к одному виду название, бренд, единицы и фасовку. Иначе каталог получит дубли, цены разъедутся, а остатки уйдут в похожие карточки.
Какие поля стоит выделить в первую очередь?
Обычно хватает исходной строки, общего названия товара, бренда, числа и единицы измерения, а также количества в упаковке. Такой набор уже помогает склеивать одинаковые позиции и ловить ошибки в импорте.
В какие единицы лучше переводить вес и объем?
Для веса удобнее хранить граммы, для объема — миллилитры, для счета — штуки. Тогда 0,5 кг, 500 г и 0.500 kg превращаются в одно значение, и сравнение работает без лишних условий.
Зачем сохранять исходную строку после нормализации?
Она нужна для проверки спорных случаев. Если правило ошиблось, вы сразу видите, что пришло от поставщика и на каком месте разбор свернул не туда.
Как не перепутать размер товара и транспортную упаковку?
Разделяйте их сразу. У товара есть свой вес или объем, а у поставки — число единиц в коробе или упаковке. Для строки вроде 1,5 л x 6 это значит: одна бутылка 1,5 л и короб из 6 штук, а не товар на 9 литров.
Что делать со строками, которые система разобрала неуверенно?
Не правьте их молча. Помечайте такие строки уровнем уверенности и отправляйте в отдельную очередь на проверку. Так вы исправите несколько сложных записей вручную и не испортите сотни карточек.
Нужен ли отдельный словарь брендов?
Да, без него бренды быстро расползаются на варианты вроде Nestle, NESTLE и Нестле. В словарь стоит добавить синонимы, частые опечатки и убрать юрформы вроде ТОО или ООО, если они мешают поиску.
Когда лучше использовать правила, а когда LLM?
Начните с правил. Они хорошо разбирают понятные шаблоны вроде 12x500 мл или 250 гр. Модель подключайте там, где названия грязные и порядок слов плавает. Если модель сомневается, отдайте строку человеку, а не в каталог.
Как быстро проверить качество разбора перед загрузкой?
Посмотрите на пары как было и как стало по выборке строк. Если система резко хуже разобрала файл, чем обычно, импорт лучше остановить и проверить словарь, правила или новый формат поставщика.
С чего начать после первого запуска нормализации?
Не берите сразу весь каталог. Проще начать с одной категории и частых строк, потом раз в неделю разбирать новые неизвестные варианты. Параллельно считайте долю ручных правок, дублей и неразобранных строк — по этим цифрам видно, стало ли лучше.