我想制作一个可视化,显示子字符串属于多少个单词。一些子串可能属于同一组词。例如,子字符串tion
和ten
都是单词detention
和attention
的子字符串。
我想到了树的表示,但在我的实际程序中,有数百个父母与子女之间的关系,并且由于两三个父母可能有同一个孩子,所以它可能变得非常复杂。因此,我认为网络可以运作。
这是设置它的代码。
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
是列表字典,其中键是子字符串,值是子字符串所属的单词列表。
我如何直观地表达这一点?我以为我也可以对节点进行颜色编码。
答案 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)) )
它产生:
备注:强>
nx.spring_layout
。