2009-10-02 7 views
0

Ceci est un suivi de la question (Link)Suivi itérer sur un graphique en utilisant XML minidom

Ce que je veux le faire est d'utiliser le XML pour créer un graphique à l'aide NetworkX. En regardant la structure DOM ci-dessous, tous les nœuds dans le même nœud devraient avoir un bord entre eux, et tous les nœuds qui ont assisté à la même conférence devraient avoir un nœud à cette conférence. Pour résumer, tous les auteurs qui ont travaillé ensemble sur un document doivent être connectés les uns aux autres, et tous les auteurs qui ont assisté à une conférence particulière devraient être connectés à cette conférence.

<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> 

J'ai compris comment connecter les auteurs à des conférences, mais je ne suis pas sûr de la façon de se connecter les uns aux autres auteurs. Ce qui me pose problème, c'est de parcourir les auteurs qui ont travaillé sur le même document et de les relier entre eux.

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

Il existe de nombreuses façons de faire la plupart de ce que vous décrivez, mais je pense que vous devez préciser votre objectif un peu plus explicitement. pourquoi un graphique? Comment envisagez-vous de parcourir le graphique? Dans le contexte de votre problème, que signifie réellement «connecté»? par exemple. Selon la façon dont vous construisez le graphique, connecter les participants à une conférence les connectera par défaut, sans fournir de résolution au niveau du papier. – si28719e

Répondre

0

Je ne suis pas sûr sur la façon de se connecter les uns aux autres auteurs.

Vous devez générer des paires (author, otherauthor) afin de pouvoir les ajouter en tant qu'arêtes. La façon typique de le faire serait une itération imbriquée:

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

C'est une implémentation naïve qui inclut l'auto-boucles (donnant un auteur un avantage se connecter à lui-même), que vous pouvez ou ne voulez pas; il inclut aussi (1,2) et (2,1), ce qui est redondant si vous faites un graphe non orienté. (En Python 2.6, le générateur permutations intégré fait aussi.) Voici un générateur qui corrige ces choses:

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

Je n'ai pas utilisé NetworkX, mais en regardant le document, il semble dire que vous pouvez appeler add_node sur le même noeud deux fois (rien ne se passe la deuxième fois). Si c'est le cas, vous pouvez ignorer la dict que vous utilisiez pour essayer de suivre les nœuds que vous avez insérés. En outre, il semble dire que si vous ajoutez un bord à un noeud inconnu, il ajoutera automatiquement ce noeud pour vous. Donc, il devrait être possible de rendre le code beaucoup plus court:

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

je ne suis pas tout à fait sûr de ce que vous cherchez, mais en fonction de votre description j'ai jeté ensemble un graphique que je pense encapsule les relations que vous décrivez.

http://imgur.com/o2HvT.png

i utilisé openfst pour le faire. Je trouve beaucoup plus facile de mettre en évidence les relations graphiques avant de plonger dans le code pour quelque chose comme ça.

également, avez-vous réellement besoin de générer un avantage explicite entre les auteurs? Cela semble être un problème de traversée.

Questions connexes