Textrank: дополнение pagerank для извлечения предложений с помощью networkx

Я пытаюсь реализовать алгоритм textrank для извлечения предложений, как описано здесь . Для этого необходимо дополнить алгоритм ранжирования страниц взвешенными ребрами и заставить его работать на неориентированных графах. Реализация алгоритма рейтинга страниц 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}


person root    schedule 12.02.2012    source источник


Ответы (2)


Я думаю, вы неправильно истолковали примечание к документации 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}
person Avaris    schedule 12.02.2012
comment
Моя ошибка. Спасибо за решение. - person root; 12.02.2012

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

person drunkbn    schedule 02.10.2012
comment
Эта реализация предназначена не для извлечения предложений, а для извлечения ключевых слов. Вы можете видеть это из комментариев под кодом. - person UberAlex; 19.09.2013