2009-10-02 3 views
0

Это наблюдение на вопрос (Link)Последующие действия по итерация графа с использованием XML minidom

То, что я намерен делать это с помощью XML для создания графика, используя NetworkX. Если посмотреть на структуру DOM ниже, все узлы в одном узле должны иметь границу между ними, и все узлы, которые посетили ту же конференцию, должны иметь узел для этой конференции. Подводя итог, все авторы, которые работали вместе над документом, должны быть связаны друг с другом, и все авторы, которые посетили конкретную конференцию, должны быть связаны с этой конференцией.

<conference name="CONF 2009"> 
<paper> 
<author>Yih-Chun Hu(UIUC)</author> 
<author>David McGrew(Cisco Systems)</author> 
<author>Adrian Perrig(CMU)</author> 
<author>Brian Weis(Cisco Systems)</author> 
<author>Dan Wendlandt(CMU)</author> 
</paper> 
<paper> 
<author>Dan Wendlandt(CMU)</author> 
<author>Ioannis Avramopoulos(Princeton)</author> 
<author>David G. Andersen(CMU)</author> 
<author>Jennifer Rexford(Princeton)</author> 
</paper> 
</conference> 

Я понял, как подключить автор к конференции, но я не уверен о том, как подключить автор друг к другу. Я испытываю трудности с тем, как перебирать авторов, которые работали над одной и той же бумагой, и связывать их вместе.

dom = parse(filepath) 
    conference=dom.getElementsByTagName('conference') 
    for node in conference: 
     conf_name=node.getAttribute('name') 
     print conf_name 
     G.add_node(conf_name) 

    #The nodeValue is split in order to get the name of the author 
#and to exclude the university they are part of 

     plist=node.getElementsByTagName('paper') 
     for p in plist: 
      author=str(p.childNodes[0].nodeValue) 
      author= author.split("(") 
#Figure out a way to create edges between authors in the same <paper> </paper> 

     alist=node.getElementsByTagName('author') 
     for a in alist: 
      authortext= str(a.childNodes[0].nodeValue).split("(") 

      if authortext[0] in dict: 
       edgeQuantity=dict[authortext[0]] 
       edgeQuantity+=1 
       dict[authortext[0]]=edgeQuantity 
       G.add_edge(authortext[0],conf_name) 

      #Otherwise, add it to the dictionary and create an edge to the conference. 
      else: 
       dict[authortext[0]]= 1 
       G.add_node(authortext[0]) 
       G.add_edge(authortext[0],conf_name) 
       i+=1 
+0

Есть много разных способов сделать большую часть того, что вы описываете, однако я думаю, вам нужно указать вашу цель немного более явно. почему граф? как вы планируете пересекать график? в контексте вашей проблемы, что означает «связанный»? например в зависимости от того, как вы построите график, подключение участников к конференции будет связывать их друг с другом по умолчанию, не предоставляя разрешение на уровне бумаги. – si28719e

ответ

0

Я неуверен о том, как подключить авторов друг к другу.

Вам необходимо сгенерировать (автор, otherauthor) пары, чтобы вы могли добавить их в качестве ребер. Обычный способ сделать это было бы вложенная итерация:

for thing in things: 
    for otherthing in things: 
     add_edge(thing, otherthing) 

Это наивная реализация, которая включает в себя самое-петлю (давая автор ребро, соединяющие себя к себе), которые вы можете или не можете; он также включает в себя как (1,2), так и (2,1), что, если вы делаете неориентированный граф, является избыточным. (В Python 2.6, встроенный в permutations генератор также делает это.) Вот генератор, который фиксирует эти вещи:

def pairs(l): 
    for i in range(len(l)-1): 
     for j in range(i+1, len(l)): 
      yield l[i], l[j] 

Я не использовал NetworkX, но, глядя на документ, что кажется, что вы можете позвонить add_node на том же узле дважды (при этом ничего не происходит во второй раз). Если это так, вы можете отказаться от используемого вами dict, чтобы попытаться отслеживать, какие узлы вы вставили. Кроме того, кажется, что если вы добавите ребро к неизвестному узлу, он автоматически добавит этот узел для вас. Так оно и должно быть возможно сделать код намного короче:

for conference in dom.getElementsByTagName('conference'): 
    var conf_name= node.getAttribute('name') 
    for paper in conference.getElementsByTagName('paper'): 
     authors= paper.getElementsByTagName('author') 
     auth_names= [author.firstChild.data.split('(')[0] for author in authors] 

     # Note author's conference attendance 
     # 
     for auth_name in auth_names: 
      G.add_edge(auth_name, conf_name) 

     # Note combinations of authors working on same paper 
     # 
     for auth_name, other_name in pairs(auth_names): 
      G.add_edge(auth_name, otherauth_name) 
0

им не совсем уверен, что вы ищете, но на основе вашего описания я выбросил вместе график, который я думаю, что инкапсулирует отношения вы описываете.

http://imgur.com/o2HvT.png

я использовал openfst, чтобы сделать это. я нахожу намного проще четко отображать графические отношения, прежде чем погрузиться в код для чего-то подобного.

также, вам действительно нужно создать явное преимущество между авторами? это похоже на проблему обхода.