如何加快程序,找到两个维基百科文章之间的最短路径

时间:2016-11-29 23:12:03

标签: python algorithm graph networkx wikipedia-api

我最近编写了一个程序,找到两个维基百科文章之间的最短路径。问题是从页面获取所有链接并将它们放入图表需要很长时间。找到路径很容易。 基本上我正在做的是:

AsyncTask

我的import_page函数就是这个:

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;

问题是任何距离大于2/3的链接都需要花费大量的时间。关于如何加快速度的任何想法?

2 个答案:

答案 0 :(得分:1)

使用简单的算法和Web API几乎不可能确定地找到最短路径。如果最短路径有N步,则需要走可能长度为N-1或更小的每条路径。每个数百万篇文章和数十到数百个链接,除非你真的很幸运,最短的路径只有1-2个链接,这是不可行的。如果说距离10步之遥,则必须提出数十亿的请求,这需要数年时间。

如果您只想在大多数时间找到合理的短路径,可以尝试使用具有良好启发式的A* search algorithm之类的东西。例如,您可以假设某种small-world property并尝试识别与其他主题中心接近的主题中心以及该主题中的所有文章。或者,您可以根据同一主题或与目标相同的历史时期对候选人进行评分。

答案 1 :(得分:1)

我使用@Tgr指出的方法,利用一个小世界。 如果您使用加权网络,则可以将搜索范围限制为足够大的子图以包含相关的集线器,并且小到足以在Web RESTful API中处理。

您可能需要查看iGraph模块而不是networkx,以减少内存占用。

通过我向您建议的方法,我已经能够获得最多连接5个查询维基百科文章的最短路径,实时创建的内存占用高达100MB的子图。两个主题之间的最短路径不到1秒。

我很乐意与我的项目分享一个链接,该链接实际上为维基百科计算加权知识网络,以便搜索多个主题之间的联系 - 它是否会违反SO政策,或者可能对OP有用并且对他的讨论有用问题

编辑

感谢@Tgr对政策进行汇报。

Nifty.works是一个搜索跨学科领域之间联系的原型平台。 知识图是维基数据与英语维基百科配对的子集。

作为OP的示例,此示例显示五篇维基百科文章之间查询的最短路径subgraph for connections between articles: "Shortest Path Problem", "A star search", "networkx", "knowledge graph" and "semantic network"

我计算了维基百科的知识图作为加权网络。 该网络具有小世界属性。 通过划分知识图的一部分(子图)来查询文章之间的连接(路径)。

通过这种方法,可以足够快地提供图表搜索,从而在知识发现方面提供见解,即使在小型服务器上也是如此。

在这里您可以找到英语维基百科的examples of gamification of shortest paths between two articles,每对的距离大于3个链接 - 也就是说,它们不是第一个邻居:例如"机器学习"和"生活" - here a json of the queried subgraph)。

您甚至可能希望添加参数来调整加权子图的大小,以便获得不同的结果。 例如,请参阅:

之间的差异

最后,还要看一下这个问题:https://stackoverflow.com/a/16030045/305883