Как рассчитать коэффициент подобия Жакара с помощью sqlite - PullRequest
0 голосов
/ 26 мая 2019

У меня есть база данных, созданная с помощью sqlite3, где у каждого пользователя есть 3 возможных хобби, которые сохраняются в виде логического значения (1, если пользователю это нравится, 0, если он этого не делает).Я хочу получить список схожих пар, упорядоченных по коэффициенту подобия Жакара, что означает, что мне нужно подсчитать количество увлечений, которые являются истинными для них обоих, и разделить его на количество хобби, которые выбрал любой из них.

Я создал этот ПРОСМОТР Все пары должны содержать wonka на виде.Carros, tecnologia и comida - это хобби.

1 Ответ

0 голосов
/ 27 мая 2019

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

С таким дизайном, учитывая эти таблицы:

CREATE TABLE users(userID INTEGER PRIMARY KEY, userName TEXT UNIQUE);
CREATE TABLE hobbies(hobbyID INTEGER PRIMARY KEY, hobbyName TEXT UNIQUE);
CREATE TABLE interests(userID INTEGER REFERENCES users(userID) ON DELETE CASCADE
                     , hobbyID INTEGER REFERENCES hobbies(hobbyID) ON DELETE CASCADE
                     , liked INTEGER
                     , PRIMARY KEY(userID, hobbyID)) WITHOUT ROWID;

Вы можете рассчитать коэффициент сходства для всех пар с чем-то вроде:

SELECT u1.userName AS "Person 1", u2.UserName AS "Person 2"
     , ifnull(total(i1.liked AND i2.liked) / total(i1.liked OR i2.liked), 0.0) AS Similarity
FROM users AS u1
JOIN users AS u2 ON u1.userId <> u2.userId
LEFT JOIN interests AS i1 ON u1.userId = i1.userId
LEFT JOIN interests AS i2 ON u2.userId = i2.userId AND i1.hobbyId = i2.hobbyID
GROUP BY u1.userId, u2.userId;
...