tony-pitchblack/marketplace_competitors

0

stars

223

commits

Jupyter Notebook

primary language

Sep 21, 2025

updated

README

Определение товаров-конкурентов на онлайн-маркетплейсах

Общий пайплайн состоит из 3 основных стадий (см. Рисунок 1):

  1. ГЕНЕРАЦИЯ КАНДИДАТОВ - фильтруем товары по экономическим показателям чтобы отбросить заранее неподходящие варианты.
  2. SIMILARITY SEARCH - ранжирование товаров-кандидатов по степени похожести.
  3. FINAL DECISION - используем градиентный бустинг с табличными фичами чтобы принять окончательное решение о конкурентности или неконкурентности пар товаров.

Рисунок 1

Репозиторий составлен из нескольких подпроектов (См. README для каждого подпроекта отдельно).

Для установки среды для каждого подпроекта есть свой environment.yml или setup.py.

Подпроекты

1. clip-siamese

Для большинства ноутбуков подпроекта clip-siamese доступны скринкасты в data/walthrhough, которые можно скачать с помощью hf_data_download.ipynb из HF repo INDEEPA/clip-siamese.

В данном подпроекте обучаем модель SiameseRuCLIP для идентификации похожих товаров по содержанию - название, изображение, описание (см. Рисунок 2).

Рисунок 2

Для разметки данных используем регулярные выражения (в cross-encoder приведен пример разметки данных с помощью LLM) чтобы получить пары товаров для контрастного обучения (см. Рисунок 3)

Рисунок 3

Важно разделять отрицательные примеры на простые отрицательные и сложные отрицательные для обеспечения разнообразия выборки (см. Рисунок 4)

Рисунок 4

Чтобы сократить кол-во пар при сохранении разнообразия датасета, кластеризуем простые отрицательные примеры и будем сэмплировать по 1 из каждого кластера (см. Рисунок 5)

Рисунок 5

Выбираем порог классификации по ROC-кривой в ноутбуках `contrastive_test_embs_from-*.ipynb` (см. Рисунок 6).

Рисунок 6

Модель похожести получает 80-90+ Accuracy на валидации/тесте на попарном датасете OZ_geo_5500 по целевым товарам (товарам продаца 'ИНТЕРТРЕЙД'). См. clip-siamese/contrastive_test_embs_from-pairwise-rendered.ipynb и соответствующий скринкаст

При этом модель получает точность < 10 на всем наборе пар целевых товаров (в т.ч. которые попали в трейн), что странно - возможно виноват data leak. См. clip-siamese/contrastive_test_embs_from-pairwise-queries.ipynb и соответствующий скринкаст.

TODO: исключить Data Leak в тренировочном скрипте или показать, что он несущественный TODO: замерить метрики ранжирования TODO: обучить на лоссе для ранжирования, сравнить с контрастной версией TODO: сравнить SimameseRuCLIP обученный на лоссе для ранжирования с CrossEncoder (см. cross-encoder)

2. competitors-xgb

Модель для определения конкурентных товаров с помощью градиентного бустинга на экономических признаках + (опционально скоры похожести из RuCLIP/Sentence Transformers).

TODO: Можно доработать чтобы принимать на вход скор похожести пары товаров из SiameseRuCLIP, а также добавить относительные признаки (см. competitors-xgb/reports/XGBoost_feature_importance_analysis.pdf)

3. cross-encoder

Планировалось обучать Cross-Encoder чтобы повторить пайплайн ecom-tech. В частности, была попытка разметить набор данных OZ_geo_5500 с помощью LLM - для каждого товара найти все дубликаты/похожие по содержанию (название + описание, без картинки). После 50+ итераций улучшения промпта (см. make_OZ_geo_5500_pairwise-LLM-*.ipynb) промпт все еще показывал нестабильные результаты. В частности, было выявлено большое кол-во ложноположительных детекций в результирующей LLM разметке, что неприемлемо для контрастного обучения. Особые сложности вызывала обработка числовых признаков. Так, на Рисунке 6 приведен пример, когда LLM посчитала два товара из категории географиеских карт дубликатами (D = Duplicate) несмотря на сильное различие в масштабе, что является критической ошибкой при определении конкурентных товаров.

Рисунок 6

Поэтому была предложена альтернативная схема разметики датасета OZ_geo_5500 с помощью регулярных выражений (см. clip-siamese/make_OZ_geo_5500_pairwise-regex).

TODO: обучить кросс-энкодер на разметке по регуляркам

ru-clip-cc12m

Легаси код для обучения ruclip.

TODO: определить, он вообще лучше, чем исходные веса (от Сбера): ruclip в качестве backbone для SiameseRuCLIP?

Contributors

tony-pitchblack

220 commits

nebeh

3 commits

tony-pitchblack/marketplace_competitors

0

stars

223

commits

Jupyter Notebook

primary language

Sep 21, 2025

updated

README

Определение товаров-конкурентов на онлайн-маркетплейсах

Общий пайплайн состоит из 3 основных стадий (см. Рисунок 1):

  1. ГЕНЕРАЦИЯ КАНДИДАТОВ - фильтруем товары по экономическим показателям чтобы отбросить заранее неподходящие варианты.
  2. SIMILARITY SEARCH - ранжирование товаров-кандидатов по степени похожести.
  3. FINAL DECISION - используем градиентный бустинг с табличными фичами чтобы принять окончательное решение о конкурентности или неконкурентности пар товаров.

Рисунок 1

Репозиторий составлен из нескольких подпроектов (См. README для каждого подпроекта отдельно).

Для установки среды для каждого подпроекта есть свой environment.yml или setup.py.

Подпроекты

1. clip-siamese

Для большинства ноутбуков подпроекта clip-siamese доступны скринкасты в data/walthrhough, которые можно скачать с помощью hf_data_download.ipynb из HF repo INDEEPA/clip-siamese.

В данном подпроекте обучаем модель SiameseRuCLIP для идентификации похожих товаров по содержанию - название, изображение, описание (см. Рисунок 2).

Рисунок 2

Для разметки данных используем регулярные выражения (в cross-encoder приведен пример разметки данных с помощью LLM) чтобы получить пары товаров для контрастного обучения (см. Рисунок 3)

Рисунок 3

Важно разделять отрицательные примеры на простые отрицательные и сложные отрицательные для обеспечения разнообразия выборки (см. Рисунок 4)

Рисунок 4

Чтобы сократить кол-во пар при сохранении разнообразия датасета, кластеризуем простые отрицательные примеры и будем сэмплировать по 1 из каждого кластера (см. Рисунок 5)

Рисунок 5

Выбираем порог классификации по ROC-кривой в ноутбуках `contrastive_test_embs_from-*.ipynb` (см. Рисунок 6).

Рисунок 6

Модель похожести получает 80-90+ Accuracy на валидации/тесте на попарном датасете OZ_geo_5500 по целевым товарам (товарам продаца 'ИНТЕРТРЕЙД'). См. clip-siamese/contrastive_test_embs_from-pairwise-rendered.ipynb и соответствующий скринкаст

При этом модель получает точность < 10 на всем наборе пар целевых товаров (в т.ч. которые попали в трейн), что странно - возможно виноват data leak. См. clip-siamese/contrastive_test_embs_from-pairwise-queries.ipynb и соответствующий скринкаст.

TODO: исключить Data Leak в тренировочном скрипте или показать, что он несущественный TODO: замерить метрики ранжирования TODO: обучить на лоссе для ранжирования, сравнить с контрастной версией TODO: сравнить SimameseRuCLIP обученный на лоссе для ранжирования с CrossEncoder (см. cross-encoder)

2. competitors-xgb

Модель для определения конкурентных товаров с помощью градиентного бустинга на экономических признаках + (опционально скоры похожести из RuCLIP/Sentence Transformers).

TODO: Можно доработать чтобы принимать на вход скор похожести пары товаров из SiameseRuCLIP, а также добавить относительные признаки (см. competitors-xgb/reports/XGBoost_feature_importance_analysis.pdf)

3. cross-encoder

Планировалось обучать Cross-Encoder чтобы повторить пайплайн ecom-tech. В частности, была попытка разметить набор данных OZ_geo_5500 с помощью LLM - для каждого товара найти все дубликаты/похожие по содержанию (название + описание, без картинки). После 50+ итераций улучшения промпта (см. make_OZ_geo_5500_pairwise-LLM-*.ipynb) промпт все еще показывал нестабильные результаты. В частности, было выявлено большое кол-во ложноположительных детекций в результирующей LLM разметке, что неприемлемо для контрастного обучения. Особые сложности вызывала обработка числовых признаков. Так, на Рисунке 6 приведен пример, когда LLM посчитала два товара из категории географиеских карт дубликатами (D = Duplicate) несмотря на сильное различие в масштабе, что является критической ошибкой при определении конкурентных товаров.

Рисунок 6

Поэтому была предложена альтернативная схема разметики датасета OZ_geo_5500 с помощью регулярных выражений (см. clip-siamese/make_OZ_geo_5500_pairwise-regex).

TODO: обучить кросс-энкодер на разметке по регуляркам

ru-clip-cc12m

Легаси код для обучения ruclip.

TODO: определить, он вообще лучше, чем исходные веса (от Сбера): ruclip в качестве backbone для SiameseRuCLIP?

Contributors

tony-pitchblack

220 commits

nebeh

3 commits

Languages

Jupyter Notebook

99.6%