Предположим, у нас есть покупатели и продавцы, которые пытаются найти друг друга на рынке. Покупатели могут помечать свои потребности с помощью ключевых слов; продавцы могут сделать то же самое для того, что они продают. Я заинтересован в поиске алгоритма (ов) ранжирования продавцов с точки зрения их релевантности для конкретного покупателя на основе их двух наборов ключевых слов.
Вот пример:
buyer_keywords = {"furry", "four legs", "likes catnip", "has claws"}
и затем у нас есть два потенциальных продавца, которым нам нужно упорядочить порядок с точки зрения их релевантности:
seller_keywords[1] = {"furry", "four legs", "arctic circle", "white"}
seller_keywords[2] = {"likes catnip", "furry",
"hates mice", "yarn-lover", "whiskers"}
Если мы просто используем пересечение ключевых слов, мы не получаем большой дискриминации: оба пересекаются по 2 ключевым словам. Если мы разделим количество пересечений на размер объединенного множества, продавец 2 на самом деле будет хуже из-за большего количества ключевых слов. Это может привести к автоматическому штрафу за любой метод, не корректирующий размер набора ключевых слов (и мы определенно не хотим штрафовать за добавление ключевых слов).
Чтобы немного больше разобраться в проблеме, предположим, что у нас есть некоторая достоверная мера интенсивности атрибутов ключевых слов (которые должны быть равны 1 для каждого продавца), например:
seller_keywords[1] = {"furry":.05,
"four legs":.05,
"arctic circle":.8,
"white":.1}
seller_keywords[2] = {"likes catnip":.5,
"furry":.4,
"hates mice":.02,
"yarn-lover":.02,
"whiskers":.06}
Теперь мы можем суммировать значение попаданий: теперь Продавец 1 получает оценку 0, а Продавец 2 - 0,9. Пока все хорошо, но теперь мы можем получить третьего продавца с очень ограниченным набором неописательных ключевых слов:
seller_keywords[3] = {"furry":1}
Это катапультирует их наверх для любого попадания по их единственному ключевому слову, что не очень хорошо.
В любом случае, я предполагаю (и надеюсь), что это довольно общая проблема и что существуют различные алгоритмические решения с известными преимуществами и ограничениями. Это, вероятно, что-то, что рассматривается в CS101, поэтому я думаю, что хорошим ответом на этот вопрос может быть просто ссылка на соответствующие ссылки.