Посоветуйте мне алгоритм подбора людей - PullRequest
1 голос
/ 11 октября 2011

В настоящее время я работаю над проектом, в котором мне нужно подбирать людей по категориям продуктов питания, которые им нравятся:

Это сценарий:

У меня есть список пользователей и их любимых продуктов в моей базе данных. Структура базы данных выглядит следующим образом:

USERS(id,name,email,gender,dob)
Fav_Food (id,user_name,food,desc)

Таблица данных для пользователей:

1, Алиса, alice@lala.com, женщина, 11 октября 2010 г.

2, Боб, bob@lala.com, мужчина, 12 октября 2010 г.

3, Джейсон, jason@lala.com, мужчина, 13 октября 2010 г.

Данные для таблицы fav_foods:

1, Алиса, яблоко, немного деск

2, Алиса, банан, немного деск

3, Алиса, Груша, немного дес

4, Боб, яблоко, немного деск

5, Боб, заварной крем, немного деск

6, Джейсон, банан, немного деск

6, Джейсон, яблоко, немного деск

Представь, что я Алиса, где я люблю яблоко, банан и грушу. Как я смогу подбирать людей по любимой еде? Например, я сначала проверяю, любит ли кто-нибудь яблоко, банан и грушу (включая все три), а затем перебираю только две комбинации (apple,banana)(apple,pear)(banana,pear)(banana,apple) .... и так далее .....

Представьте, что это похоже на диаграмму Венна, где мне интересно взаимодействие. Мне интересно предложить пользователям наиболее подходящие. Есть ли какой-нибудь алгоритм, который я могу использовать для php?

Ответы [ 3 ]

4 голосов
/ 11 октября 2011

что вы можете сделать, это присоединить таблицу fav_foods к себе, а затем подсчитать совпадения:

SELECT u2.user_name,count(*) as likeness 
FROM `fav_food` as u1 INNER JOIN `fav_food` as u2 ON (u1.user_name = 'alice' AND 
                                                 u1.food = u2.food AND 
                                                 u2.user_name != "alice")
GROUP BY u2.user_name 
ORDER BY likeness DESC

будет выводиться:

user_name   likeness
jason       2
bob         1

Трюк на условиях внутреннего соединения ... =)

Надеюсь, это поможет

РЕДАКТИРОВАНИЕ: ой, я исправил запрос =)

1 голос
/ 12 октября 2011

Лично я бы сделал пользовательское отношение еды HABTM вместо того, чтобы хранить одни и те же строки снова и снова.

Во-вторых, ищите здесь хорошее объяснение коэффициента Жакара

Если вы решили использовать отношение HABTM, взгляните на эту документацию: http://book.cakephp.org/view/1044/hasAndBelongsToMany-HABTM Последний пример на этой странице может быть вам наиболее интересен.

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

Или вы можете просто получить всех пользователей и их еду и сравнить их, используя коэффициент Жакара.

Просто добавьте некоторые возможности, надеюсь, это поможет!

1 голос
/ 11 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...