2012-02-12 5 views
5

Я пытаюсь реализовать алгоритм textrank для извлечения предложения, как описано here. Для этого необходимо дополнить алгоритм pagerank с взвешенными ребрами и заставить его работать на неориентированных графах. Реализация алгоритма Networkx pagerank позволяет мне легко интегрировать взвешенные ребра и, как говорят, преобразовывать ориентированные графики в неориентированные: см. here. Однако, когда я тестировал это, похоже, используется ориентированный граф. Что мне здесь не хватает? Помогите с большим удовлетворением.Textrank: добавление pagerank для извлечения предложения с использованием networkx

Пример:

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

0

Хорошая реализация алгоритм TextRank в питоне можно найти here. Если вы хотите использовать этот скрипт, вам нужно заранее запустить nltk.download(), чтобы установить необходимые файлы данных, как описано here.

+0

Эта реализация предназначена не для извлечения предложения, а для извлечения ключевого слова. Вы можете видеть это из комментариев ниже кода. – UberAlex

Смежные вопросы