0

这是问题的后续(链接

我打算做的是使用 XML 使用 NetworkX 创建一个图形。看下面的 DOM 结构,同一个节点内的所有节点之间应该有一条边,所有参加过同一个会议的节点都应该有一个到该会议的节点。总而言之,所有共同撰写论文的作者都应该相互联系,所有参加过特定会议的作者都应该连接到该会议。

<conference name="CONF 2009">
<paper>
<author>Yih-Chun Hu(UIUC)</author>
<author>David McGrew(Cisco Systems)</author>
<author>Adrian Perrig(CMU)</author>
<author>Brian Weis(Cisco Systems)</author>
<author>Dan Wendlandt(CMU)</author>
</paper>
<paper>
<author>Dan Wendlandt(CMU)</author>
<author>Ioannis Avramopoulos(Princeton)</author>
<author>David G. Andersen(CMU)</author>
<author>Jennifer Rexford(Princeton)</author>
</paper>
</conference>

我已经弄清楚如何将作者与会议联系起来,但我不确定如何将作者彼此联系起来。我遇到的困难是如何遍历在同一篇论文上工作的作者并将他们联系在一起。

    dom = parse(filepath)
    conference=dom.getElementsByTagName('conference')
    for node in conference:
        conf_name=node.getAttribute('name')
        print conf_name
        G.add_node(conf_name)

    #The nodeValue is split in order to get the name of the author 
#and to exclude the university they are part of

        plist=node.getElementsByTagName('paper')
        for p in plist:
            author=str(p.childNodes[0].nodeValue)
            author= author.split("(")
#Figure out a way to create edges between authors in the same <paper> </paper>

        alist=node.getElementsByTagName('author')
        for a in alist:
            authortext= str(a.childNodes[0].nodeValue).split("(")

            if authortext[0] in dict:
                edgeQuantity=dict[authortext[0]]
                edgeQuantity+=1
                dict[authortext[0]]=edgeQuantity
                G.add_edge(authortext[0],conf_name)

            #Otherwise, add it to the dictionary and create an edge to the conference.
            else:
                dict[authortext[0]]= 1
                G.add_node(authortext[0])
                G.add_edge(authortext[0],conf_name)
                i+=1
4

2 回答 2

0

我不确定如何将作者彼此联系起来。

您需要生成 (author, otherauthor) 对,以便将它们添加为边。这样做的典型方法是嵌套迭代:

for thing in things:
    for otherthing in things:
        add_edge(thing, otherthing)

这是一个天真的实现,包括自循环(给作者一个连接自己和他自己的边缘),你可能想要也可能不想要它;它还包括 (1,2) 和 (2,1),如果你在做一个无向图是多余的。(在 Python 2.6 中,内置的permutations生成器也可以做到这一点。)这是一个修复这些问题的生成器:

def pairs(l):
    for i in range(len(l)-1):
        for j in range(i+1, len(l)):
            yield l[i], l[j]

我没有使用过 NetworkX,但是查看文档似乎说您可以在同一节点上调用 add_node 两次(第二次没有发生任何事情)。如果是这样,您可以丢弃您用来尝试跟踪您插入的节点的字典。此外,似乎说如果您向未知节点添加边,它会自动为您添加该节点。所以应该可以使代码更短:

for conference in dom.getElementsByTagName('conference'):
    var conf_name= node.getAttribute('name')
    for paper in conference.getElementsByTagName('paper'):
        authors= paper.getElementsByTagName('author')
        auth_names= [author.firstChild.data.split('(')[0] for author in authors]

        # Note author's conference attendance
        #
        for auth_name in auth_names:
            G.add_edge(auth_name, conf_name)

        # Note combinations of authors working on same paper
        #
        for auth_name, other_name in pairs(auth_names):
            G.add_edge(auth_name, otherauth_name)
于 2009-10-02T16:53:15.383 回答
0

我不完全确定你在寻找什么,但根据你的描述,我拼凑了一个图表,我认为它封装了你描述的关系。

http://imgur.com/o2HvT.png

我使用 openfst 来做到这一点。我发现在进入类似这样的代码之前清楚地布局图形关系要容易得多。

另外,你真的需要在作者之间产生明确的优势吗?这似乎是一个遍历问题。

于 2009-10-02T16:59:43.890 回答