英辞郎のStarDict形式への変換

以前Webからダウンロードした英辞郎(EDP-132.exe: unrarで解凍可能)の辞書ファイルをLinuxのStarDict用に変換した時のメモ。そのままで正常動作する変換スクリプトを公開しているサイトは見つけられなかったが、英辞郎の元データに前処理を加えた後に以下サイトのPerlスクリプトを使うことでStarDict形式に変換することが出来た。

上記サイトのPerlスクリプトでやっていることは、以下。

  1. SHIFT-JISからUTF-8への文字コード変換
  2. 元辞書ファイルの行頭"■"の除去
  3. 元辞書ファイルのキー($key)と対応する値($value)を区切り文字" : "を区切りにして抽出
  4. キーからさらに検索語($word)と名詞、形容詞などの分類($class)を抽出
  5. Tab形式のファイル(検索語とその意味が"\t"によって分かれる)を生成。その際に同一の検索語のエントリを一行にまとめる。まとめる際は、あらかじめ設定した優先レベル(%classvalue)の高い行を見出しに近いところに置く。

しかし、このスクリプトをそのまま英辞郎の辞書ファイルに掛けるとTab形式をStarDict形式に変換するためのtabfileコマンドで、『同じ検索語が複数見つかった(duplicated words)』というエラーが検出され、変換に失敗してしまう。英辞郎の辞書ファイルを調査すると、このエラーは英辞郎の元データに以下のような並びがあることが原因だと分かった。

検索語A ...
検索語B ...
検索語A ...

先のリンクのPerlスクリプトは、同じ検索語の行が連続して並んでいたら一行にまとめてくれるはずなのだが、元の英辞郎のファイルは上のように途中で別の検索語の行が混じっているため、一行にまとめられず、同じ検索語の行が複数残ってしまう。この対処のため、同じ検索語が連続して並ぶように以下の前処理をするスクリプトを作成して元の辞書ファイルを変換した。

#!/usr/bin/perl

use strict;
use warnings;
use utf8;
use Encode;

my $infile = $ARGV[0];

if(!$infile) {
    die "Usage: $0 [infile]\n";
}

my $file;
my %W;

open($file, $infile) || die "$!\n";

while(<$file>) {
    my $line = decode('cp932', $_);

    if($line =~ /^(.+)? : /) {
	my $key = $1;

	#$key =~ s/\{.+\}//;
	#$key =~ s/\s+$//;

	# 優先的に最初に持ってくるようにkeyにスペースを追加
	$key =~ s/\{/ \{/;

	$_ =~ s/\r//;

	$W{$key} = $_;
    }
}

close($file);

foreach (sort keys %W) {
    print $W{$_};
}

この前処理スクリプトで辞書ファイルの中身を変換してから上記のスクリプトを流すと無事StarDict形式に変換出来た。和英辞郎ではまだ同じキーワードが複数出てくるところがあったけど、そこはリンク先のスクリプト正規表現を少し修正するか、キーが重複している行のうち必要なさそうな行(たしか3ヶ所くらいだったはず)を手作業で削除すれば対処可能だ。
この形式だとコンソール版のsdcvでも無事に単語リストが表示される。今回の件で、下記リンクの変換スクリプトも調査させていただいたが、下記のスクリプト群には、同一キーワードの行をひとつにまとめる処理が入っていなかったため、最終的に上記のサイトのスクリプトをベースに変換させて頂いた。

This is a note when I converted Eijiro Dictionary file to StarDict format.