如何获得歌曲相似度的客观衡量标准?

数据挖掘 机器学习 相似 模型选择
2022-02-16 10:55:14

我在浏览 ML 项目的想法时发现了一个有趣的想法(只是问题陈述):使用歌词检测两首歌曲是否相似。我发现这是一个有趣的想法,但我不太确定如何获得歌曲的相似度分数。对于我的数据集,我有流派、艺术家和歌词的特征。考虑到没有这样的“训练数据”,有什么潜在的方法来评估相似性。

我遇到过词嵌入和其他东西,但它们的工作对我来说并不完全清楚。此外,我认为他们没有考虑可用的类似歌曲的功能:类型令牌比率、情绪等级、单词密度(每句话的平均单词数)等。

一种方法是否可以首先基于“高级特征”对歌曲进行聚类,例如类型令牌比、情感等,然后是语义相似度度量,即类似对同一集群中歌曲的词嵌入的余弦相似度度量感觉?我将如何验证这种方法的有用性?

2个回答

两首歌曲是两个分开的文档,它们具有使它们相似或不相似的特征。有很多技术可以确定文档之间的相似性:

如何计算两个文本文档之间的相似度

为了快速验证概念,您可以使用预训练的嵌入器,即 LASER。这是非官方的pypi它工作得很好。不过,请记住,嵌入器适用于相当短的文本块。将单个语义含义分配给多个句子是没有意义的。Embedder 产生数值向量。一旦你嵌入了两首歌曲的歌词,你就可以计算它们之间的距离度量,即欧几里得。它应该有点开箱即用,但不要指望有突破性的东西。

例子

from laserembeddings import Laser
from scipy.spatial.distance import euclidean

laser = Laser()

beatles_lyrics = """
I love you, 'cause you tell me things I want to know
And it's true that it really only goes to show
That I know that I, I, I, I
Should never, never, never be blue
"""

joy_division_lyrics = """
I've been waiting for a guide to come and take me by the hand,
Could these sensations make me feel the pleasures of a normal man?
These sensations barely interest me for another day,
I've got the spirit, lose the feeling, take the shock away.
"""

beatles_lyrics_embedded = laser.embed_sentences([beatles_lyrics], lang='en')[0]

joy_division_lyrics_embedded = laser.embed_sentences(
    [joy_division_lyrics],
    lang='en'
)[0]


similarity = euclidean(beatles_lyrics_embedded, joy_division_lyrics_embedded)

print(similarity)

在这里您可以找到更多距离指标:https ://docs.scipy.org/doc/scipy-0.14.0/reference/spatial.distance.html

答案

我遇到过词嵌入和其他东西,但它们的工作对我来说并不完全清楚。

嵌入将超维文本编码到低维数字空间。它以某种方式训练,来自不同语言的语义相似的句子彼此更接近。

此外,我认为他们没有考虑可用的类似歌曲的功能:类型令牌比率、情绪等级、单词密度(每句话的平均单词数)等。

Embedder 经过预训练以学习特征表示本身。它们是高级功能,但完全是黑盒。

这就是深度学习的全部意义所在。我们很难在这样的空间中手动设计特征。相反,我们训练深度模型的方式是学习这些特征本身的表示。

如果您想从文本中学习情感,嵌入器绝对是您的最佳选择。您只需要为每首歌词定义情绪。