17 Apr 2011

Bangalore, India

インドである。バンガロールである。仕事柄、縁があるはずなのに、なぜか今まで縁がなかったバンガロールに、ついに来る羽目(?) になった。しかも、最低2週間+延長可能性あり、の長丁場である。
今のところ、ちょっと郊外にあるホテルと仕事場の往復しかしていなくて、街の中心には出ていないのだが、それでも既に、インドのエネルギーを感じている。

27 Mar 2011

英辞郎 を StarDict と Android で使う

英辞郎は、前にもちょっとだけ触れたが、見出し語の数182万 (Ver.128時点) を誇るスーパー電子英和/和英辞書である (正確には辞書データ)。

検索ソフトは StarDict が最強。複数辞書の串刺し検索ができるし、Windows と Linux の両方で使える。
Android 端末には、ColorDict。StarDict の辞書データがそのまま使えて、やはり串刺し検索もできる。

大昔に変換したデータを今まで使い回していたのだが、英辞郎の最新版を何年かぶりで購入したら、辞書データの変換のしかたをすっかり忘れていた。改めて一からやり直したので、ここにまとめておく。
なお、変換を行った環境は Windows XP である。Ubuntu 等の Linux でも、ほぼ同じ手順でできるはず。

準備するもの:
ActivePerl (使った版数は v5.12.2.1202)
StarDict Editor (Linux の場合は StarDict Tools)

辞書データ変換手順:

1. 文末の Perl スクリプトで、英辞郎のデータを、StarDict Editor が読み込める形式に変換する。
Perl スクリプトのファイル名: eiji2sd.pl
英辞郎データのファイル名: EIJI-128.TXT
出力先のファイル名: eiji-128-sd.txt
とすると、コマンドプロンプトから、
C:\>perl eiji2sd.pl EIJI-128.TXT > eiji-128-sd.txt

2. StarDict Editor で、上で変換したファイルを、さらに StarDict 形式に変換する。

StarDict の設定:
1. 上でできあがった .dict, .idx, .ifo の 3つのファイルを、C:\Program Files\StarDict\dic に入れる。
2. StarDict を起動して、Manage Dictionary の Dict List タブに今入れた辞書が表示されているのを確認し、Manage Dict タブでその辞書にチェックを入れ (自動的に入っているはず) 好みで表示順を設定する。

ColorDict (Android) の設定:
1. 上でできあがった .dict, .idx, .ifo の 3つのファイルを、/sdcard/dictdata に入れる。
2. ColorDict を起動すると、Indexing dictionaries と表示されてしばらく待たされる。終わったら、Dicts タブに今入れた辞書が表示されているのを確認し、好みで表示順などを設定する。

おまけ:
.ifo ファイルを編集して、bookname= の行を例えば bookname=英辞郎英和 v128 のようにしておくと、それが、StarDict や ColorDict の辞書一覧と画面に表示されるようになる。必ず utf-8 の BOM 無し で保存すること。

なお、Linux の StarDict Tools では、dictzip で .dict ファイルを .dict.dz に圧縮できるが、Android の ColorDict はこの圧縮形式に対応していないので注意。


英辞郎→StartDict Editor TAB 形式 変換 Perl スクリプト
(注意1: 文字コードは utf8 で保存すること)
(注意2: 和英辞郎には、見出し語に "文章" が入っているが、それはこのスクプリトで取り除いている。StarDict がクラッシュするので、試行錯誤で見つけた解決策。なので、根本的な真の原因かどうかはわからない。)



use strict;
use utf8;
use Encode;


my ($key, $value, $word, $class, $prevword, $in) = ('', '', '', '', '');
my %desc;
my %classvalue = (
'語源' => 23,
'名' => 22,
'代' => 21,
'動' => 20,
'自他動' => 19,
'他動' => 18,
'自動' => 17,
'形' => 16,
'副' => 15,
'助動' => 14,
'前' => 13,
'助' => 12,
'接続' => 11,
'接頭' => 10,
'接尾' => 9,
'間' => 8,
'句動' => 7,
'句他動' => 6,
'句自動' => 5,
'略' => 4,
'人名' => 3,
'地名' => 2,
'組織' => 1
);


while (<>) {
chomp;
$in = decode('cp932', $_);
if ( ($key, $value) = ($in =~ m/^■(.+) : (.+)$/) ) {
if ( $key =~ m/^([^\{]*[^\{\s])\s+\{([^\}]+)\}$/ ) {
($word, $class) = ($1, $2);
}
else {
($word, $class) = ($key, '-');
}

$value =~ s/\\/\\\\/g;
$value =~ s/■・/\\n   /g;
$value =~ s/■/\\n/g;
$value =~ s/([a-zA-Z]+)・/$1‧/g;


# $value =~ s/{[ぁ-ゔ/()・_ー ]+}//g; # to remove (most of) FURIGANAs
# $value =~ s/【@】([^、【]+、)+//; # to remove KANA pronunciations


if ( $word !~ m/[。、]/ ) { # to remove sentences, i.e. non-words, in order to avoid StarDict crashing
if ( ($word ne $prevword) && ($prevword ne '') ) {
flush($prevword, %desc);
undef %desc;
}
$desc{$class} = $value;
$prevword = $word;
}
}
else {
print STDERR encode('cp932', "irregular line[$.]: $in\n");
}
($key, $value, $word, $class) = ('', '', '', '');
}
flush($prevword, %desc);


sub flush {
my ($word, %desc) = @_;
my ($key);

print encode('utf8', "$word\t");
if ( $desc{'-'} ) {
print encode('utf8', "$desc{'-'}\\n");
delete $desc{'-'};
}
foreach $key (sort byclass keys %desc) {
print encode('utf8', "〖$key〗$desc{$key}\\n");
}
print "\n";
}


sub byclass {
my ($as, $ac, $am) = ( $a =~ m/^(?:([0-9]+)\-)?([^\-\s]+)(?:\-([0-9]+))?/ );
my ($bs, $bc, $bm) = ( $b =~ m/^(?:([0-9]+)\-)?([^\-\s]+)(?:\-([0-9]+))?/ );
my @diffs = ($as - $bs, $ac - $bc, $classvalue{$bc} - $classvalue{$ac}, $ac cmp $bc, $am - $bm);
my $diff;


foreach $diff (@diffs) {
if ($diff != 0) {
return $diff;
}
}
return 0;
}

A8 #1

adds by Google

A8 #2

amazon

scouter

scouter: fisheater