Menu

「ジーニアス英和大辞典」の派生語表示修正スクリプト


【現象と対策】
パソコン上でEPWING辞書検索ソフ トDDwinを使って、「ジーニアス英和大辞典」のabsorbance、absorbed、absorbness を引くと、それぞれ以下のように表示されます(発音記号は外字なので、ここでは省略)。
------------------------------------------------------------------------------
ab・sorb・ance/<発音記号>/【名】〔物理〕吸収度, 吸光度.
ab・sorbed【形】すっかり心を奪われて, 深く興味をもって;吸収された;合併された.
ab・sorbed・ness【名】
------------------------------------------------------------------------------
これを Palm用辞書検索ソフトで引くと、それぞれ以下のように表示されます。
------------------------------------------------------------------------------
ab・sorb・ance/<発音記号>/【名】〔物理〕吸収度, 吸光度.
【形】すっかり心を奪われて, 深く興味をもって;吸収された;合併された.
【名】
------------------------------------------------------------------------------
すなわち、派生語や略語などで見出し語 と品詞名のあいだに発音記号などの情報がない場合、見出し語が表示されません。これは検索ソフトのバグではなく、 「ジーニアス英和大辞典」の前方一致表記形INDEX が、そのような語句の場合に見出し語のあとを指し示しているからです。該当する語は、収録語数約255,000中、66,165語と1/4に及びます。
これを解決するために、HONMON 中の前方一致表記形INDEX のデータを書き換えるPerl のスクリプトを作ってみました。Windows98SEとClie TG50で動作は確認していますが、7年ぶりのPerlプログラミングなので、勘違いや冗長な個所もあるかもしれません。使用された方から、報告・指摘等 のメールを頂けるとうれしいです。

【手順】
(1) Perlをインストールしていない人は、まずウェブから探してきてインストールする。
私は、以下のサイトから ActivePerl 5.6.1.638 をインストールしました。
http://www.activestate.com/Products/Download/Download.plex?id=ActivePerl

(2) この文末のスクリプトをgenius.plとして perl.exe と同じのディレクトリに保存する。

(3)「ジーニアス英和大辞典」の CD-ROM から HONMON を、perl.exe と同じディレクトリにコピーし、プロパティで「読み取り専用」のチェックをはずす。

(4) MS-DOS のコマンドラインで、perl.exe のディレクトリ(ここでは\perl\bin とする)に移り(cd \perl\bin と入力し改行)、以下を実行する。20~30秒で処理が終ります。
C:\perl\bin>perl genius.pl honmon

(5) こののちに、ebzipによる圧縮などの処理を行ってください。

【注意】
(1) EPWING版「ジーニアス英和大辞典」(大修館書店)のみが対象です。
(2) 必ず圧縮前の HONMON を使ってください。squeeze による減量化を行ったものでも可です。

【参考にした書籍】
(1) Perlの国へようこそ(サイエンス社、1993年)前田薫ほか
(2) 新Perlの国へようこそ(サイエンス社、1996年)斎藤靖ほか
(3) 初めてのPerl(ソフトバンク、1995年)Randal L. Scwartz
(4) Perlプログラミング(ソフトバンク、1993年)Larry Wall & Randal L. Scwartz
(5) Perl書法(アスキー出版局、1993年)増井俊之
(6) クイックPerl5リファレンス(プレンティスホール、1997年)マイケル・オフォル

【追記】
hishidaさんのウェブサイトの「EPWING/電子ブックの個別情報」のページ によれば、EPWING版「ジーニアス英和<第3版>・和英辞典」にも、同様の見出し語表示の問題があるそうです。私はこの辞書を所有してい ないので、具体的な対応策は提示できませんが、ほとんど同じ方法で対応可能だと考えています。


### genius.pl (v1.0)###
open(HONMON, "+<$ARGV[0]") || die "Can't open HONMON\n";
open(MAIN, "<$ARGV[0]");
binmode HONMON;
binmode MAIN;
$entry=0x100;
seek(HONMON, 0, 0);
read(HONMON, $buf, 16);
$idno=ord(substr($buf, 1, 2));
for($i=1; $i<=$idno; $i++){
    read(HONMON, $buf, 16);
    ($id, $a, $blk, $b, $sum)=unpack("C a3 n a2 n", $buf);
    if ($id==0x91) {$index=$blk; $size=$sum};
}
for($i=$index+0x0020; $i<$index+$size-1; $i++){
    seek(HONMON, 0x0800*$i, 0);
    read(HONMON, $buf, 4);
    ($a, $n)=unpack("a2 n", $buf);
    for($j=1; $j<=$n; $j++){
        read(HONMON, $c, 1);
        read(HONMON, $word, ord($c));
        read(HONMON, $buf, 12);
        ($a, $blk, $offs)=unpack("a2 n n", $buf);
        $point=0x800*($blk-1)+$offs;
        seek(MAIN, $point-6, 0);
        read(MAIN, $buf, 4);
        $delim=unpack("N", $buf);
        if($delim!=0x1F0A1F09) {
            seek(MAIN, $point-$entry,0);
            read(MAIN, $buf, $entry);
            $hit=rindex($buf, pack("N", 0x1F0A1F09));
            $new=$point-$entry+$hit+6;
            $offs=$new % 0x800;
            $blk=($new-$offs)/0x800+1;
            seek(HONMON, -10, 1);
            print HONMON pack("n n", $blk, $offs);
            seek(HONMON, 6, 1);
        }
    }
}
close(HONMON);
close(MAIN);