
人間は、無用な知識の数が増えることで快感を感じることができる、アシモフの雑学本[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
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 }
6-20行が検索対象ファイルを読み込みインデックスを作成する部分、% ./index.pl test.txt > test.idx
#NUM=6 。い 4 いか 4 いで 6 うで 2 おす 4 か? 2,4 ... 悪い 6 最近 2,5 気味 5,6 疲れ 5 近は 2 近疲 5
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 }
6-14行が先ほど作ったインデックスファイルを読み込む部分、% 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