2

曲目リストあります。各曲には、アーティスト、ライター、ジャンルがあります。

パターンを探すことができるように、有向グラフを作成したいと考えています。

そこで、アーティストごとにノードを持ちたいので、アーティストに基づいて曲をクラスタリングすることから始めます。

次に、作曲者も見つけて、すでにクラスター化されている曲を何らかの方法でアレンジして、作家に近づけたいと考えています。

後でジャンル別にグループ化する予定ですが、最初の 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 のように 1 つの曲に複数のアーティストが含まれている場合に問題が発生します。

しかし、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 の近くに配置する必要があります。この2曲は作曲者が同じです。

したがって、アーティストは曲とは別の新しいノードになりますが、各クラスター内の曲の実際の配置は、少なくとも 1 つの他の関係に依存します。後でその関係も示すことになるかもしれないので、現在 3D でマッピングしています。

4

1 に答える 1

2

私が取るアプローチは、「ドット」形式に書き込んで Graphviz ( http://www.graphviz.org )でレンダリングできる有向グラフを Python で生成することです。Graphviz とドット形式は、複雑なグラフを定義およびレンダリングするための確立されたツールです。

すばらしいニュースは、Python の方法でグラフを定義し、1 行のコードでドット ファイルを書き出すことができる 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 にロードするだけで、ノードが 2 次元空間に配置されます。さまざまなレイアウト アルゴリズムがあるため、それらを試して、最も便利な方法で曲をクラスター化することができます。

于 2013-07-14T01:53:01.170 に答える