Как создать систему тегов, такую ​​как stackoverflow

Я реализую систему тегов, аналогичную системе тегов StackOverflow, но мне просто интересно, как получить связанные теги и определить веса отношений между тегами, например список «Связанных тегов» на любой странице тегов, подобной этой https://stackoverflow.com/questions/tagged/php они определяют вес отношения одновременным появлением двух или более тегов

Как я могу сделать это в PHP / MySQl, чтобы определить наиболее связанные теги для тега «X» и поддерживать все веса в актуальном состоянии по мере того, как пользователи добавляют все больше и больше сообщений / вопросов?


person Zamblek    schedule 17.11.2010    source источник


Ответы (3)


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

  1. с учетом тега X
  2. проверьте все остальные теги Y
  3. посчитайте, как часто Y и X появляются одновременно
  4. разделите на то, как часто появляется Y
  5. ???
  6. Выгода!!!

Что касается дополнительной информации о шаге 5: эта информация меняется очень медленно, поэтому вы действительно можете кэшировать этот материал и воссоздавать его только тогда, когда у вас есть время.

В конце концов, вы хотите отношения

conditional_probability(X, Y, P)

Это говорит о том, насколько вероятен (P) тег Y для данного X. P был рассчитан на шаге 4.

person Daren Thomas    schedule 17.11.2010
comment
Я думаю, вам следует быть более точным здесь, в пятом шаге. ;) - person Bobby; 17.11.2010
comment
Я собирался написать это как SQL-запрос, но, глядя на количество вопросов (отсюда и ссылки на теги) на этом веб-сайте, я сомневаюсь, что каждый раз, когда кто-то хочет задать вопрос, он производит столько подсчетов и групп. Ведь эту информацию чаще читают, чем изменяют. - person AlexanderMP; 17.11.2010

Я использовал эту запись в блоге для вычисление относительного размера тега в облаке. Вы можете использовать этот алгоритм для всего мог или для конкретного найденного набора.

Вместо того, чтобы хранить денормализованные веса для всех тегов в базе данных, я кэширую их в своем (Ruby) процессе и перестраиваю их, когда теги добавляются / удаляются или когда процесс перезапускается.

Что касается того, как их хранить, вам обычно нужно:

  1. Таблица тегов, связывающая уникальные имена тегов с идентификаторами строк, и
  2. Таблица tags_items с отображением n-to-n между тегами и элементами.

Как только у вас есть это и когда у вас есть найденный набор элементов на странице результатов, это простое и уникальное объединение для определения набора «связанных» тегов.

person Phrogz    schedule 17.11.2010

1 Каждый идентификатор сообщения может быть помечен одним или несколькими тегами (PHP + другие теги)

2 Возвращаясь назад, так же, как каждый тег связан с идентификатором сообщения

3 Каждый идентификатор сообщения получает все теги, кроме PHP

4 Показывать только те, у которых количество больше определенного числа (скажем, 4000)

Подумайте об этом, этот вопрос был помечен тегами "Mysql", "Дизайн базы данных", "Теги" и "Тегирование". Вы видите, как вы связали PHP с другими тегами.

person jahajee.com    schedule 11.04.2013