概要
Pixivタグ間の共起関係を見てみる事にした。
その為に、Pixivタグ検索結果(A)からクロス集計データ(B)を出力するRubyコードを書いた。
(A)
X Y Z
X
Y Z
(B)
,X,Y,Z
X,3,1,1
Y,1,3,2
Z,1,2,3
データ
-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した
コード
pxcsv2tagsummap.rb
# coding: UTF-8
=begin
pxcsv2tagsummap.rb
Copyright (c) 2014 nezuq
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
=end
require 'csv'
# Rで読み込む形式にするフラグ
IS_FORRLANG = ARGV[0] || '0' #コマンドライン第1引数で1が指定された場合、Rで読み込む形式になる
# 入力ファイル名
INPUT_CSV = ARGV[1] || 'INPUT.csv'
# 出力ファイル名
OUTPUT_CSV = ARGV[2] || 'OUTPUT.csv'
# しきい値(出現頻度が指定範囲外のタグのカラムは出力しない)
MAX_FREQUENCY = ARGV[3] ? ARGV[3].to_f : 1.000
MIN_FREQUENCY = ARGV[4] ? ARGV[4].to_f : 0.100
=begin
# しきい値(出現回数が指定範囲外のタグのカラムは出力しない)
MAX_COUNT = 100
MIN_COUNT = 10
=end
# 表示しないタグのパターン
UNDISP_KEYPATTERN = Regexp.new (ARGV[5] || ".+00users入り|R-18|漫画|落書き")
h = {}
nrow = 0
CSV.foreach(INPUT_CSV, encoding: "UTF-8") do |row|
nrow += 1
tags = (row[13] ? row[13].split(' ') : [])
tags_all = h.keys | tags
(tags_all).each do |key|
(tags_all).each do |key_in|
if !(h[key]) then
h[key] = {}
h[key].default = 0
end
h[key][key_in] += (tags.include?(key) && tags.include?(key_in)) ? 1 : 0
end
end
end
lst = h.delete_if {|key, hsh|
(key =~ UNDISP_KEYPATTERN) || !((hsh[key]*1.000/nrow).between?(MIN_FREQUENCY, MAX_FREQUENCY))
# (key =~ UNDISP_KEYPATTERN) || !((hsh[key]).between?(MIN_COUNT, MAX_COUNT))
}.sort_by{
|key, hsh| -hsh[key]
}
CSV.open(OUTPUT_CSV, "w") do |csv|
hdr = []
hdr.push(nil) if IS_FORRLANG != '1'
for i in 0..(lst.length - 1) do
hdr.push(lst[i][0])
end
csv << hdr
for i in 0..(lst.length - 1) do
row = [lst[i][0]]
for j in 0..(lst.length - 1) do
row.push(lst[i][1][lst[j][0]])
end
csv << row
end
end
puts "end!"
出力イメージ
OUTPUT.csv
,艦隊これくしょん,百合,艦これ,加賀,赤城,赤賀
艦隊これくしょん,98,93,79,13,12,12
百合,93,94,76,13,12,12
艦これ,79,76,81,12,11,11
加賀,13,13,12,13,11,10
赤城,12,12,11,11,12,10
赤賀,12,12,11,10,10,12