2016-10-03 67 views
-1

管理创建一个hypernym图,但继续获得绑定方法Synset('dog.n')的Synset.name而不是dog.n在图中。错误在哪里?NetworkX和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() 

编辑1:

成功地创建一个上位词图表,但保持在同义词集合的获得方法结合Synset.name( 'dog.n'),而不是在图形dog.n。错误在哪里?

+0

你能提供一个完整的例子[MCVE],你能告诉我们你所期望的在此代码发生的又是什么情况? – Joel

+0

请参阅编辑1. –

+0

我不太清楚你对输出的描述。但它看起来像创建图的函数在创建节点上做的事情与您期望的不同。我怀疑这与您将'dog'定义为'wn.synsets('dog')[0]''的事实有关,而您提供的链接具有'dog = wn.synset('dog。 N.01' )'。 – Joel

回答

1

那么打印出来的是networkx已经创建了一堆节点,每个节点都是一个功能。所以我们需要看看添加节点的命令。这发生在closure_graph

closure_graph的定义中,我们看到s.name被添加为节点。这是一个函数(它可能用于实际上是在更新nltk之前的名称)。相反,您想添加s.name(),该函数现在是一个返回名称的函数。有4个地方发生这种情况。

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