Как найти «связанные элементы» в PHP - PullRequest
16 голосов
/ 28 января 2010

мы часто видим «связанные предметы». Например, в блогах у нас есть похожие посты, в книгах у нас есть родственные книги и т. Д. У меня вопрос, как мы собираем эти результаты? Если это просто тег, я часто вижу связанные элементы, у которых нет такого тега. Например, при поиске «розовый» связанный элемент может иметь тег «фиолетовый».

У кого-нибудь есть идеи?

Ответы [ 8 ]

31 голосов
/ 28 января 2010

Существует много способов вычислить сходство двух элементов, но для простого метода взгляните на коэффициент Джакарда.

http://en.wikipedia.org/wiki/Jaccard_index

Что: J (a, b) = пересечение (a, b) / объединение (a, b)

So lets say you want to compute the coefficient of two items:

Item A, which has the tags  "books, school, pencil, textbook, reading"
Item B, which has the tags  "books, reading, autobiography"

intersection(A,B) = books, reading
union(A,B) = books, school, pencil, textbook, reading, autobiography

so J(a,b) = 2/6 = .333

So the most related item to A would be the item which results in the highest Jaccard Coefficient when paired with A.
4 голосов
/ 28 января 2010

Вот несколько способов:

  1. Соединение их вручную. Составьте таблицу с полями item_id и related_item_id, затем создайте интерфейс для вставки соединений. Полезно для связи двух элементов, которые связаны, но не имеют сходства или не принадлежат к той же категории / тегу (или в таблице входов без категории). Пример: ванна и резиновая уточка
  2. Поднимите несколько предметов, которые принадлежат к той же категории или имеют похожий тег. Идея заключается в том, что эти предметы должны быть несколько связаны, поскольку они находятся в одной категории. Пример: на странице просмотра ЖК-мониторов в разделе «Связанные элементы» есть случайные ЖК-мониторы (с одинаковым ценовым диапазоном / производителем / разрешением).
  3. Выполните текстовый поиск, сопоставляющий имя текущего элемента (и / или описание) с другими элементами в таблице. Вы поняли идею.
2 голосов
/ 06 марта 2012

Чтобы получить простой список связанных элементов на основе тегов, основные решения выглядят так:

3 таблицы, одна с элементами, одна с тегами и одна с соединением. Таблица соединений состоит из двух столбцов, по одному для каждого идентификатора из остальных таблиц. Запись в таблице соединений связывает тег с элементом, помещая их соответствующие идентификаторы в строку.

Теперь, чтобы получить этот список связанных предметов.

получить все элементы, которые имеют хотя бы один тег с исходным элементом. Обязательно извлекайте теги вместе с элементами, а затем используйте простой механизм оценки, чтобы определить, какой элемент разделяет наибольшее количество тегов по сравнению с исходным. каждый тег увеличивает отношение релевантности на единицу.

В зависимости от ваших привычек тегирования, было бы разумно добавить некоторый контр-механизм, чтобы не допустить путаницы значимостью больших общих тегов. Чтобы достичь этого, вы могли бы придать больший вес меткам ниже определенного порога приборов. Пороговое значение, которое обычно хорошо работает для меня, это total_number_of_tag_appliances / total_number_of_tags, в результате чего получается среднее количество устройств. Если число тегов appliance меньше среднего, отношение релевантности увеличивается вдвое.

1 голос
/ 07 июня 2010

Я бы сказал, что они используют онтологию для того, что добавляет в приложение более замечательные функции.

1 голос
/ 28 января 2010

Это может быть больше, чем тег, например, это может быть среднее значение для каждой работы, появляющейся в абзаце, а затем заголовки и т. Д.

0 голосов
/ 13 марта 2017

Вот реализация индекса jaccard между двумя текстами на основе биграмм. https://packagist.org/packages/darkopetreski/textcategorization

0 голосов
/ 13 июля 2011

Это моя реализация (GIST) из Индекс Jaccard с PostgreSQL и Ruby on Rails ...

0 голосов
/ 28 января 2010

это также может быть основано на "люди, которые купили эту книгу, также купили"

Как бы то ни было, вам понадобится какая-то связь между вашими предметами, и в основном они будут сделаны людьми

...