存储类似音乐的最佳方法

| 我有数百万首歌曲,每首歌曲都有其唯一的歌曲ID。与每个歌曲ID对应,我具有一些属性,例如歌曲名称,艺术家名称,专辑名称,年份等。 现在,我实现了一种机制来找出两首歌曲之间的相似率。 它给我一个0到100之间的值。 因此,我需要向用户展示类似的音乐,而这是无法在运行时完成的。我需要预处理每首歌曲之间的相似度值。 因此,如果我创建具有三个属性的数据库,
song1, song2, similarity
我将拥有n * n条记录,其中n是歌曲数。 每当我想获取类似的音乐时,都需要执行以下查询:
SELECT song2 WHERE song1 = x AND similarity > 80 ORDER BY similarity DESC;
请提出一些建议以维护此类信息。 谢谢。     
已邀请:
        我认为您最好将相似性与“原型”歌曲或分类进行比较。设计一种指纹机制,其中包括有关歌曲的信息元数据以及用于判断相似性的任何音频机制。将每首歌曲置于一个(或多个)类别中,并对该类别中的歌曲进行评分-使用指纹,该歌曲与该类别的原型匹配的紧密程度。请注意,您可能有成百上千个类别,即当您想到音乐时,它们并不是您想到的典型类别。 完成此操作后,您就可以按类别维护索引,当找到相似的歌曲时,您可以根据类别和类别中的相似性度量来设计权重-例如,通过加大权重来确定与歌曲最接近的类别。原型。将权重乘以候选歌曲和当前歌曲之间差异的平方,即可得到该类别的原型。对前3个类别的权重求和,较低的值则更相似。 这样,您只需要为每首歌曲存储一些元数据项,而无需保持歌曲对之间的关​​系。如果主要算法运行得太慢,则可以保留最常用歌曲的成对缓存数据,如果歌曲不在缓存数据集中,则默认为算法比较。     
        您提出的建议将起作用,但是,您可以通过仅将每对存储一次来减少行数。然后修改查询以在song1或song2中选择歌曲ID。 就像是:
SELECT if(song1=?,song2,song1) as similar WHERE (song1 = ? or song2 =?) AND similarity > 80 ORDER BY similarity DESC;
    
        似乎需要大量计算能力才能维护和访问相似性信息。例如,如果您已经处理了2000首歌曲,而您仍需要对下一首新歌曲执行2000次相似度分析。它可能具有可伸缩性问题,并且数据方案可能会使数据库在短时间内变慢。 我建议您可以找到一些样式并标记每首歌曲。例如,您可以分析\“ blues \”,\“ rocks \”,\“ 90 \'s \”模式的歌曲并为其赋予标签。如果要根据一首歌曲查找相似的歌曲,则只需查询给定歌曲具有的所有标签。例如\“ New age \”,\“ Slow \”和\“ techno \”     

要回复问题请先登录注册