LoginSignup
4
4

More than 5 years have passed since last update.

Rubyで前処理。Pixivのタグ検索結果から1タグ1カラムの表データを作る

Last updated at Posted at 2014-03-29

概要

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
(以下略)
4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4