概要
Pixivのタグ検索結果に対して統計解析をする際に、
作品別のタグ情報を1タグ1カラムの表データにする必要があった。
具体的に言えば、(A)から(B)に変換する必要があった。
そのため、Rubyコードを記述した。
(A)
X Y Z
X
Y Z
(B)
X,Y,Z
1,1,1
1,0,0
0,1,1
データ
-> Pixiv検索結果をCSVダウンロードするHTMLファイルを用意した
コード
pxcsv2tagtable.rb
# coding: UTF-8
=begin
pxcsv2tagtable.rb
Copyright (c) 2014 nezuq
This software is released under the MIT License.
http://opensource.org/licenses/mit-license.php
=end
require 'csv'
# 入力ファイル名
INPUT_CSV = 'INPUT.csv'
# 出力ファイル名
OUTPUT_CSV = 'OUTPUT.csv'
# しきい値(出現頻度が指定範囲外のタグのカラムは出力しない)
MAX_FREQUENCY = 1.000
MIN_FREQUENCY = 0.005
=begin
# しきい値(出現回数が指定範囲外のタグのカラムは出力しない)
MAX_COUNT = 1000
MIN_COUNT = 15
=end
# 表示しないタグのパターン
UNDISP_KEYPATTERN = /.+00users入り|R-18|漫画|落書き/
# 元データの列名
ORIGINAL_COLUMNS = %w(illust_id user_id extension title server_no user_name illust_128_url x1 x2 illust_480mw_url x3 x4 illust_entry_dt tags tool_name evaluate_cnt evaluate_sum view_cnt caption page_cnt x5 x6 x7 x8 user_disp_id x9 r18_flg x10 x11 user_url)
# 元データの表示フラグ
DISP_ORIGINAL_COLUMNS = false
h_org = {}
h = {}
clm = []
CSV.foreach(INPUT_CSV, encoding: "UTF-8") do |row|
ORIGINAL_COLUMNS.each_with_index do |key, i|
h_org[key] = clm.clone if (! h_org[key])
h_org[key].push(row[i])
end if (DISP_ORIGINAL_COLUMNS)
tags = row[13] ? row[13].split(' ') : []
(h.keys | tags).each do |key|
h[key] = clm.clone if (! h[key])
h[key].push(tags.include?(key) ? 1 : 0)
end
clm.push(0)
end
sum = ->(ary){ary.reduce {|x, y| x + y}}
cnt = h.values[0].length
lst = h.delete_if {|key, ary|
(key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)*1.000/cnt).between?(MIN_FREQUENCY, MAX_FREQUENCY))
# (key =~ UNDISP_KEYPATTERN) || !((sum.call(ary)).between?(MIN_COUNT, MAX_COUNT))
}.sort_by{
|key, ary| -sum.call(ary)
}
CSV.open(OUTPUT_CSV, "wb") do |csv|
hdr = []
h_org.each do |key,val|
hdr.push(key)
end if (DISP_ORIGINAL_COLUMNS)
for i in 0..(lst.length - 1) do
hdr.push(lst[i][0])
end
csv << hdr
for i in 0..(cnt - 1) do
row = []
h_org.each do |key,val|
row.push(val[i])
end
for j in 0..(lst.length - 1) do
row.push(lst[j][1][i])
end
csv << row
end
end
puts "end!"
出力イメージ
OUTPUT.csv
艦隊これくしょん,百合,艦これ,赤賀,加賀,赤城,天龍田,天龍,龍田,大北,北上,大井,赤城(艦隊これくしょん),今日も鎮守府は平和です,鈴熊,女性提督,加賀(艦隊これくしょん),愛高,愛宕,艦これかわいい,金剛,高雄,比叡
1,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
(以下略)