【发布时间】:2016-11-29 23:12:03
【问题描述】:
我最近编写了一个程序,可以找到两篇维基百科文章之间的最短路径。问题是从页面获取所有链接并将它们放入图表需要很长时间。找到路径是容易的部分。 基本上我在做的是这样的:
startingPage = 'Lisbon'
target = 'Adolf Hitler'
graph = nx.DiGraph()
graph.add_node(startingPage)
found = pages.import_page(graph, startingPage)
while found != True:
for node in list(graph):
if graph.out_degree(node) == 0:
found = pages.import_page(graph, node)
if found == True:
break;
而我的 import_page 函数就是这个:
def import_page(graph, starting, target):
general_str = 'https://en.wikipedia.org/w/api.php?action=query&prop=links&pllimit=max&format=json&titles='
data_str = general_str + starting
encoded_data_str = data_str.encode('utf-8') #Sanitize input
response = url.urlopen(encoded_data_str)
data = json.loads(response.read())
pageId = data['query']['pages'].keys()
print starting
if data['query']['pages'].keys()[0] == '-1': #Check if the page doesn't exist in Wikipedia
return False
elif data['query']['pages'][pageId[0]].keys()[2] != 'links': #Check if the page has no links in it
return False
for jsonObject in data['query']['pages'][pageId[0]]['links']:
graph.add_node(jsonObject['title'])
graph.add_edge(starting, jsonObject['title'])
if jsonObject['title'] == target:
return True
while data.keys()[0] != 'batchcomplete':
continueId = data['continue']['plcontinue']
continue_str = data_str + '&plcontinue=' + continueId
encoded_continue_str = continue_str.encode('utf-8') #Sanitize input
response = url.urlopen(encoded_continue_str)
data = json.loads(response.read())
for jsonObject in data['query']['pages'][pageId[0]]['links']:
graph.add_node(jsonObject['title'])
graph.add_edge(starting, jsonObject['title'])
if jsonObject['title'] == target:
return True
return False
问题在于任何大于 2/3 链接的距离都需要大量时间。关于如何加快速度的任何想法?
【问题讨论】:
-
为什么要关心边缘?你不想保留一个活动节点列表和一个访问节点列表吗?另一个问题(可能只是由于我不知道图形库引起的):在迭代其节点时修改图形是否有效?
-
还有,这里的写法,你的
import_page真的是import_Adolf_Hitler_page:) -
是的,我已经更新了,忘记在这里更新了!
-
@NicoSchertler 好吧,我需要边缘来连接相互链接的页面,对吧?否则我怎么知道两个页面之间有链接?
-
@NicoSchertler 另外,该库不允许修改图形,但这就是我迭代列表(图形)的原因。我创建一个列表只是为了迭代。
标签: python algorithm graph networkx wikipedia-api