基本上我有一个文件系统,里面装满了这样的文件:
{"excellent":[1,2],"good":[1,2,3,4,5],"okay":[6],"bad":[7,8,9],"horrible":[9]}
"优良"将永远是" good,"的一部分。 "可怕"将永远是"坏的一部分,"好的,坏的,好的将永远是独一无二的。然而,每组可以任意长,从0个元素到......任意。我不能假设两套的长度相等,因此Jaccard似乎适用于各套。
我需要做的是计算:
基本上输出应该是另一个json文档,如下所示:
{"similar":[[1,0.987],[2,0.876],[3,0.765]...],"differs":[[4,0.012],[5,0.123],[6,0.234]...],"totalSimilarity":0.456}
我看过Jaccard Indices,看起来很适合一个简单的阵列。这是一组五个数组,例如,如果两个文档的优良集和优秀集之间具有相似性,那么它非常重要。
我可以"平均"将五张Jaccard Indicies归为一个主索引号码?或者是否有太多信息?
我是否努力了?会不会像json字符串的Minhash那样工作?我的第一个想法是它可能,但后来我担心基于字符串散列的东西会考虑" 5"在..."可怕" as"类似"到" 5"在"好"这完全倒退了。此外,我担心这会受到一些用户可能在" good"而其他人只有五个,而基于字符串的计算可能会扼杀它。
说实话,虽然我想要上面#3的值,但我真的不知道如何计算它。我想知道文档与整个语料库的相似程度。
是的,这与推荐系统算法类似。我已经阅读了从EasyRec到Mahout的文档,要么他们似乎没有完全按照我的需要做,要么数学开始超越我的脑袋。我是一名PHP开发人员,而不是理论物理学家。默认情况下,像EasyRec和Mahout这样的系统似乎并没有理解"事实上,这些都是五个独立的集合,所有人都需要协调才能被考虑"类似......"或者他们需要在他们的框架中进行一些严肃的编程工作,这让我有些头晕。
然而,有趣的是(至少对我而言),大多数推荐系统都在整个数据集上工作;我特别感兴趣的是根据用户的偏好对用户进行聚类,并根据这个非常小的集合提出建议。老实说,我并不太担心说“不知道”,巴克!你太独特了#34;所以我不太关心冷启动或类似的东西。
所以我正在寻找建议,要么是算法,要么支持普通的Jaccard工作,要么至少要阅读一些文档以便更好地掌握它。我认识到推荐系统是一些严肃的计算机科学,并且已经有可靠的系统。我的问题是,他们中的许多人似乎都在过度思考这个问题,或者要求某人拥有统计学学士学位以便能够输出合理的输出。 (这有点不公平......问题很难解决宇宙的错误。)
最后,我更感兴趣的是找到一个使用的算法而不是库或服务器(除非真的有一个简单的下降,我根本就不理解),因为我&#39 ;我想看看各种编程语言如何在一次枪战中处理算法。
我发现大多数推荐引擎/评级系统都失败了,因为他们的数据集过于宽泛。试图在整个宇宙中平均得分会产生平庸(参见:Metacritic,Rotten Tomatoes)。基本上我希望能够透明地对特定用户说:
与你最相似的用户(链接,链接,链接)非常喜欢这个,而且用户类似于你(链接,链接,链接)真的很讨厌这个,所以你可能会感兴趣。
与您最相似的用户(链接,链接,链接)同意这很好,所以您可能会感兴趣。
与您最不相似的用户(链接,链接,链接)同意这很糟糕,所以您可能会感兴趣。
与您最不相似的用户(链接,链接,链接)同意这很好,所以要么你讨厌它,要么我们必须回到绘图板。
我想向用户说明这一点,我确实认为他们喜欢X,因为网站上的许多推荐都是黑盒子,而且我发现它可能非常糟糕,只有零解释。 (啤酒网站推荐三次投资促进机构之后,我一直评价我喝过的所有IPA" 1"仅仅是因为有很多IPA而且全世界似乎都喜欢IPA。)
这也是我想要" totalSimilarity"的原因。如果您的" totalSimilarity"低,然后推荐人将挥舞着,我想以此为借口。 "你非常独特,所以这些只是愚蠢的猜测。" "你不是很不理智,这实际上很好,因为我很确定这些数据对你个人有用。"
答案 0 :(得分:0)
以下是解决方案的第一个草图:
1)从您的数据中删除冗余:
2)使用数字权重而不是单词。您可能希望使用以下映射: 优秀 - > 2,好 - > 1,好的 - > 0,坏 - > -1,太可怕了 - > -2
3)一旦减少了问题的维度,就可以在缩小的空间内使用点积来计算用户和项目之间的相似性。