如何将其表示为网络?

时间:2015-07-05 23:11:38

标签: python graph substring

我想制作一个可视化,显示子字符串属于多少个单词。一些子串可能属于同一组词。例如,子字符串tionten都是单词detentionattention的子字符串。

我想到了树的表示,但在我的实际程序中,有数百个父母与子女之间的关系,并且由于两三个父母可能有同一个孩子,所以它可能变得非常复杂。因此,我认为网络可以运作。

这是设置它的代码。

from collections import defaultdict

words = ['mention', 'detention', 'attention', 'iteraction', 'interception', 'solution', 'iteraction',
     'reiteration', 'determination', 'tension', 'tentative', 'intention', 'solution',
     'tentative', 'concatenation', 'alternative', 'bitter', 'asterisk']

substring_dict = defaultdict(list)
ter = 'ter'
tion = 'tion'
ten = 'ten'

for entry in words:
    if ter in entry:
        substring_dict[ter].append(entry)
    if tion in entry:
        substring_dict[tion].append(entry)
    if ten in entry:
        substring_dict[ten].append(entry)

substring_dict是列表字典,其中键是子字符串,值是子字符串所属的单词列表。

我如何直观地表达这一点?我以为我也可以对节点进行颜色编码。

1 个答案:

答案 0 :(得分:1)

您可以使用networkx来查看图表。

让我们首先对您的预处理进行一些小改动:

words = ['mention', 'detention', 'attention', 'iteraction', 'interception', 'solution', 'iteraction','reiteration', 'determination', 'tension', 'tentative', 'intention', 'solution', 'tentative', 'concatenation', 'alternative', 'bitter', 'asterisk']

subs = ['ter','tion','ten']
edges = []

for word in words:
    for sub in subs:
        if sub in word:
            edges.append( (word, sub) )

print edges[0:6]

# prints [('mention', 'tion'), ('detention', 'tion'), ('detention', 'ten'), ('attention', 'tion'), ('attention', 'ten'), ('iteraction', 'ter')]

让我们开始绘图:

import networkx as nx
import matplotlib.pyplot as plt

g = nx.Graph()
g.add_nodes_from(subs)
g.add_nodes_from(words)
g.add_edges_from(edges)
pos=nx.spring_layout(g)

nx.draw_networkx_nodes(g, pos,
                       nodelist=subs,
                       node_color='r',
                       node_size=1000,
                       alpha=0.8)

nx.draw_networkx_nodes(g, pos,
                       nodelist=words,
                       node_color='b',
                       node_size=1000,
                       alpha=0.8)

nx.draw_networkx_edges(g, pos, width=1.0, alpha=0.5)

nx.draw_networkx_labels(g, pos, dict(zip(subs,subs)) )
nx.draw_networkx_labels(g, pos, dict(zip(words,words)) )

它产生:enter image description here

备注:

  1. 您可能希望处理节点的放置,现在我们正在使用应更改的nx.spring_layout
  2. 使用节点的大小进行播放,以便标签不会延伸到外部。