2

我有一个歌曲列表。对于每首歌,我都有艺术家、作家和流派。

我想创建一个有向图,以便寻找模式。

所以,我想为每个艺术家都有一个节点,所以我将从基于艺术家对歌曲进行聚类开始。

然后我也想找到作曲家,并以某种方式安排已经聚集的歌曲,使它们靠近作者。

稍后我也会根据流派进行分组,但我坚持前两个。

所以,我的第一种方法是做类似(未测试)的事情:

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

然后我会遍历艺术家列表,创建初始图表,但是当多个艺术家在一首歌上时会出现问题,例如We are the world

但是,我相信在 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 中映射的原因。

4

1 回答 1

2

我将采用的方法是在 Python 中生成一个有向图,可以将其写入“点”格式并由 Graphviz ( http://www.graphviz.org ) 呈现。Graphviz 和点格式是用于定义和呈现复杂图形的既定工具。

好消息是,有 Python 库允许您以 Python 方式定义图形,然后用一行代码写出点文件。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 空间中布置节点。有多种布局算法,因此您可以试验它们以便以最有用的方式对歌曲进行聚类。

于 2013-07-14T01:53:01.170 回答