基于听歌习惯的自动音乐评分

8
我用Delphi创建了一个类似Winamp的音乐播放器。当然,不是很复杂,只是一个简单的播放器。
现在我想添加一个更复杂的功能:根据用户的听歌习惯自动对库中的歌曲进行评分。
这意味着应用程序应该“理解”用户是否喜欢一首歌曲,而且还要知道他/她喜欢程度的高低。
到目前为止,我的方法(可用的数据)如下:
- 简单地测量每次播放歌曲的频率。计算时间时从将歌曲添加到库中开始计算,以便最近的歌曲不会受到任何不利影响。 - 测量平均播放歌曲的时间(分钟)。 - 开始播放一首歌曲,但直接切换到另一首歌曲应该对排名产生不良影响,因为用户似乎不喜欢这首歌曲。 - ...
你能帮我解决这个问题吗?我只是想得到一些想法,不需要在Delphi中实现。
9个回答

10
我会在一个中央数据库中追踪所有用户的听歌习惯,这样你就可以根据其他人喜欢的东西进行推荐(“喜欢这首歌的人还喜欢这些其他歌曲”)。
还有一些其他要考虑的指标:
- 此歌曲被立即重播的比例(例如,此歌曲被播放的12%的时间内立即重播) - 在播放期间是否打开了“重复播放此歌曲”按钮? - 每小时、每天、每周、每月播放次数 - 跳过此歌曲的比例(例如,此歌曲被播放,但99%的时间内立即跳过) - 收听的歌曲比例(用户平均收听了该歌曲的50%,而另一首歌曲的100%)
还有:
- 听取用户麦克风上的声音。他们唱的吗?:D - 他们以多大的音量播放歌曲?他们把它调高了吗? - 添加一个“向朋友推荐此歌曲”的按钮(将歌曲标题发送电子邮件给朋友或其他类似方式)。他们推荐的歌曲,他们可能喜欢。 - 你可能需要对音频流进行一些特征提取,并找到类似的歌曲。这很难,但你可以在此处阅读更多信息:“用于分类音频数据的自动特征提取”链接

“基于详尽特征生成和时间统计的音乐收藏可理解模型” http://portal.acm.org/citation.cfm?id=1150523

“在分布式系统中协同使用特征组织音乐收藏” http://www.idea-group.com/Bookstore/Chapter.aspx?TitleId=24432


非常感谢,el chief。你的回答中有一些好的想法。关于第一段:我知道这种方法(last.fm),但我正在构建一个单用户应用程序。因此,我无法将用户的习惯与其他用户的习惯进行比较。 - caw
关于您的额外指标:难道不应该将指标#4和指标#5结合起来吗?如果一首歌曲被立即跳过,那么听完的比例只有1%左右,对吧? - caw
你的度量标准#3对应我的度量标准#1,是吗?无论我是按每周还是每年播放次数进行测量都没有区别,对吧? - caw
3
关于跳过的问题,你是对的。立即跳过将相当于播放歌曲的5%左右,因此删除第四个指标。关于时间单位的问题,在任何情况下,您都应该跟踪最后播放日期/时间。在过去一周中播放次数更多的歌曲可能比那些过去播放次数更多但时间较久远的歌曲更受欢迎或者更“热门”。例如,歌曲A和歌曲B在同一天添加到库中。我在第1周播放了歌曲B十次,在第10周播放了歌曲A十次。虽然它们的播放次数相同且它们的年龄相同,但你可以说我现在更喜欢歌曲A。 - Neil McGuigan
同时跟踪歌曲的BPM,并猜测音乐风格,如果将其与经常播放的其他歌曲进行比较,如果它们在相同的BPM范围内,则很可能他们听了很多来自该范围的音乐,因此这就是他们喜欢的类型。所以他们很可能会喜欢这首歌。 - RobertPitt

4
测量歌曲平均播放时间(分钟)。 我认为这不是一个好的度量标准,因为长歌曲会比短歌曲获得不公平的优势。相反,您应该使用百分比: 平均播放时间/总歌曲长度。

4
我通常抱怨相反的问题:如果你将一首歌播放的次数作为其“好听程度”的指标,那么长曲目会受到惩罚!所以你提出的取平均值的想法听起来相当不错。 - Frank Shearar
非常感谢,dbyrne,好主意。所以我将测量平均播放时间的百分比,而不是分钟数。 - caw
不过,这种方法仍然不太好 - 如果你测量平均播放百分比,那么短歌曲只要播放一次就会有100%的评级,而经常只播放前几分钟的非常长的歌曲尽管经常播放,但评级很低。 - Eamon Nerbonne
Last.FM简单地剪辑; 当一首歌曲播放至少30秒或总长度的50%(如果更长),或2(?)分钟(如果更短)时,它将被视为已播放 - 我不确定确切的剪辑值; 不过这并不是很重要。 - Eamon Nerbonne

3
请让喜好随时间降低。您似乎更喜欢在过去n天经常听的歌曲,而较旧的歌曲应该只是偶尔提及,因为您喜欢它们但已经听太多了。
最后,您可以添加节拍检测(和频率谱)以查找类似的歌曲,这可能会为您提供比用户通过听歌曲输入更多的数据。
我还会在此处对具有相同MP3-ID标签的歌曲进行分组,因为这也可以提示用户当前正在使用什么。如果您想提供一些自动播放功能,这也会有所帮助。听完一首很棒的Goa歌曲后,切换到朋克歌曲是奇怪的,即使我喜欢两个世界的歌曲。

1
关于您的额外指标:难道不应该将指标#4和指标#5结合起来吗?如果一首歌曲立即被跳过,那么听完的比例只有1%左右,对吧?- marco92w 5月21日15:08
这些应该是分开的。跳过应该导致被跳过的歌曲得到负面评价。但是,如果用户在歌曲开始时关闭应用程序,则不应将其视为负面评价,即使只播放了很低的百分比的歌曲。

0
(ListenPartCount * (ListenFullCount ^ 2)) + (AverageTotalListenTime * ListenPartTimeAverage)
--------------------------------------------------------------------------------------------
               ((AverageTotalListenTime - ListenPartTimeAverage) + 0.0001f)

这个公式将会产生一个不错的结果,因为用户可能只喜欢歌曲的一部分,这应该在评分中体现出来,如果用户喜欢整首歌曲,则权重应该加倍。

您可以以各种方式调整此公式,例如包括用户的听歌记录,例如如果用户听了一首歌曲,然后几次听另一首歌曲等。


0

以歌曲添加到库中的日期为起点。

测量歌曲/流派/艺术家/专辑被播放的频率(完全地,或部分地或跳过)-这也将使您能够衡量一首歌曲/流派/艺术家/专辑未被播放的频率。

根据这些参数提出加权,当一首歌曲、它的流派、艺术家或专辑没有经常被播放时,它应该排名较低。当一个艺术家每天都在播放时,这位艺术家的歌曲应该得到提升,但是假设这位艺术家的某首歌曲从未被播放,那么这首歌曲仍然应该排名相当低。


0
只需简单地测量每首歌曲在一段时间内播放的频率。
通常,我会选择播放特定的歌曲,然后让我的iPod一直播放到整张专辑结束。因此,这种方法可能会给专辑中后期的歌曲带来不公平的优势。如果您的音乐播放器也是这样工作的话,您可能需要进行相应的补偿。

0

关于这个问题,人工智能的应用怎么样呢?

嗯!让我说一下,从零开始使用一个客户端网络可能会非常有趣,每个客户端都有自己的“智能”,最终将客户端结果收集到一个中央“智能”上。

每个客户端可以根据用户习惯产生自己的“用户评级”(如已经说过的:平均听力、听力次数等)。

然后,一个中央“智能”收集器可以将个人评级合并成“全球评级”,显示趋势、建议和您需要的每个高级别评级。

无论如何,要训练这样的“大脑”意味着您首先必须以分析方式解决问题,但构建这样一个互相连接的小型大脑云来产生更高级别的“智能”确实很有趣。

像往常一样,由于我不知道您的技能,请深入了解神经网络、遗传算法、模糊逻辑、模式识别和类似问题。


0

你可以使用一些简单的函数,例如:

listened_time_of_song/(length_of_song + 15s) 

或者

 listened_time_of_song/(length_of_song * 1.1) 

这意味着如果歌曲在15秒内停止,则会被评为负分,或者第二种情况可能更好(如果用户听完整首歌曲,则歌曲长度对最终得分没有影响)。

另一种方法可能是使用神经网络,如果您熟悉这个主题的话。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接