2016-10-03 10 views
-1

Verwaltet, um ein hypernym-Diagramm zu erstellen, aber weiterhin gebundene Methode Synset.name von Synset ('dog.n') anstelle von dog.n im Diagramm zu erhalten. Wo ist der Fehler?NetworkX und Wordnet

from nltk.corpus import wordnet as wn 
import networkx as nx 
import matplotlib.pyplot as plt 

def closure_graph(synset, fn): 
    seen = set() 
    graph = nx.DiGraph() 

    def recurse(s): 
     if not s in seen: 
      seen.add(s) 
      graph.add_node(s.name) 
      for s1 in fn(s): 
       graph.add_node(s1.name) 
       graph.add_edge(s.name, s1.name) 
       recurse(s1) 

    recurse(synset) 
    return graph 


dog = wn.synsets('dog')[0] 
G = closure_graph(dog, 
         lambda s: s.hypernyms()) 
index = nx.betweenness_centrality(G) 
plt.rc('figure', figsize=(12, 7)) 
node_size = [index[n]*1000 for n in G] 
pos = nx.spring_layout(G) 
nx.draw_networkx(G, pos, node_size=node_size, edge_color='r', alpha=.3, linewidths=0) 
plt.show() 

Edit 1:

Managed einen hypernym Graphen zu schaffen, sondern auf immer gebunden Methode Synset.name von Synset ('dog.n') anstelle von dog.n in dem Diagramm zu halten. Wo ist der Fehler?

+0

Können Sie ein komplettes Beispiel [MCVE] und Sie können uns sagen, was Sie in diesem Code passieren erwarten und was passiert? – Joel

+0

Bitte beachten Sie Edit 1. –

+0

Ich bin nicht ganz sicher, was Sie für die Ausgabe beschreiben. Es sieht jedoch so aus, als ob die Funktion, die das Diagramm erstellt, beim Erstellen der Knoten etwas anderes tut, als Sie erwarten. Ich vermute, das hat etwas damit zu tun, dass du 'dog' als' wn.synsets ('dog') [0] 'definiert hast, während der von dir angegebene Link 'dog = wn.synset (' dog. n.01 ') '. – Joel

Antwort

1

Also was drucken ist, dass networkx eine Reihe von Knoten erstellt hat, wobei jeder Knoten eine Funktion ist. Also müssen wir uns den Befehl ansehen, der Knoten hinzufügt. Dies geschieht in closure_graph. In der Definition closure_graph sehen wir, dass s.name als ein Knoten hinzugefügt wird. Dies ist eine Funktion (wahrscheinlich war es der Name, bevor nltk aktualisiert wurde). Stattdessen möchten Sie s.name() hinzufügen, die jetzt eine Funktion ist, die den Namen zurückgibt. Es gibt 4 Orte, an denen dies geschieht.

from nltk.corpus import wordnet as wn 
import networkx as nx 
import matplotlib.pyplot as plt 

def closure_graph(synset, fn): 
    seen = set() 
    graph = nx.DiGraph() 

    def recurse(s): 
     if not s in seen: 
      seen.add(s) 
      graph.add_node(s.name()) 
      for s1 in fn(s): 
       graph.add_node(s1.name()) 
       graph.add_edge(s.name(), s1.name()) 
       recurse(s1) 

    recurse(synset) 
    return graph 


dog = wn.synsets('dog')[0] 
G = closure_graph(dog, 
         lambda s: s.hypernyms()) 
index = nx.betweenness_centrality(G) 
plt.rc('figure', figsize=(12, 7)) 
node_size = [index[n]*1000 for n in G] 
pos = nx.spring_layout(G) 
nx.draw_networkx(G, pos, node_size=node_size, edge_color='r', alpha=.3, linewidths=0) 
plt.show() 

enter image description here