2012-02-12 89 views
5

Tôi đang cố triển khai thuật toán textrank để trích xuất câu như được mô tả here. Đối với điều đó cần phải bổ sung thuật toán pagerank với các cạnh có trọng số và làm cho nó chạy trên các đồ thị vô hướng. Thực hiện thuật toán thuật toán mạng pagerank cho phép tôi dễ dàng tích hợp các cạnh có trọng số và được cho là chuyển đổi các đồ thị được hướng dẫn thành không bị hư hướng: xem here. Tuy nhiên, khi tôi thử nghiệm nó vẫn có vẻ sử dụng đồ thị đạo diễn. Tôi đang thiếu gì ở đây? Giúp rất nhiều appriciated.Textrank: bổ sung pagerank để trích xuất câu bằng networkx

Ví dụ:

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}

Trả lời

9

Tôi nghĩ rằng bạn hiểu sai các ghi chú trên networkx tài liệu. Mặc dù, tôi phải thừa nhận nó có thể được diễn đạt tốt hơn.

Các thuật toán PageRank được thiết kế cho đồ thị có hướng nhưng thuật toán này không kiểm tra xem đồ thị đầu vào được chỉ đạo và sẽ thực hiện trên đồ thị vô hướng bằng cách chuyển đổi mỗi cạnh định hướng trong đạo diễn đồ thị để hai cạnh.

Điều này cho biết, thuật toán PageRank được thiết kế cho đồ thị có hướng, nhưng nó có thể được sử dụng cho đồ thị không bị vạch trần. Để làm như vậy, nó chuyển đổi mạng không bị chuyển hướng thành một mạng được hướng dẫn bằng cách thay thế mỗi cạnh bằng hai cạnh được hướng vào (vào và ra).

Do đó, nếu bạn cung cấp cho nó một mạng có hướng, nó sẽ tính PageRank theo cấu trúc được chỉ dẫn. Vì vậy, một trong hai bắt đầu với một mạng vô hướng:

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} 

hoặc nếu bạn đã có một mạng lưới trực tiếp, chuyển nó sang một vô hướng một:

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

Lỗi của tôi. Cảm ơn bạn đã giải pháp. – root

0

Một thực hiện tốt đẹp của các thuật toán TextRank trong python có thể được tìm thấy here. Nếu bạn muốn sử dụng tập lệnh này, bạn phải chạy nltk.download() trước, để cài đặt các tệp dữ liệu cần thiết như được mô tả here.

+0

Việc triển khai đó không dành cho việc trích xuất câu, mà là khai thác từ khóa. Bạn có thể thấy điều đó từ các bình luận bên dưới mã. – UberAlex