如何用sqlite计算Jaccard相似系数

How to calculate Jaccard similarity coefficient with sqlite

我有一个用 sqlite3 创建的数据库,其中每个用户有 3 个可能的爱好,这些爱好被保存为一个布尔值(如果用户喜欢则为 1,如果不喜欢则为 0)。 我想得到一个按 Jaccard 相似系数排序的相似对的列表,这意味着我必须计算对他们俩都适用的爱好数量,然后将其除以他们中的任何一个选择的爱好数量。

I have created this VIEW 所有对必须在视图中包含 wonka。 Carros、tecnologia 和 comida 是爱好。

与其尝试将每个用户的所有爱好存储在一行中,然后加入它们(就像您的观点似乎正在做的那样),然后尝试将它们相加,使用更好的数据库进行计算要容易得多通过在另一个 table 中跟踪用户和爱好来表达用户和爱好之间的 关系 的设计(想想需要做什么才能添加第四个爱好。)。您需要查找 many-to-many relationshipjunction table 等术语以获得更多信息,and/or找到有关数据库设计的好资源。

有了这样的设计,给定这些 table:

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;