注意
跳到末尾以下载完整示例代码。
词语/梯子图#
在数据文件 words_dat.txt.gz
中,对 5757 个 5 字母单词生成一个无向图。如果两个单词只有一个字母不同,则它们之间通过一条边连接,这产生了 14,135 条边。本示例在以下书籍的第 1.1 节中进行了描述:
Donald E. Knuth,《斯坦福图库:组合计算平台》(ACM Press,纽约,1993 年)。http://www-cs-faculty.stanford.edu/~knuth/sgb.html
数据文件可在以下位置找到:

Loaded words_dat.txt containing 5757 five-letter English words.
Two words are connected if they differ in one letter.
Graph named 'words' with 5757 nodes and 14135 edges
853 connected components
Shortest path between chaos and order is
chaos
choos
shoos
shoes
shoed
shred
sired
sided
aided
added
adder
odder
order
Shortest path between nodes and graph is
nodes
lodes
lores
lords
loads
goads
grads
grade
grape
graph
Shortest path between pound and marks is
None
import gzip
from string import ascii_lowercase as lowercase
import matplotlib.pyplot as plt
import networkx as nx
def generate_graph(words):
G = nx.Graph(name="words")
lookup = {c: lowercase.index(c) for c in lowercase}
def edit_distance_one(word):
for i in range(len(word)):
left, c, right = word[0:i], word[i], word[i + 1 :]
j = lookup[c] # lowercase.index(c)
for cc in lowercase[j + 1 :]:
yield left + cc + right
candgen = (
(word, cand)
for word in sorted(words)
for cand in edit_distance_one(word)
if cand in words
)
G.add_nodes_from(words)
for word, cand in candgen:
G.add_edge(word, cand)
return G
def words_graph():
"""Return the words example graph from the Stanford GraphBase"""
fh = gzip.open("words_dat.txt.gz", "r")
words = set()
for line in fh.readlines():
line = line.decode()
if line.startswith("*"):
continue
w = str(line[0:5])
words.add(w)
return generate_graph(words)
G = words_graph()
print("Loaded words_dat.txt containing 5757 five-letter English words.")
print("Two words are connected if they differ in one letter.")
print(G)
print(f"{nx.number_connected_components(G)} connected components")
for source, target in [("chaos", "order"), ("nodes", "graph"), ("pound", "marks")]:
print(f"Shortest path between {source} and {target} is")
try:
shortest_path = nx.shortest_path(G, source, target)
for n in shortest_path:
print(n)
except nx.NetworkXNoPath:
print("None")
# draw a subset of the graph
boundary = list(nx.node_boundary(G, shortest_path))
G.add_nodes_from(shortest_path, color="red")
G.add_nodes_from(boundary, color="blue")
H = G.subgraph(shortest_path + boundary)
colors = nx.get_node_attributes(H, "color")
options = {"node_size": 1500, "alpha": 0.3, "node_color": colors.values()}
pos = nx.kamada_kawai_layout(H)
nx.draw(H, pos, **options)
nx.draw_networkx_labels(H, pos, font_weight="bold")
plt.show()
脚本总运行时间:(0 分 0.288 秒)