我开始了一个比我最初想象的要复杂得多的项目。我正在尝试规划一个基于 bool (真/假)问题和答案的系统。系统上的用户可以回答大量 bool (真/假)问题中的任何问题,并根据他们的答案显示最相似用户的列表(按相似度排序)。
我在谷歌上搜索了很多,但仍然没有想出太多,所以我希望有人能指出我正确的方向。我想知道:
存储此类数据的最佳数据结构和方法是什么? 我最初假设我可以在 SQL 数据库中创建两个表“问题”和“答案”。但是,我不知道如果将两组答案都列为数字字符串,比较它们是否会更简单。 IE。 0 = 未回答,1 = 真,2 = 假。当比较字符串时,可以为“未回答”= 0、“相同答案”= 1、“相反答案”= -1 添加权重,从而产生相似性分数。
我将如何比较两组答案? 为了能够计算出这组答案之间的“相似性”,我将不得不编写一个比较函数。有谁知道什么样的比较最适合这个问题?我查看了 sequence alignment我认为这可能是正确的方法,但我不确定,因为这要求数据按长序列排列,而且问题不相关,因此不是自然的序列。
如何将此比较函数应用于大量数据? 一旦我编写了比较函数,我就可以将每个用户的答案与每个其他用户的答案进行比较,但这似乎不是很有效,并且可能不会很好地扩展。我一直在调查cluster analysis根据类似答案自动对用户进行分组的方法,您认为这可行吗,或者有人知道我可以研究的更好方法吗?
我真的很感激任何有用的指针。谢谢!
最佳答案
如果您要在 SQL 中使用用户、问题和答案表来设置它,那么我相信以下 SQL 可用于让其他用户获得类似的响应。只需添加一个 TOP 子句即可获得所需的数字。
我不知道性能如何,但这在很大程度上取决于您的数据大小。
SELECT
U2.userid,
SUM(CASE
WHEN A1.answer = A2.answer THEN 1
WHEN A1.answer <> A2.answer THEN -1
WHEN A1.answer IS NULL OR A2.answer IS NULL THEN 0 -- A bit redundant, but I like to make it clear
ELSE 0
END) AS similarity_score
FROM
Questions Q
LEFT OUTER JOIN Answers A1 ON
A1.question_id = Q.question_id AND
A1.userid = @userid
LEFT OUTER JOIN Answers A2 ON
A2.question_id = A1.question_id AND
A2.userid <> A1.userid
LEFT OUTER JOIN Users U2 ON
U2.userid = A2.userid
GROUP BY
U2.userid
ORDER BY
similarity_score DESC
关于sql - 如何编写一个函数来比较和排列多组 bool (真/假)答案?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320306/