qiita Advent Calendar に「なんか」って書いてる数を数えてみる

  • 17
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

みなさん、Advent Calendar 楽しんでますか?
ぼくを含め、カレンダーの枠予約コメントに「なんか」等書かれている数が多かったように感じたので、現時点の「なんか」をスクレイピングしてさくっと集計することにしてみました。
qr/(な[んに]|何)か/ という正規表現で、「なんか」「なにか」「何か」が見つかれば「なんか」を含んでいるということにします。
結果は、以下の通りです。

# 12/6 11:00 時点の集計値
スクレイピングできたカレンダー数:367
カレンダーごとの最大なんか数: 13
全カレンダー通してのなんか数: 1009
なんかが書かれてるカレンダー数: 244
なんかが書かれてるカレンダーあたりの平均 nanka 数: 4.135246

まず、qiita に公開されているカレンダー 367 カレンダーのうち 66% である 244 カレンダーに「なんか」が含まれていることがわかりました。
そのうち、最も「なんか」が多かったカレンダーには、13件「なんか」が含まれておりました。
また、「なんか」カレンダーの平均「なんか」は、4.1 件でした。
ぼくも含め、「なんか」書きたいけどネタはこれから考える!って場合が一定数あることがわかりました。
最近の活動を振り返って公開できることを記事にしたり、カレンダーのために頑張って tips やネタを生み出して書き続けることに意義があると思うので、前もって書く内容が決まっているか、「なんか」あとで最後の最後までネタを絞り出すかにかかわらず、みんなで頑張ってカレンダーを埋めていきたいですね!

最後に、スクレイピングと集計に使ったスクリプトを載せておきます。

nanka-scraper.pl
#!/usr/bin/env perl
#
# perl nanka-scraper.pl | tee nanka.log
#
use strict;
use warnings;

use Web::Scraper;
use LWP::UserAgent;
use URI;
use utf8;

$Web::Scraper::UserAgent = LWP::UserAgent->new(agent => 'Nanka Counter (http://qiita.com/woremacx/)'); die;

my $s_pager = scraper {
    process 'a.js-next-page-link', 'next' => '@HREF';
    process 'td.adventCalendarList_calendarTitle > a', 'calendar[]' => '@HREF';
};

my $s = scraper {
    process 'div.adventCalendarItem_comment', 'comment[]' => 'TEXT';
    process 'div.adventCalendarCalendar_join', 'join[]' => 'TEXT';
};

sub process_summary {
    my $uri = shift;
    my $scraped = $s->scrape($uri);

    my $re = qr/(な[んに]|何)か/;
    my $summary;
    $summary->{$_} = 0 for qw/blank nanka join others/;
    for my $line (@{ $scraped->{comment} || [] }) {
        unless (length($line)) {
            $summary->{blank}++;
        }
        elsif ($line =~ /$re/) {
            $summary->{nanka}++;
        }
        else {
            $summary->{others}++;
        }
    }

    $summary->{join} = scalar(@{ $scraped->{join} || [] });
    printf("summary waiting_for_join:%d comment_blank:%d comment_nanka:%d comment_others:%d url:%s\n",
           $summary->{join}, $summary->{blank}, $summary->{nanka}, $summary->{others},
           $uri->as_string);
}

sub main {
    $| = 1;
    binmode STDOUT, ":utf8";

    my $top = 'http://qiita.com/advent-calendar/2015/calendars';
    my $uri_next = URI->new($top);
    while (1) {
        warn $uri_next;
        my $scraped = $s_pager->scrape($uri_next);

        for my $calendar (@{ $scraped->{calendar} || [] }) {
            process_summary(URI->new_abs($calendar, $uri_next));
            sleep(1);
        }

        last unless $scraped->{next};
        $uri_next = URI->new_abs($scraped->{next}, $uri_next);
    };
}

main;
nanka-summary.pl
#!/usr/bin/env perl
#
# cat nanka.log | perl nanka-summary.pl
#
use strict;
use warnings;
use List::Util qw(max);

my %data;
while (my $line = <>) {
    next unless $line =~ /^summary/;

    $line =~ s/^summary //;

    my %row;
    map {
        my @tmp = split(/\:/, $_, 2);
        $row{$tmp[0]} = $tmp[1];
    } split(/\s+/, $line);

    $data{ $row{url} } = \%row;

}

my @nanka_calendar = grep { $_->{comment_nanka} > 0 } values(%data);
my $have_nanka_count = scalar(@nanka_calendar);
my $nanka_sum;
$nanka_sum += $_->{comment_nanka} for @nanka_calendar;
my @each_comment_nanka = map { $_->{comment_nanka} } @nanka_calendar;
my $nanka_max = max(@each_comment_nanka);

printf("スクレイピングできたカレンダー数:%d\n", scalar(keys(%data)));
printf("カレンダーごとの最大なんか数: %d\n", $nanka_max);
printf("全カレンダー通してのなんか数: %d\n", $nanka_sum);
printf("なんかが書かれてるカレンダー数: %d\n", $have_nanka_count);
printf("なんかが書かれてるカレンダーあたりの平均 nanka 数: %f\n", $nanka_sum / $have_nanka_count);