2012-02-12 123 views
5

我正在嘗試執行textrank算法來提取句子,如here所述。爲此,需要用加權邊補充pagerank算法,並使其在無向圖上運行。 Networkx的pagerank算法實現允許我輕鬆地整合加權邊緣,並據說將有向圖轉換爲無向圖:請參見here。 但是,當我測試它似乎仍然使用有向圖。我在這裏錯過了什麼?幫助大大appriciated。Textrank:補充使用網絡進行句子提取的PageRank

例子:

import networkx as nx 
D=nx.DiGraph() 
D.add_weighted_edges_from([('A','B',0.5),('A','C',1)]) 
print nx.pagerank(D) 

Outpunt:{ 'A':0.25974025929223499, 'C':0.40692640737443164, 'B':0.33333333333333331}

回答

9

我想你誤解的networkx的說明文檔。儘管如此,我必須承認它可能措辭更好。

PageRank算法被設計用於向圖,但如果輸入圖形是針對此 算法不檢查,並且將 通過在 向圖將每個邊緣定向到兩個邊緣上無向圖上執行。

這個告訴的是,PageRank算法是爲有向圖設計的,但它可以用於無向圖。爲此,它通過用兩個有向邊(內和外)替換每個邊來將無向網絡轉換爲有向網絡。

因此,如果您給它一個定向網絡,它將根據定向結構計算PageRank。因此,無論用無向網絡啓動:

import networkx as nx 

# Undirected Network 
D = nx.Graph() 
D.add_weighted_edges_from([('A', 'B', 0.5),('A', 'C', 1)]) 

# Default max number of iterations failed to converge for me 
print nx.pagerank(D, max_iter=200) 

# Outputs: 
{'A': 0.48648648872844047, 'C': 0.32567567418103965, 'B': 0.18783783709051982} 

,或者如果你已經有了一個向網絡,將其轉換爲無方向之一:

import networkx as nx 

# Directed Network 
D = nx.DiGraph() 
D.add_weighted_edges_from([('A', 'B', 0.5), ('A', 'C', 1)]) 

# Convert to undirected 
G = D.to_undirected() 

# Default max number of iterations failed to converge for me 
print nx.pagerank(G, max_iter=200) 

# Outputs: 
{'A': 0.48648648872844047, 'C': 0.32567567418103965, 'B': 0.18783783709051982} 
+0

我的錯誤。感謝您的解決方案。 – root 2012-02-12 09:39:34

0

一個很好的實現在Python中TextRank算法可以發現here。 如果你想使用這個腳本,你必須事先運行nltk.download(),按照here的描述安裝必要的數據文件。

+0

該實現不適用於語句提取,而是關鍵字提取。你可以從代碼下面的評論中看到。 – UberAlex 2013-09-19 12:18:01