近年、ナレッジグラフ(知識グラフ)は情報整理やAI活用の分野で注目されています。PythonのNetworkXライブラリを使えば、誰でも簡単に知識DBを構築・可視化できます。本記事では、NetworkXを使ったナレッジグラフの作り方を初心者向けに解説します。
ナレッジグラフとは
ナレッジグラフは、ノード(実体)とエッジ(関係)で構成されるネットワーク型のデータ構造です。ノードには「人」「企業」「商品」などの実体、エッジには「所属」「発売元」などの関係が割り当てられます。
NetworkXの基本
NetworkXはグラフ理論に基づくネットワーク分析ができるPythonライブラリです。無向グラフ・有向グラフの作成や、ノード・エッジの追加・削除、属性設定などが簡単にできます。
import networkx as nx
# 無向グラフの作成
G = nx.Graph()
# ノードの追加
G.add_nodes_from(["A", "B", "C"])
# エッジの追加
G.add_edges_from([("A", "B"), ("B", "C")])
知識DB(ナレッジグラフ)構築の流れ
1. データ収集
テキストやデータベースからノードとエッジの元になる情報を収集します。
2. ノードとエッジの定義
ノードには実体、エッジには関係を割り当てます。例えば「A社」と「Bさん」が「雇用」関係にある場合、「A社」と「Bさん」をノード、「雇用」をエッジのラベルにします。
import pandas as pd
# 例: エンティティと関係のデータフレーム
kg_df = pd.DataFrame({
'source': ['A社', 'Bさん'],
'target': ['Bさん', 'C商品'],
'edge': ['雇用', '発売']
})
# NetworkXでグラフ化
G = nx.from_pandas_edgelist(kg_df, 'source', 'target', edge_attr='edge')
3. 属性の追加
ノードやエッジに属性(重みやタイプなど)を追加できます。
# ノードに属性を追加
nx.set_node_attributes(G, {'A社': {'type': '企業'}, 'Bさん': {'type': '人物'}, 'C商品': {'type': '商品'}})
# エッジに属性を追加
for u, v, d in G.edges(data=True):
d['label'] = kg_df[(kg_df['source'] == u) & (kg_df['target'] == v)]['edge'].values[0]
4. 可視化
matplotlibを併用してグラフを可視化できます。
import matplotlib.pyplot as plt
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1500, font_size=10)
edge_labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()
プログラム全文と結果
プログラムの全文
import matplotlib.pyplot as plt
import pandas as pd
import networkx as nx
# 日本語フォントを指定
plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['MS Gothic', 'Meiryo', 'Yu Gothic', 'Noto Sans CJK JP']
# 無向グラフの作成
G = nx.Graph()
# ノードの追加
G.add_nodes_from(["A", "B", "C"])
# エッジの追加
G.add_edges_from([("A", "B"), ("B", "C")])
# 例: エンティティと関係のデータフレーム
kg_df = pd.DataFrame({
'source': ['A社', 'Bさん'],
'target': ['Bさん', 'C商品'],
'edge': ['雇用', '発売']
})
# NetworkXでグラフ化
G = nx.from_pandas_edgelist(kg_df, 'source', 'target', edge_attr='edge')
# ノードに属性を追加
nx.set_node_attributes(G, {'A社': {'type': '企業'}, 'Bさん': {'type': '人物'}, 'C商品': {'type': '商品'}})
# エッジに属性を追加
for u, v, d in G.edges(data=True):
d['label'] = kg_df[(kg_df['source'] == u) & (kg_df['target'] == v)]['edge'].values[0]
plt.figure(figsize=(8, 6))
pos = nx.spring_layout(G)
nx.draw(G, pos, with_labels=True, node_color='skyblue', node_size=1500, font_size=10)
edge_labels = nx.get_edge_attributes(G, 'label')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)
plt.show()
出力結果

ナレッジグラフの活用例
- 検索エンジン:関係性に基づく検索結果の改善
- 質問応答システム:知識DBから答えを導出
- 推薦システム:類似ノードの推薦
まとめ
NetworkXを使えば、Pythonで手軽に知識DB(ナレッジグラフ)を構築・可視化できます。データ収集から可視化まで一連の流れを抑えておけば、AIやデータ分析の幅が広がります。
コメント