1

だから、これは大きなものです:

さまざまな出版物の著者と共著者のリストがあります。このリストは次のようになります。

[[['A','uni'],[['B','uni'],['C','uni'],['D','uni'],['E','uni']]],

[['E','uni'],[['A','uni'],['F','uni'],['G','uni']]]]

したがって、著者 A は著者 B、C、D と共同で出版物を作成し、著者 E は著者 A、F、G と共同で別の出版物を作成しました。

私が必要とするのは、共著者 (B、C、D、F、G) としてリストされている場合でも、すべての著者のリストと、誰と何本の論文を書いたかのリストです。したがって、すべての主要な著者 (A と E) は共著者 (A と B、C、D、E、E と A、F、G) だけでなく、論文の共著者 (B と C、D、E) も一緒に研究しました (B と C、D、E)。また、Aなど)。それに加えて、彼らが一緒に働いた論文の数を知る必要があります。

したがって、この小さな例の最終結果は次のようになります。

[[['A','uni'],[['B','uni',1],['C','uni',1],['D','uni',1],['E','uni',2],['F','uni',1],['G','uni',1]]],

[['B','uni'],[['A','uni',1],['C','uni',1],['D','uni',1],['E','uni',1]]],

[['C','uni'],[['A','uni',1],['B','uni',1],['D','uni',1],['E','uni',1]]],

[['D','uni'],[['A','uni',1],['B','uni',1],['C','uni',1],['E','uni',1]]],

[['E','uni'],[['A','uni',2],['B','uni',1],['C','uni',1],['D','uni',1],['F','uni',1],['G','uni',1]]],

[['F','uni'],[['A','uni',1],['E','uni',1],['G','uni',1]]],

[['G','uni'],[['A','uni',1],['E','uni',1],['F','uni',1]]]]

正直なところ、これは少し紛らわしいですが、私の言いたいことを理解していただければ幸いです。(uni エントリは、著者が勤務する大学を表します。他の情報が含まれる場合もありますが、このタスクには関係ありません)

データベースを解析するために作成した Python スクリプトで取得したこの初期リストがあります。誰と、どのくらいの頻度で wo を書いたかを表示するグラフを作成したいと考えています。

私はしばらく遊んでいましたが、良い解決策が見つかりません。うまくいくものを書くことができると思いますが、それはうまくも効率的でもなく、非常に時間がかかります。では、この問題を解決するための迅速で Pythonic な方法はありますか? 私の例には現在2つの出版物しかありませんが、約10000の出版物を分析する必要があり、そのうちのいくつかには数百人の共著者がいます...

4

3 に答える 3

1

データベースは必要ありませんが、最初に、すべての情報を保持および表現するためのデータ構造が必要です。私は完全なクラスを書くのではなく、それらの重要な属性だけを書きます。

class Author(object):
    name
    university        

class Publication(object):
    name
    date

class Authorship(object)
    author
    publication
    main_author(bool)

次に、これらのオブジェクトを整理する必要があります。著者と出版物はユニークなものでなければなりません。データセットが数百MBを超えない場合は、それぞれを通常の辞書に入れることができます。それらは、一意の属性でインデックス付けする必要があります。author.nameで十分でない場合は、大学と著者名のタプルを使用するか、大学が変更される可能性があるため、誕生日または著者に関連するものがあればそれを使用してください。

オーサーシップの場合は、さまざまなインデックスを作成する必要があります。これにより、リスト全体を常に繰り返すことなく、より高速に検索できます。おそらく、出版物を含む著者によって索引付けされたdefaultdict(list)と、出版物で索引付けされた別のdefaultdict(list)が必要になるかもしれません。一貫性を維持するように注意してください(重複、データエラーは残酷な場合があります)。

その後、データセットを反復処理して構造を埋めるだけです。

于 2012-10-02T20:44:17.920 に答える
1
from collections import defaultdict

L = [[['A','uni'],[['B','uni'],['C','uni'],['D','uni'],['E','uni']]],
     [['E','uni'],[['A','uni'],['F','uni'],['G','uni']]]]

res = defaultdict(set)

for x, y in L:
    x = [tuple(x)]
    y = map(tuple, y)
    row = x+y
    for i in row:
        print set(row)
        res[i] |= set(row)

for k, v in res.items():
    v.remove(k)
    print k, list(v)

出力:

('B', 'uni') [('A', 'uni'), ('D', 'uni'), ('E', 'uni'), ('C', 'uni')]
('A', 'uni') [('B', 'uni'), ('F', 'uni'), ('D', 'uni'), ('G', 'uni'), ('E', 'uni'), ('C', 'uni')]
('F', 'uni') [('A', 'uni'), ('G', 'uni'), ('E', 'uni')]
('D', 'uni') [('A', 'uni'), ('B', 'uni'), ('E', 'uni'), ('C', 'uni')]
('G', 'uni') [('A', 'uni'), ('E', 'uni'), ('F', 'uni')]
('E', 'uni') [('B', 'uni'), ('A', 'uni'), ('F', 'uni'), ('D', 'uni'), ('G', 'uni'), ('C', 'uni')]
('C', 'uni') [('A', 'uni'), ('D', 'uni'), ('B', 'uni'), ('E', 'uni')]
于 2012-10-02T20:40:01.903 に答える
1

私のバージョン:

from collections import defaultdict
from collections import Counter
from itertools import chain

L = [[['A', 'uni'], [['B', 'uni'], ['C', 'uni'], ['D', 'uni'], ['E', 'uni']]], [['E', 'uni'], [['A', 'uni'], ['F', 'uni'], ['G', 'uni']]]]

d = defaultdict(Counter)
for publication in L:
    authors = [tuple(a) for a in chain([publication[0]], publication[1])]
    for author in authors:
        d[author].update(authors)

for k, v in d.iteritems():
    print k, [(author[0], author[1], counter)
              for author, counter in v.iteritems() if author[0] != k[0]]

出力:

('B', 'uni') [('A', 'uni', 1), ('D', 'uni', 1), ('E', 'uni', 1), ('C', 'uni', 1)]
('A', 'uni') [('B', 'uni', 1), ('F', 'uni', 1), ('D', 'uni', 1), ('G', 'uni', 1), ('E', 'uni', 2), ('C', 'uni', 1)]
('F', 'uni') [('A', 'uni', 1), ('G', 'uni', 1), ('E', 'uni', 1)]
('D', 'uni') [('A', 'uni', 1), ('B', 'uni', 1), ('E', 'uni', 1), ('C', 'uni', 1)]
('G', 'uni') [('A', 'uni', 1), ('E', 'uni', 1), ('F', 'uni', 1)]
('E', 'uni') [('B', 'uni', 1), ('A', 'uni', 2), ('F', 'uni', 1), ('D', 'uni', 1), ('G', 'uni', 1), ('C', 'uni', 1)]
('C', 'uni') [('A', 'uni', 1), ('D', 'uni', 1), ('B', 'uni', 1), ('E', 'uni', 1)]
于 2012-10-02T20:47:16.797 に答える