代码之家  ›  专栏  ›  技术社区  ›  Judah Gabriel Himango

提取缩略图项的算法

  •  1
  • Judah Gabriel Himango  · 技术社区  · 14 年前

    我有一个类似潘多拉的软件,用户可以在其中大拇指上一首歌或大拇指下一首歌。软件,调用 Chavah ,是Silverlight+C,但这是一个语言和平台无关的问题。

    我的软件需要根据用户的喜好选择一首歌。我需要一个好的算法。

    我希望我的软件根据以下要求选择要播放的歌曲:

    1. 应该喜欢竖起大拇指的歌, 而且经常玩。

    2. 未分级的 歌曲(既不竖起也不竖起) 还是应该玩的;毕竟, 用户总共只能有2个 竖起大拇指的歌曲

    3. 拇指向下的歌曲应该很少播放。

    4. 无论算法如何,歌曲都不应该经常重复。

    考虑到这些设计决策,这里有什么好的算法吗?

    我有一些代码可以捕获所有歌曲、喜欢的歌曲和不喜欢的歌曲:

    var allSongs = ...
    var likedSongs = allSongs.Where(s => s.LikedByUser(...));
    var dislikedSongs = allSongs.Where(s => s.DislikedByUser(...));
    

    为用户挑选一首好歌有什么简单的想法吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   Nicolas78    14 年前

    你可以对歌曲进行加权;比如说每首歌的开头都有1.0分,如果向下翻,则为0.5分,如果向上翻,则为1.5分。然后你从所有的分数中选择一个随机的元素,它的概率,不管用它的,嗯,重量来衡量。我想到的快速而肮脏的方法是对所有权重求和。选择一个小于和的随机数。循环播放所有歌曲,直到currentweight+songweight>随机数(否则currentweight+=songweight)

    当然,通过引入协作过滤,您可以任意地使这变得更复杂:)

    想象五首歌。前两个拇指朝上,下一个拇指朝下,两个中性。

    _1:1.5,2:1.5,3:0.5,4:1,5:1_

    总数是5.5。现在,我们选择一个随机数<5.5,然后看:它是2.43789。

    现在让我们找到这个随机数所属的歌曲。

    从当前权重=0开始。第一首歌的重量=1.5。currentweight+1.5<2.43789->我们继续,但按这首歌的权重增加currentweight。

    所以现在currentweight=1.5。下一首歌的重量:又是1.5。但现在,currentweight+1.5==3>2.43789。这意味着我们选择了第二首歌!

    你在这里所做的基本上是在一行中选择一个随机的点,但是增加该行中的“区域”,如果歌曲是竖起的,那么就会选择一首歌曲。

    这是否会产生许多重复,基本上取决于你增加/减少歌曲重量的力度。

        2
  •  1
  •   James    14 年前

    我假设潘多拉使用一个标签系统来分类他们的歌曲。通过这种方式,你可以通过抽取“竖起”标签的最高频率来建立用户音乐品味的档案。不幸的是,他们从一个庞大的标签音乐数据库中抽取音乐来提供给他们的用户,这可能比选择它们的算法更难开发。

        3
  •  1
  •   Ryan    14 年前

    您还可以为乐队/歌手和流派创建一个分级系统,并根据每个“大拇指向上”,您可以为乐队/歌手和流派添加1个(或您决定的任何值)。然后,当决定播放下一首歌曲时,可以根据用户对某个乐队/歌手和/或流派的兴趣来权衡该决定。与“拇指向下”的歌曲相反。

        4
  •  1
  •   grossvogel    14 年前

    可能是这样的:

    1)创建三个随机排列的歌曲流(或播放列表),如代码片段,但使它们相互排斥:喜欢、不喜欢、不分级。根据这些组的大小,每个组在重复之前都有一个持续时间。

    2)创建一个函数,将流合并为单个流,同时遵守某些规则。主要的规则是期望的流的混合,比如说60%的人喜欢,38%的人不喜欢,2%的人不喜欢,等等。只有当喜欢的音乐流的持续时间太短而无法遵循“歌曲重复之间的最短时间”规则时,您才必须偏离所需的混音模式。

    3)您可能还希望定期重新计算所有流。这里比较棘手的部分可能是避免重新计算引起的重复。也许你在(1)中的随机排序也可以考虑到一些权重或最近播放的歌曲的偏移。