2012-02-12 18 views
5

Estoy tratando de implementar el algoritmo textrank para la extracción de frases como se describe here. Para aquellos que necesitan complementar el algoritmo de pagerank con bordes ponderados y hacer que se ejecute en gráficos no dirigidos. La implementación del algoritmo del pagerank de Networkx me permite integrar fácilmente los bordes pesados ​​y se dice que convierte los gráficos dirigidos en no dirigidos: ver here. Sin embargo, cuando lo probé todavía parece usar un gráfico dirigido. ¿Que me estoy perdiendo aqui? Ayuda enormemente appriciated.Textrank: pagerank complementario para la extracción de frases usando networkx

Ejemplo:

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

Respuesta

9

creo que malinterpretado la nota sobre el NetworkX documentación. Sin embargo, debo admitir que podría estar mejor redactado.

El algoritmo PageRank fue diseñado para gráficos dirigidos pero este algoritmo no comprueba si el gráfico de entrada se dirige y se ejecutar en los gráficos no dirigidos mediante la conversión de cada borde orientado en la grafo dirigido a dos bordes.

Lo que esto cuenta es que, el algoritmo de PageRank está diseñado para gráficos dirigidos, pero se puede usar para gráficos no dirigidos. Para hacerlo, convierte la red no dirigida a una red dirigida reemplazando cada borde con dos bordes dirigidos (dentro y fuera).

Por lo tanto, si le da una red dirigida, calculará el PageRank de acuerdo con la estructura dirigida. Así que, o comenzar con una red no dirigida:

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 si ya tiene una red dirigida, convertirlo en un no dirigido 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

Mi error. Gracias por la solución. – root

0

Una buena implementación del algoritmo TextRank en Python se puede encontrar here. Si desea utilizar este script, debe ejecutar nltk.download() de antemano para instalar los archivos de datos necesarios como se describe en here.

+0

Esa implementación no es para la extracción de frases, sino más bien la extracción de palabras clave. Puede ver eso a partir de los comentarios debajo del código. – UberAlex

Cuestiones relacionadas