如何以编程方式标准化音乐标签?
假设我收藏了大量合法的音乐,并且标记不一致。我想规范一个领域,例如"艺术家",以便例如以下艺术家成为一个艺术家:
- 感恩的死者
- 感恩的死
- 感激的死了
- 感激的死了,
所以...我应该在尝试与大型数据库(如freedb)进行匹配,还是有一些较低级别的字符串操作方法等?
我尝试过滚动代码来进行字符串相似性检查,然后尝试将它们与freedb中的高频数据进行匹配,但效果有限。
还有其他想法吗?
解决方案
回答
推荐使用Musicbrainz,并且不需要编码!
回答
对于这个问题,我使用了MusicBrainz Picard,它获取音频指纹,然后从其数据库中自动填写正确的标签。我自己用它来填充音轨号,但是我敢肯定它也能解决问题。
回答
- 我们需要一些基本的API来读写标签。
- 为该艺术家指定密钥令牌,以便将与之匹配的每个字符序列添加到令牌的集合中,
- 对于任何令牌,我们都将需要使用艺术家名称,而不是原始的多个变体。
- 我们可以使用RegEx或者Parser解决方案来实现更多……
干杯。
回答
我首先要使用一种分类方法+手动手工编辑。
按名称排序(忽略大小写)和名称中的一个/一个/文章。
排序后,结果应该是字符串匹配的更好候选者。
之后,应该有一种算法可以查找任何单首歌曲上下的2-3个条目,并计算名称的相似性。
然后是从那里开始的手动工作。我不会相信自动标记音乐库的算法,它们不够好,甚至没有freedb。
回答
我建议研究用于数据清理的算法
回答
一种简单的方法如下,
- 获取前1000个最常用的英语单词的列表,并将其从所有标签中删除。
- 使所有内容变为小写
- 种类
这种方法是可以的,但是当然我们需要进行很多手工工作。我们将需要自己进行集群。
因此,我们可能希望在名称和具有此名称的群集之间使用相似性度量。假设我们已经采取了这种措施(我将简要介绍一个简单的措施),那么我们可以按照以下步骤进行操作:
- 取歌曲之间相似度得分的均值和方差。我们可以对所有歌曲进行此操作,或者如果采样过多,则可以进行采样。
- 创建一个空的群集集,C = {}。
- 遍历所有歌曲,对于每首歌曲遍历所有群集,如果歌曲与群集中歌曲之间的平均得分与均值对得分相差2-3个标准差以上,则将其添加到群集中。如果没有这样的群集,则用该歌曲创建一个新的群集并将其添加到C。
因此," 2或者3"将需要自己手动安装,但是一旦获得了该魔数,该过程将或者多或者少地自动进行。
一旦有了这些群集,就需要为该歌曲群集创建代表名称。可以通过随机选择一首歌曲,或者尝试在已知的歌曲名称列表中找到相似的歌曲来实现。然后将指定名称分配给该群集中所有具有名称的歌曲。
一个可行的简单相似性度量方法只是计算两个字符串中共有的长度为1,2,3,...,n个子字符串的数量。我们可以根据子字符串的长度对计数进行加权,例如共享长度为3的子字符串比长度为1的重要性更大。然后,为了不偏爱名称很长的歌曲,我们可以根据要比较的歌曲标题的长度来规范分数。
问候,
欧文
回答
Python有一个非常有用的库,名为difflib
。尤其是一个函数" difflib.get_close_matches(word,可能性)",即使在查找重复(或者几乎重复)的文件名时也很有用。
除此之外,使用MusicBrainz数据可以通过musicbrainz2包来完成,它的findartist.py
脚本为我们提供了使用ArtistFilter
获得模糊匹配结果的示例代码。