発音付き英和辞典(Ajax的操作可能)の改造

投稿者: | 2006年9月19日

自分自身のAjaxの勉強を兼ねた発音付き英和辞典を構築し、自分でも便利に使っている。
使用している英和辞典はフリーのデータであるGENE95辞書である。
約57,000語を収録し、訳は簡単な表現が多いが、普通に使う分には充分である。
発音データは、これもフリーのWyabdcRealPeopleTTSを使用している。
なかなかフリーの発音データが見つからず、色々検索しやっと見つけたデータである。
約20,000語の音声データが収録されている。こんなデータがフリーで公開されているなんて、インターネットってやっぱりスゴイな。
この二つのデータを組み合わせて、発音付き英和辞典にしている。操作はAjaxを取り入れ、綴りの一部を入力すると、単語の候補が20語表示されるようにしている。発音データがある単語はリンクになり、クリックすると別窓で再生できる。
前から気になっていたのは、検索時間がかかりすぎるという点である。
サーバマシンのスペックの問題でもあるのだが、辞書データがテキスト形式なのがネックなのだろう。
ということで、辞書データをデータベース化することにした。


データベースの構成は辞書データのテーブルが一つである。その内容は、
・ id(主キー)
・ 英単語
・ 訳
・ 発音データの有無
と言う単純なものだ。もし、本格的な辞書を目指すのであれば、品詞や用例なども設けたほうがいいのだろうな。
次に、GENE95辞書からSQL文を生成する。phpでやっても良かったのだが、久々にperlでスクリプトを以下のように書いてみた。

# GENE95から辞書データを抽出。発音データの有無も検査
$i = 1; #行数
$j = 0; #sqlスクリプトファイルNo
open ( HANDLE , “gene.txt” ) ;
while ( ) {
$key = $_ ;
$key =~ s/n//;
$key =~ s/’/”/g;
$tmp = substr($key, 0, 1);
$file = ‘../word/’ . $tmp . ‘/’ . $key . ‘.wav’;
if (-e $file) { # ファイル存在演算子(-e)
$wrp = 1; # 存在
} else {
$wrp = 0; # 存在せず
}
# print $file;
$data = ;
$data =~ s/n//;
$data =~ s/’/”/g;
if($j == 0){
$j = int($i/1000)+1;
$dic2sql = “DIC2SQL” . $j;
$dic2sqlfile = “gene2sql” . $j . “.sql”;
open ( $dic2sql , “>$dic2sqlfile”);
# last; # whileを抜ける
}
print $dic2sql “insert into gene95(keyword,content,wrptts) values(‘”;
print $dic2sql $key;
print $dic2sql “‘ , ‘”;
print $dic2sql $data;
print $dic2sql “‘ , “;
print $dic2sql “‘” . $wrp . “‘);n”;
}
close ( HANDLE );

さらに、発音データの単語も全て入れることにする。ただし、すでに上のスクリプトで抜き出した英単語は重複してしまうため除くことにする。
そのため、一語ごとにGENE95データを検索し、重複している単語は除外する処理を行った。前文検索なので、結構な時間がかかる。まあ、一度だけの処理だから良しとしよう。
スクリプトは以下のとおり。

open ( HANDLE , “gene.txt” );
@array = ;
close(HANDLE);
use File::Find;
use File::Basename;
$dic2sql = “WRPTTS2SQL”;
$dic2sqlfile = “wrptts2sql” . “.sql”;
open ( $dic2sql , “>$dic2sqlfile”);
my $dir = ‘../word’; # 対象ディレクトリ名(相対パスでもOK)
$i = 1;
find(&print_file, $dir);
sub print_file {
$fname = $File::Find::name;
if (grep(/wav$/,$fname)) { # .wavファイルか確認
$bname = basename( $fname );
$bname =~ s/.wav//;
if (grep(/^$bname/,@array)) { # GENE95データ内を検索
# print “含まれています。n”; #何もせず
} else {
# print “含まれていません。n”;
print $dic2sql “insert into gene95(keyword,wrptts) values(‘”;
print $dic2sql $bname;
print $dic2sql “‘ , ‘1’);n”;
}
} else {
# print $fname . “はwavファイルではありません。n”;
}
if(($i % 100) == 0){
print $i . “n”; #経過を知るためのメッセージ
}
$i++;
}
close( $dic2sql );
exit;

まあ、しかし、データベース化した割には余りレスポンスはよくなっていない。
やはり、マシンのスペックの問題だろう。
あぁ、もっといいマシンがほしいな。