2012-02-12 13 views
5

Sto cercando di implementare l'algoritmo textrank per l'estrazione delle frasi come descritto here. Per questo è necessario integrare l'algoritmo di pagerank con bordi ponderati e farlo funzionare su grafici non orientati. L'implementazione dell'algoritmo di NetworkPagerank mi consente di integrare facilmente i bordi ponderati e si dice che converta i grafici diretti in non orientati: vedere here. Tuttavia, quando ho provato sembra ancora utilizzare il grafico diretto. Cosa mi manca qui? Aiuta molto l'appricamento.Textrank: complementare il pagerank per l'estrazione delle frasi usando networkx

Esempio:

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': ,25974025929223499, 'C': ,40692640737443164, 'B': ,33333333333333331}

risposta

9

penso che si ha travisato la nota sul NetworkX documentazione. Tuttavia, devo ammettere che potrebbe essere formulato meglio.

L'algoritmo PageRank è stato progettato per i grafi orientati ma questo algoritmo non verifica se il grafo di input è diretto e verrà eseguire su grafi non orientati convertendo ciascun bordo orientata nel grafo orientato a due fronti.

Ciò che questo dice è che l'algoritmo PageRank è progettato per grafici orientati, ma può essere utilizzato per grafici non orientati. Per fare ciò, converte la rete non orientata in una rete diretta sostituendo ciascun bordo con due bordi diretti (dentro e fuori).

Pertanto, se gli dai una rete diretta, calcolerà il PageRank in base alla struttura orientata. Quindi, o iniziare con una rete non orientato:

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} 

o se si dispone già di una rete diretta, convertirlo in un non orientato uno:

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

Il mio errore. Grazie per la soluzione. – root

0

Un bel implementazione dell'algoritmo TextRank in Python può essere trovato here. Se si desidera utilizzare questo script è necessario eseguire nltk.download() in anticipo, per installare i file di dati necessari come descritto here.

+0

Tale implementazione non riguarda l'estrazione della frase, ma piuttosto l'estrazione della parola chiave. Lo puoi vedere dai commenti sotto il codice. – UberAlex