Textrank:利用networkx补充pagerank进行句子提取
我正在尝试实现一个叫做textrank的算法,用来提取句子,具体的描述可以在这里找到。为了做到这一点,我需要在pagerank算法的基础上加上加权边,并让它在无向图上运行。
Networkx的pagerank算法实现让我可以很方便地加入加权边,并且据说可以把有向图转换成无向图,具体可以查看这里。
不过,当我测试的时候,它似乎还是在使用有向图。我可能漏掉了什么?非常感谢大家的帮助。
示例:
import networkx as nx
D=nx.DiGraph()
D.add_weighted_edges_from([('A','B',0.5),('A','C',1)])
print nx.pagerank(D)
输出: {'A': 0.25974025929223499, 'C': 0.40692640737443164, 'B': 0.33333333333333331}
2 个回答
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}