【问题标题】:best way to store similar music存储类似音乐的最佳方式
【发布时间】:2011-09-22 15:40:58
【问题描述】:

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

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

所以,我需要向用户展示类似的音乐,而这不能在运行时完成。我需要对每首歌曲之间的相似度值进行预处理。

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

song1, song2, similarity

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

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

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

请提出一些建议来维护这些信息。

谢谢。

【问题讨论】:

  • 那么你能预见到每次检索顺序小于80的歌曲的需要吗?如果没有,为什么要记录呢?如果低于 80 怎么办?
  • 我可以,但是因为我有这个函数 getSIMILARITY(songid1, songid2),它给了我相似性。但是如果我在运行时这样做,将会有很多数据库查询。因为我需要找到前 20 首相似的歌曲。为此,我需要提取每首歌曲的每个相似性。
  • 我认为最好预先计算歌曲之间的相似度值,但它不会是 n*n 记录,因为您需要为每一对计算一次相似度。换句话说,如果你已经计算了song1-song2之间的相似度,你就不需要对song2-song1进行计算了。而且你也不需要自己计算歌曲。

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


【解决方案1】:

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

完成此操作后,您可以按类别维护索引,并在查找相似歌曲时根据类别和类别内的相似性度量来设计权重 - 例如通过为歌曲所在的类别赋予更大的权重最接近原型。将权重乘以候选歌曲与当前歌曲之间的差的平方,得到该类别的原型。将前 3 个类别的权重相加,值越小越相似。

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

【讨论】:

    【解决方案2】:

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

    类似:

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

    【讨论】:

      【解决方案3】:

      似乎需要大量计算能力来维护和访问相似性信息。例如,如果您已经处理了 2000 首歌曲,您还需要对下一首新歌曲进行 2000 次相似度分析。它可能存在可扩展性问题,并且数据方案可以在短时间内使数据库变慢。

      我建议您可以找到一些模式并标记每首歌曲。例如,您可以分析“布鲁斯”、“摇滚”、“90 年代”模式的歌曲并给它们打标签。如果您想根据一首歌曲找到相似的歌曲,您可以查询给定歌曲的所有标签。前任。 “新时代”、“慢”和“技术”

      【讨论】:

      • 是的。我还考虑了标签功能。但是为数百万首歌曲创建标签将非常困难。实际上,并非所有歌曲都有完整的元数据。我已经从网络上抓取了它们。
      • 怎么样?你的意思是使用用户创建标签?如果是,那么他们为什么要创建标签,这对他们来说并不诱人。 ;)
      • 是的,我认为你可以通过良好的信誉系统来做到这一点,比如 StackOverflow ;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多