のんびりしているエンジニアの日記

ソフトウェアなどのエンジニア的な何かを書きます。

Pythonでニコニコタグ解析、ネットワーク作ってみた

Sponsored Links

皆さんこんにちは
お元気ですか。私は元気です。

今回もニコニコタグ解析をやってみようと思います。

最近ですが、タグでネットワークを構築してみました。
見た目が悪すぎて泣きそう。皆どうやって作ってるの。ネットワーク。

まぁ一応作ってみたので公開してみる。

#coding:utf-8
import json
import gzip
import os
import sys
import networkx
import pylab

node = []

def construct_dictionary(word,dict={},deeply=5,already_array=[]):
	node.append(word.decode("utf-8"))
	if deeply == 0:
		return dict
	dicts,movie_num = createWordDict(word)
	already_array.append(word)
	count = 0
	for key,value in sorted(dicts.items(),key=lambda x:x[1],reverse=True):
		if count == 5:
			break
		if not key in already_array:
			dict[(word.decode("utf-8"),key)] = float(value) / float(movie_num)
			construct_dictionary(key.encode("utf-8"), dict, deeply-1,already_array[:])
			count += 1
	return dict

def createWordDict(word):
	dicts = {}
	movie_num = 0
	data_dir = sys.argv[1]
	for file in os.listdir(data_dir):
		if file.endswith(".dat.gz"):
			print file, len(dicts)
			filepath = os.path.join(data_dir,file)
			for line in gzip.open(filepath):
				jsonData = json.loads(line)
				containWord = False
				for tag in jsonData["tags"]:
					if tag["tag"] == word.decode("utf-8"):
						containWord = True
						movie_num += 1
						break
				if containWord == True:
					for tag in jsonData["tags"]:
						if not tag["tag"] in dicts:
							dicts[tag["tag"]] = 0
						dicts[tag["tag"]] += 1
	return dicts,movie_num

dicts = construct_dictionary("ゲーム")
graph = networkx.DiGraph()
graph.add_nodes_from(node)
edge_list = []
for key,value in dicts.items():
	edge_list.append(key)
graph.add_edges_from(edge_list)

pos = networkx.spring_layout(graph)

networkx.draw_networkx_nodes(graph, pos, node_size=100, node_color="w")
networkx.draw_networkx_edges(graph, pos, width=1)
networkx.draw_networkx_edge_labels(graph, pos, edge_labels=dicts)
networkx.draw_networkx_labels(graph, pos, font_size=16, font_color="r")

pylab.xticks([])
pylab.yticks([])

pylab.show()

※実行時間はかなりかかるのでご注意ください。
実行結果
f:id:tereka:20140820010652p:plain

えっと見方ですが、
有向グラフとなっており、ゲームが中心です。
ゲームのトップ5のタグを検出し、そのタグを中心にトップ5のタグを検出してつないでいます。

数字はタグを検出できたときに他のタグがどの程度検出されるかを示しています。

例えば中央の方にFPSのタグがあるのですが、PCゲームのタグがある時にFPSが出る確率は27%程度ということです。

ゲーム近辺は複雑すぎてなんだか意味不明ですが・・・これを見る限りでもなんか連結されているのがありそうだなぁ・・・というのが沢山出てきてますね。

この手のツールで便利なソフトを求めています。表示が・・・表示がががが。

うん、いや本当に見難いこの画像。