罗热#

构建一个包含1022个类别和5075个交叉引用的有向图,这些引用定义在1879年版的《罗热词库》中。本示例在以下章节中描述:

唐纳德·E·克努特,“斯坦福图基:组合计算的平台”,ACM出版社,纽约,1993年。 http://www-cs-faculty.stanford.edu/~knuth/sgb.html

需要注意的是,5075个交叉引用中有一个是自环,但在此构建的图中包含它,因为标准的networkx `DiGraph`类允许自环。(参见400pungency:400 401 403 405)。

数据文件可以在以下位置找到:

plot roget
skipping self loop 400 400
Loaded roget_dat.txt containing 1022 categories.
DiGraph with 1022 nodes and 5075 edges
21 connected components

import gzip
import re
import sys

import matplotlib.pyplot as plt
import networkx as nx


def roget_graph():
    """返回斯坦福图库中roget.dat示例中的同义词词典图。
"""
    # 打开文件 roget_dat.txt.gz
    fh = gzip.open("roget_dat.txt.gz", "r")

    G = nx.DiGraph()

    for line in fh.readlines():
        line = line.decode()
        if line.startswith("*"):  # 跳过注释
            continue
        if line.startswith(" "):  # 这是一个续行,追加
            line = oldline + line
        if line.endswith("\\\n"):  # 续行,缓冲区,转到下一行
            oldline = line.strip("\\\n")
            continue

        (headname, tails) = line.split(":")

        # 头部
        numfind = re.compile(r"^\d+")  # 查找该单词的数量
        head = numfind.findall(headname)[0]  # 获取数字

        G.add_node(head)

        for tail in tails.split():
            if head == tail:
                print("skipping self loop", head, tail, file=sys.stderr)
            G.add_edge(head, tail)

    return G


G = roget_graph()
print("Loaded roget_dat.txt containing 1022 categories.")
print(G)
UG = G.to_undirected()
print(nx.number_connected_components(UG), "connected components")

options = {
    "node_color": "black",
    "node_size": 1,
    "edge_color": "gray",
    "linewidths": 0,
    "width": 0.1,
}
nx.draw_circular(UG, **options)
plt.show()

Total running time of the script: (0 minutes 0.106 seconds)

Gallery generated by Sphinx-Gallery