Я пытаюсь сопоставить два списка продуктов по названию.
Продукты поступают с разных веб-сайтов, и их названия могут различаться у разных веб-сайтов различными способами, например, "iPhone 128ГБ " против " Apple iPhone 128GB ".
Списки товаров пересекаются, но не равны, и один не является надмножеством другого;т.е. некоторые продукты из списка A
отсутствуют в списке B
, и наоборот.
Учитывая алгоритм, который сравнивает две строки (названия продуктов) и возвращает оценку сходства между 0и 1 (у меня уже есть удовлетворительная реализация здесь), Я ищу алгоритм, который выполняет оптимальное соответствие списка A
списку B
.
Другими словамиЯ думаю, что я ищу алгоритм, который максимизирует сумму всех одинаковых оценок в матчах.
Обратите внимание, что продукт из одного списка должен соответствовать не более чем одному продукту из другого списка.
Моя первоначальная идея
- для каждого продукта в
A
, получить аналогично каждому продукту в B
и сохранить продукт, который дает наивысший балл, при условии, что он превышаетопределенный порог, такой как 0.75
. Сопоставьте эти продукты. - , если продукт с наивысшей оценкой уже сопоставлен с другим продуктом в
A
ранее в цикле, возьмите вторую наивысшую, при условии, что она превышаетпорог выше. Вместо этого соответствует .
и т. Д.
Меня беспокоит эта нативная реализация, которая заключается в том, что если позднее в цикле есть лучшее совпадение, то продуктс B
уже был присвоен другому продукту с A
на предыдущей итерации, сопоставление не является оптимальным.
Улучшенная версия
Чтобы обеспечить соответствие продукта егоаналог наивысшего сходства, я подумал о следующей реализации:
- предварительно рассчитать оценки сходства для всех
A
- B
пар - , отбросить сходства ниже, чем используемый порогвыше
- порядок по сходству, сначала самый высокий
- для каждой пары, если ни продукт
A
, ни продукт B
не были сопоставлены, соответствует этим продуктам .
Этот алгоритм должен оптимально подбирать пары продуктов, гарантируя, что каждая пара имеет наибольшее сходство.
Меня беспокоит то, что очень интенсивно использует вычислительные ресурсы и памятьive : скажем, у меня есть 5000 товаров в обоих списках, то есть 25 000 000 баллов сходства для предварительного вычисления и потенциального хранения в памяти (или базе данных);на самом деле он будет ниже из-за минимально необходимого порога, но он все равно может стать очень большим и по-прежнему интенсивно использовать процессор.
Я что-то пропустил?
Есть ли более эффективный алгоритм, которыйвыдает тот же вывод, что и эта улучшенная версия?