2016-10-03 77 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