Kamus Besar Bahasa Indonesia における見出しの数

Kamus Besar Bahasa Indonesia (インドネシア語大辞典、以下KBBI)の第3版にもとづいたデータベースがWebで公開され検索できるという話昨年2月に書いた。更に、先月は出たばかりの第4版を買ったことも記した。

第4版の前書きによると、第3版でおおよそ78,000だった見出し(lema)が90,049に増えたという。見出しのうち、親項目(lema pokok)が41,250、追込項目(sublema)が48,799だそうだ。(ちなみに親項目、追込項目という用語は広辞苑第5版の凡例から取った。)

そこで浮かんだのが、Web版は、第3版の見出し項目全てを網羅していないことは分かっている(例えばA(2)が欠落している)のだが、どれくらい欠落しているだろうかという疑問だ。Web版では親項目のみで引けるので、一方で書籍の78,000の見出しのうち親項目の数を調べて、他方で、スクリプトでも書いてWeb版から親項目のリストを引っこ抜いて数えて比較すれば良い。で、第3版の前書きを見ようと思ったら、ない。第2版はあるのだけれども、第3版が手元にない。どこに行ってしまったのか?誰か持っている人がいたら、前書き見て教えてください…。

Web版から調べた見出し親項目の数は、35,975。第4版の数から類推して、それほど欠落はしてなさそうだが、親項目と追込項目の比率が同じとも限らないのでやはり分からない…。これ以上やるには、Web版から追込項目まで含めた数を出すことだが、今日はそんな気力はなかった。

Web版から見出し(親項目)を引っこ抜く Perl スクリプトを以下に引用しておく。あまり行儀の良いことではないので、一切の説明はしないが、こうすれば良いんでね?というアドバイスは歓迎する。標準出力にprintするだけなので、何かファイルに流し込んでください。

#!/usr/bin/perl

# Kamus Besar Indonesia on web の単語リストを取得

use HTTP::Request::Common qw(POST);
use LWP::UserAgent;

# 単語の最初の一字
#my @initchars=(‘-‘,’q’,’z’);
my @initchar=(‘-‘,’a’,’b’,’c’,’d’,’e’,’f’,’g’,’h’,’i’,’j’,’k’,’l’,’m’,’n’,’o’,’p’,’q’,’r’,’s’,’t’,’u’,’v’,’w’,’x’,’y’,’z’,’-‘);

#$opkode, $param, $perintah, $perintah2, $kata, $dftkata, $more, $head
foreach $param ( @initchars ){
my $opkode=2; #固定 前方一致
my $perintah=’Cari’;
my $perintah2=”;
my $kata=”;
my $dftkata=”;
my $more=1;
my $head=0;
while ( $more > 0 ) {
($perintah,$perintah2,$dftkata,$more,$head) = &get_wordlist($opkode, $param, $perintah, $perintah2, $kata, $dftkata, $more, $head);
# print “$printah\n$perintah2\n$dftkata\n$more\n$head\n——-\n”;
print join (“\n”, split(“;”,$dftkata)) . “\n”;
sleep 3; # not to be regarded as DOM attacks
}
sleep 10; # not to be regarded as DOM attacks
}

sub get_wordlist ($$$$$$$$) {
# リクエストの生成
my $url = ‘http://pusatbahasa.diknas.go.id/kbbi/index.php’;
my ($opkode, $param, $perintah, $perintah2, $kata, $dftkata, $more, $head) = @_;
my %formdata = (‘OPKODE’ => $opkode,
‘PARAM’ => $param,
‘PERINTAH2’ => $perintah2,
‘DFTKATA’ => $dftkata,
‘MORE’ => $more,
‘HEAD’ => $head,
‘KATA’ => $kata);
if ( $perintah2 eq “” ) {
$formdata{“PERINTAH”} = $perintah;
}

my $request = POST($url, [%formdata]);

# UserAgentを生成して処理
my $ua = LWP::UserAgent->new;
my $res = $ua->request($request);
$ua->agent(“Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_3; ja-jp) Appl”);
my $allcontents = $res->as_string;

if ( $allcontents =~ /name=\”DFTKATA\” value=\”([^\”]+)”/ ) {
$dftkata = $1;
}
if ( $allcontents =~ /name=\”MORE\” value=\”([^\”]+)”/ ) {
$more = $1;
if ( $more > 0 ){
$perintah=””;
$perintah2=”Berikut”;
}
}
if ( $allcontents =~ /name=\”HEAD\” value=\”([^\”]+)”/ ) {
$head = $1;
}

@arr = ($perintah,$perintah2,$dftkata,$more,$head);

@arr;
}