NetworkXで知識DBを構築する方法|Pythonでナレッジグラフを作る手順

この記事は約6分で読めます。
スポンサーリンク

近年、ナレッジグラフ(知識グラフ)は情報整理や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やデータ分析の幅が広がります。

コメント

タイトルとURLをコピーしました