共起(コロケーション)をグラフにしてみる

Python で MeCabNLTKNetworkXMatplotlib を使って共起をグラフにしてみる。

まずは MeCab で文章をわかち書きにする。
テキストは過去の記事を使用。

import json
import MeCab
import networkx as nx
import matplotlib.pyplot as plt
from nltk import Text
from nltk import ngrams
from nltk import ConditionalFreqDist

m = MeCab.Tagger('-Owakati')
wakachi_text = m.parse('わかち書きしたい文章')

ほいで、NLTK でバイグラムの頻度分布を計算。

tokens = wakachi_text.split(' ')
corpus = Text(tokens)
result_ngram = ngrams(corpus, 2)
cfd = ConditionalFreqDist(result_ngram)

して、再利用できるように JSON で保存

with open('./collocation.json', mode='w') as f:
	json.dump(cfd, f, indent=4, ensure_ascii=False)

JSON の構造を NetworkX で使えるように変換

result = []
with open('./collocation.json', mode='r') as f:
	c = json.load(f)
	for key, values in c.items():
		for word in values:
			result.append((key, word))

Matplotlib で NetworkX を描画

G = nx.DiGraph()
G.add_edges_from(result)
node_size = [ d * 200 for (n,d) in G.degree() ]
pos = nx.spring_layout(G, k=0.6)
nx.draw_networkx(G, pos=pos, node_color='#CCCCCC', edge_color='#999999', alpha=0.6, font_family='IPAexGothic', font_size=8, node_size=node_size)
plt.axis('off')
plt.savefig("./collocation_network.png")
plt.show()

と、こうなった。