あっという間の十年ブログ【Ruby篇】

"詮ずるところ#{プログラミング}は、ただ年月長く倦まずおこたらずして、はげみつとむるぞ肝要にて、学びやうは、いかやうにてもよかるべく、さのみかかはるまじきことなり。いかほど学びかたよくても、おこたりてつとめざれば、功はなし。また、人々の才と不才とによりて、その功いたく異なれども、才不才は、生まれつきたることなれば、力に及びがたし。されど、大抵は、不才なる人といへども、おこたらずつとめだにすれば、それだけの功は有る物なり。" - 本居宣長

使用頻度の高い食材(クックパッド)

春にあった歓迎会のBINGOでまさかの大当たりが出て司会の人に「お友達と楽しんでくださいね(ぷぷw見るからにお前ぼっちだしこれからもぼっちだよw)」と言われて以来、全く触っていなかったIHクッキングヒーターを思い出した。このIHさえあれば鍋が楽しめるのかと思っていたが、(友達を手に入れる前に)鍋を手に入れる必要があった。
そんな鍋を手に入れる前に鍋初心者の俺はクックパッドで一般的に使われているであろう食材を探すことにした。

大まかな流れは、

  1. 鍋ものカテゴリで鍋料理ごとに材料を抽出
  2. WWW::Mechanizeで次のページへ移動
  3. 抽出した材料をカウント
use WWW::Mechanize;
use utf8;
my (@words, $word);
my $agent = WWW::Mechanize->new;

$agent->get('http://cookpad.com/category/1607');
open(my $out, ">", "cook.txt");

for(0..45) {
	my $html = $agent->content;
        # sオプションにより"."を改行にマッチさせる
	@words = $html =~ m{<div\sclass='material\singredients'>....(.*?)<span}gs; 
	foreach $word (@words) {
		# ゴミを削除
		$word =~ s/[※・、。()写真☆★○●◎◯〓×◇◆□■△▲▽▼*α]/\n/g;
		# 全ての半角記号を削除
		$word =~ s/[\x20-\x7E]//g;
		print $out "$word\n";	
	}
	$agent->follow_link(text_regex => qr/次へ/);
	print $agent->uri, "\n";
}
close ($out);

何度試しても空白行を削除する方法が全くわからなかったので「空白行 削除 Perl」で出てきたワンライナーを使う。

#ワンライナーで空白行を削除 (http://d.hatena.ne.jp/yohei-a/20100409/1270795617)
perl -i.org -ne '/^\s*$/ or print' cook.txt

抽出した食材をカウントする。

my (@words, $word, %count);
open(my $out, "<", "cook.txt");
chomp(@words = <$out>);
close($out);

open($out, ">", "count.txt");
foreach $word (@words) {
	$count{$word} += 1;
}
foreach $word (keys %count) {
	print $out "$count{$word} $word\n";
}
close($out);

空白行を削除する方法がわからなかったために一つのファイルで作業を終わらせられなかった。ぐやじい!
ハッシュをソートする方法もわからなかったので、コマンドラインで「sort -r -n count.txt」を実行。

Excelでグラフ化

だいたい正しい順位だとは思うが、本来はもっと上位にあるはずの食材がひらがなとカタカナと漢字の組み合わせで別の食材と認識されて過小評価されているケースがちらほらある。
例) 人参の出現数44回、にんじんの出現数26回、ニンジンの出現数12回、合計82回

あー、鍋してー。