人間は、無用な知識の数が増えることで快感を感じることができる、アシモフの雑学本[2004-03-02-3]はお薦めですよ。
唯一の動物である
統計によると、騒がしい人ほどよく本を読む。本をよく読む人はその内容を語りたがる率が高いのかも。
ラムネのビンの中には栓用のガラス玉が入っているが、いかにもインチキトリビアっぽい感じが面白い。
その玉の規格品はA、不良品はBと分類され、
不良品は子供のオモチャに下取りされた。
これがビー玉の語源となった。
『はじめての一太郎』などの解説書を出している秀和トレーニング。当時は恥ずかしくて買えなかった。
C言語の解説書はもちろん『はじめてのC』
「働きバチのように働く」というが、一部の「忙しい、忙しい」と言っている人の総労働時間は、うんぬん。
働きバチの働いている時間の総計は一日五時間にすぎない。
ハンバーガーはドイツのハンブルグ市に由来する名前だが、ハンバーガー以外の「○○バーガー」って言い方がそもそもねえ。
チーズバーガーはチーズブルグ市(実在する)には何の関係もない。
記事IDは数字、記事内容は UTF-8 の文字で構成されるものとします。[記事ID][SPC][記事内容]\n
1 これはペンです 2 最近はどうですか? 3 ペンギン大好き 4 こんにちは。いかがおすごしですか? 5 ここ最近疲れ気味 6 ペンキ塗りたてで気味が悪いです
[文字bigram][SPC][出現記事ID,出現記事ID,...]\n
6-20行が検索対象ファイルを読み込みインデックスを作成する部分、1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 my $num; 5 my %idx; 6 while (<>) { 7 next unless (/^(\d+) (.+)$/); 8 my ($id, $c) = ($1, $2); 9 my @char = ($c =~ /([\x00-\x7f]|[\xC0-\xDF][\x80-\xBF]| 10 [\xE0-\xEF][\x80-\xBF]{2}| 11 [\xF0-\xF7][\x80-\xBF]{3})/gsx); 12 my %seen; 13 for (my $i = 0; $i < $#char; $i++) { 14 my $bigram = join("", @char[$i, $i+1]); 15 next if exists $seen{$bigram}; 16 push @{$idx{$bigram}}, $id; 17 $seen{$bigram} = 1; 18 } 19 $num++; 20 } 21 print "\#NUM=$num\n"; 22 foreach (sort keys %idx) { 23 print "$_ ".join(",", @{$idx{$_}})."\n"; 24 }
% ./index.pl test.txt > test.idx
#NUM=6 。い 4 いか 4 いで 6 うで 2 おす 4 か? 2,4 ... 悪い 6 最近 2,5 気味 5,6 疲れ 5 近は 2 近疲 5
6-14行が先ほど作ったインデックスファイルを読み込む部分、1 #!/usr/bin/perl 2 use strict; 3 use warnings; 4 my $num; 5 my %idx; 6 open(F, shift @ARGV) or die; 7 while (<F>) { 8 if (/^\#NUM=(\d+)/) { 9 $num = $1; 10 } elsif (/^(\S+) (.+)$/) { 11 @{$idx{$1}} = split(",", $2); 12 } 13 } 14 close F; 15 16 while (<>) { 17 my %score; 18 my %tf; 19 my @char = (/([\x00-\x7f]|[\xC0-\xDF][\x80-\xBF]| 20 [\xE0-\xEF][\x80-\xBF]{2}| 21 [\xF0-\xF7][\x80-\xBF]{3})/gsx); 22 for (my $i = 0; $i < $#char; $i++) { 23 $tf{join("", @char[$i, $i+1])}++; 24 } 25 foreach (keys %tf) { 26 my $df = (exists $idx{$_}) ? @{$idx{$_}} : 0; 27 my $idf = log($num / ($df + 1)); 28 my $tfidf = $tf{$_} * $idf; 29 foreach (@{$idx{$_}}) { 30 $score{$_} += $tfidf; 31 } 32 } 33 print; 34 foreach (sort {$score{$b} <=> $score{$a}} keys %score) { 35 print "ID:$_ SCORE:$score{$_}\n"; 36 } 37 }
% echo '最近ペンギンが好きです'|./search.pl test.idx 最近ペンギンが好きです ID:3 SCORE:3.70130197411249 ID:2 SCORE:0.8754687373539 ID:5 SCORE:0.693147180559945 ID:6 SCORE:0.587786664902119 ID:1 SCORE:0.587786664902119 ID:4 SCORE:0.182321556793955