存储类似音乐的最佳方式

时间:2011-06-25 15:38:58

标签: php mysql database database-design data-structures

我有数百万首歌曲,每首歌曲都有其独特的歌曲ID。对应每个歌曲ID我有一些属性,如歌曲名称,艺术家姓名,专辑名称,年份等。

现在,我已经实现了一种机制来找出两首歌之间的相似度。 它给我一个0到100之间的值。

因此,我需要向用户显示类似的音乐,这在运行时无法完成。我需要预处理每首歌曲之间的相似度值。

因此,如果我创建一个具有三个属性的数据库,

song1, song2, similarity

我将有n * n条记录,其中n是歌曲的数量。

每当我想要获取类似的音乐时,我都需要执行此查询:

SELECT song2 WHERE song1 = x AND similarity > 80 ORDER BY similarity DESC;

请建议维护此类信息。

感谢。

3 个答案:

答案 0 :(得分:1)

您提议的内容可行,但是,您可以通过仅存储一对来减少行数。然后修改您的查询以选择song1或song2中的歌曲ID。

类似的东西:

SELECT if(song1=?,song2,song1) as similar WHERE (song1 = ? or song2 =?) AND similarity > 80 ORDER BY similarity DESC;

答案 1 :(得分:1)

似乎需要大规模计算能力来维护和访问相似性信息。例如,如果您已经处理了2000首歌曲,并且您仍需要为下一首新歌曲执行2000次相似性分析。它可能具有可伸缩性问题,并且数据方案可以使数据库在很短的时间内变慢。

我建议您可以找到一些模式并标记每首歌曲。例如,您可以分析“蓝调”,“摇滚”,“90年代”模式的歌曲并为其添加标签。如果您想根据一首歌找到类似的歌曲,您只需查询给定歌曲的所有标签即可。恩。 “新时代”,“慢”和“技术”

答案 2 :(得分:1)

我认为你最好将相似性与“原型”歌曲或分类进行比较。设计一种指纹机制,其中包括有关歌曲的信息元数据以及用于判断相似性的任何音频机制。将每首歌曲放入一个(或多个)类别,并在该类别中对该歌曲进行评分 - 它与使用指纹的类别的原型有多接近。请注意,您可能有数百或数千个类别,即,当您想到音乐时,它们不是您想到的典型类别。

完成此操作后,您可以按类别维护索引,当找到类似的歌曲时,您可以根据类别中的类别和相似性度量来设定权重 - 例如,通过更加重视歌曲所属的类别最接近原型。将权重乘以候选歌曲和当前歌曲之间的差异的平方到该类别的原型。对前3个类别的权重求和,其中较低的值更相似。

这样,您只需要为每首歌曲存储一些元数据,而不是保持歌曲对之间的关​​系。如果主算法运行得太慢,您可以为最常见的歌曲保留缓存的成对数据,并且当歌曲不在您的缓存数据集中时默认为算法比较。