我有一个歌曲列表。对于每首歌我都有艺术家,作家和流派。
我想创建有向图,以便查找模式。
所以,我希望每个艺术家都有一个节点,所以我将从基于艺术家的歌曲聚类开始。
然后我想找到作曲家并以某种方式安排已经聚集的歌曲,使他们接近作家。
稍后我也将根据流派进行分组,但我仍然坚持前两个。
所以,我的第一种方法是做一些像(未经测试)的事情:
pos_x = 20
for x in songs:
pos_y = 20
artist_list = [s for s in songs if s.artist==x.artist]
for y in len(artist_list):
artist_list[y].x = pos_x
pos_x += 10 * len(artist_list[y].title)
artist_list[y].y = pos_y
pos_y += 10
然后我会循环播放艺术家列表,创建初始图表,但是当一首歌上有多位艺术家时会出现问题,例如我们是世界。
但是,我相信Python这是一个非常有缺陷的方法,因为我的下一个方法是拍摄歌曲,使它们与艺术家保持相对接近,但是为了得到作曲家并对组进行小的改动而放弃那些相关的人,所以艺术家的歌曲集群可能会被移动。
我正在使用pyglet
来执行此操作,所以基本上我在OpenGL中执行此操作。
我能做的实际定位,但这是我关注的方法,因为我不知道如何处理这个问题。
更新
我正在寻找的是:
Song A1 Song A3 Song A2
Artist A
Artist B
Song B1 Song B2
我的线路从A1,A2,A3到艺术家A,B1,B2到艺术家B,但A3和B1,B2连接到艺术家B,但我也希望艺术家B的位置更接近A2和B2这两首歌有着相同的作曲家。
因此,艺术家将成为一个与歌曲分开的新节点,但每个群集中歌曲的实际位置将取决于至少一个其他关系。后来我也可能最终表现出这种关系,这就是为什么我现在在3D中进行映射。
答案 0 :(得分:2)
我将采用的方法是在Python中生成一个有向图,可以写成“点”格式并由Graphviz(http://www.graphviz.org)呈现。 Graphviz和点格式是用于定义和渲染复杂图形的已建立工具。
好消息是有些Python库允许您以Pythonic方式定义图形,然后用一行代码写出点文件。 PyGraphviz看起来是个不错的选择:http://networkx.lanl.gov/pygraphviz。您可以在Python中创建图形的结构,这就像定义歌曲和艺术家之间,歌曲和作曲家之间的边缘一样简单,等等。以下是PyGraphviz教程的片段:
>>> G.add_node('a') # adds node 'a'
>>> G.add_edge('b','c') # adds edge 'b'-'c' (and also nodes 'b', 'c')
然后只需编写点文件并将其加载到Graphviz中,这将在2d空间中布置节点。有各种布局算法,因此您可以对它们进行试验,以便以最有用的方式对歌曲进行聚类。