以前から、Ankiデッキを効率的に各種のデータから作成する方法を開拓してきたが、ここではEpwing辞書からAnkiデッキを生成する方法を紹介する。
まえがき
Epwingとはかつて、一度データを購入すれば、自身が所有するあらゆる端末上で利用することができるようになるという、夢のような、自由で便利な辞書データの規格(JIS X 4081)であった。 しかし現在では、旧式化、クローズドな規格への切り替えなどにより、ほぼ絶滅しており、オリジナルのEpwing辞書の入手は困難になっている。 一方で、デファクト・スタンダードとして一度覇権を握った影響は大きく、現在でも各種プラットフォーム向けのEpwing辞書ビューアは生き長らえており、各種の辞書ソフトのデータをEpwing形式に変換するようなツールも有志により開発が続けられている。 中でもロゴヴィスタの電子辞書シリーズは、Epwingから派生したフォーマットを使用していることもあり、かなりの辞書がdessedによりEpwing形式に変換可能である。 ITの基礎知識を持つ語学学習者が、これらのEpwing辞書から好きなものを選び、高品質なAnkiデッキを容易に作成できるようになることが、本稿の意図するところである。
準備
おおよそ以下のものが必要である。
- Javaランタイム
Wokを動作させるために必要になる。多くの環境ではデフォルトでインストールされているため、新たに導入する必要はない。必要があれば、https://java.com/ja/download/ からダウンロードする。
- Wok
TSVファイルを加工するためのツール。 https://github.com/rubyu/wok/releases/download/v0.1.0/wok-0.1.0.jar をダウンロードする。
- Wokスクリプト
Wokが行う処理を記述したファイル。 https://github.com/rubyu/wok-scripts/archive/v0.1.zip からダウンロードする。
- Epwing辞書
前述のEpwing辞書。好みのものを用意すること。
- 単語のリスト
Ankiデッキに変換する元となる、単語が列挙されたファイル。ASCII、またはUTF-8で記述されていること。
ツアー
以下では次に示されるシンプルな単語のリスト list.txt
を出発点として、僅かな手順で、十分に実用になるデッキを生成していく。
> type list.txt apple book car
環境構築
まだ作業を始めたばかり、フォルダの中身はlist.txt
だけだ。
> dir /b list.txt
Java環境は整っているだろうか。確かめてみよう。
> java -version java version "1.8.0_77" Java(TM) SE Runtime Environment (build 1.8.0_77-b03) Java HotSpot(TM) Client VM (build 25.77-b03, mixed mode, sharing)
ではここで、Wok、そしてWok-Scriptsをダウンロードしよう。Wok-Scriptsはzipで圧縮されているので解凍しておく。フォルダの中身はこうだ。
> dir /b list.txt wok-0.1.0.jar wok-scripts-0.1 wok-scripts-0.1.zip
Wok-Scriptsには動作テスト用に、挨拶をするだけのスクリプト hello.wok
が含まれている。早速試してみよう。
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\hello.wok Hello!
フィールドを追加する
list.txt
にフィールドを追加することで、Ankiのデッキとして意味を持つTSVファイル(フィールドがタブで句切られているファイル)を構築していく。
ランクフィールド
まず簡単な例を示す。
ある単語が、ある単語リストの中で何番目であるかを示すフィールドを構築するためのスクリプト、rank.wok
を用いて以下のように:
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\rank.wok -v src=0 -v dst=1 -v grp=1 -v@rawstr list=list.txt -v update=true list.txt "apple" "1" "book" "2" "car" "3"
ここで、-v src=0
は処理の元になるフィールドの番号を指定している。list.txtにはまだ1つのフィールドしかない。そのため0と置く。
-v dst=1
は処理の結果を書き込むフィールド番号を指定している。1を指定しているため、2番めのフィールドに処理結果が書き込まれる。
-v grp=1
は何件ごとに1つのランクとするか。ここでは1件ごとにランクは繰り上がる。
-v@rawstr list=list.txt
はランクの基準となるリストを指定している。ここでは入力と同じファイルを指定している。
-v update=true
はdst
で指定したフィールドに値があった場合、それを上書きすると指定している。
list.txt
を処理するため、一番最後に与えている。
また、Wokを実行した結果は、リダイレクトを用いて任意のファイルとして保存することができる。ここではres0.tsv
として結果を保存する。
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\rank.wok -v src=0 -v dst=1 -v grp=1 -v@rawstr list=list.txt -v update=true list.txt > res0.tsv
うまく保存できただろうか。確認してみよう。
> type res0.tsv "apple" "1" "book" "2" "car" "3"
音声フィールド
ここでは研究社新英和(第7版)・和英(第5版)中辞典(KENE7J5)をデッキ生成に用いる。
Epwing辞書を検索し、音声ファイルのフィールドを構築するためのスクリプトeb-voice-anki.wok
を用いて、以下のように:
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\eb-voice-anki.wok -v src=0 -v dst=2 -v idx=0 -v update=true -v@rawstr dic=KENE7J5 -v@rawstr media=media res0.tsv > res1.tsv
-v idx=0
は検索結果の何番目の音声ファイルを使用するかを指定している。(例えば UK、USなどの順で、)複数の音声が含まれている場合に、望ましいインデックス番号を指定すことができる。
-v@rawstr dic=KENE7J5
はEpwing辞書のパス(CATALOGSを子に持つフォルダ)を指定している。環境に合わせて適切な値を設定すること。
-v@rawstr media=media
は音声ファイルを保存するフォルダを指定している。このフォルダが存在しない場合、処理の中で自動的に生成される。
このスクリプトは処理を実行するのに必要なebquery-0.3.1.jar
を自動的に保存する。見覚えがないファイルが存在することに驚かないこと。
さて、結果を見てみよう。
> type res1.tsv "apple" "1" "[sound:D7E4E20774DDB06FBA354BD6B91FE24F.wav]" "book" "2" "[sound:9669237A5749E31144688F7F24C2C6D9.wav]" "car" "3" "[sound:4C7A322536A21791D5F559F3E199C77B.wav]"
[
と]
で囲まれたAnki形式のsoundタグを持つ3番めのフィールドが追加されている。
> dir /b media 4C7A322536A21791D5F559F3E199C77B.wav 9669237A5749E31144688F7F24C2C6D9.wav D7E4E20774DDB06FBA354BD6B91FE24F.wav
音声ファイルもきちんとmedia
フォルダ内に作られている。
語義フィールド
さて、最後のフィールド。音声フィールドと同様に、研究社新英和(第7版)・和英(第5版)中辞典(KENE7J5)を用いることとする。
このフィールドを作成するために、必要なものがある。それはMapファイルで、ここで必要になるのはKENE7J5.map
。EBWin4をインストールすると、%APPDATA%\EBWin4\GAIJI
に自動的に生成される。あるいは空のmapファイルを用いてもよい。その場合はtype nul > KENE7J5.map
として用意する。
念のため、KENE7J5.map
が存在するか確認しておこう。
> dir /b ebquery-0.3.1.jar KENE7J5.map list.txt media res0.tsv res1.tsv wok-0.1.0.jar wok-scripts-0.1 wok-scripts-0.1.zip
準備ができれば、Epwing辞書を検索し、語義のフィールドを構築するためのスクリプトeb-html-min.wok
を用いて、以下のように:
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\eb-html-min.wok -v src=0 -v dst=3 -v update=true -v@rawstr dic=KENE7J5 -v@rawstr ebmap=KENE7J5.map -v@rawstr media=media res1.tsv > res2.tsv
-v@rawstr ebmap=KENE7J5.map
は前述のmapファイルの場所を指定している。
-v@rawstr media=media
音声フィールドのときと同様。ここでは外字を表示するための画像ファイルを保存する。
さて、結果を見てみよう。
> type res2.tsv "apple" "1" "[sound:D7E4E20774DDB06FBA354BD6B91FE24F.wav]" "<span class=""e bquery KENE7J5""><span class=""ebkw""><img alt=""hA132"" class=""ebec"" src=""40 CB34C31B79B8D7EF231201333C4468.png""><span class=""ebul"">ap繝サple</span> </span ><br>/ヌスpl/竊帝浹螢ー<br>笏・img alt=""zB128"" class=""ebec"" src=""ACD7681805EBF 0F9BD3345E9F56C122F.png""><br><span class=""ebul"">1</span> <span class=""ebul"" ~略~
ちょっと見づらいが、4番目のフィールド、HTMLで記述された語義が生成されている。 各フィールドの文字数でもチェックしてみよう。
> java -jar wok-0.1.0.jar -f wok-scripts-0.1\cell-convert.wok -v@rawstr expr=v.size res2.tsv "5" "1" "44" "1081" "4" "1" "44" "10742" "3" "1" "44" "1536"
うまく生成できたようだ。これでデッキは完成。res2.tsvをAnkiで読み込み、mediaフォルダの中のファイルをAnkiのcollection.mediaにコピーすれば、作業は完了となる。
なお、その際、Anki側では適切なノートタイプを予め定義しておく必要がある。ここでは「単語」「ランク」「音声」「語義」からなるデッキを生成したので、ノートタイプも同様に。
おすすめの辞書コンテンツ
dessed にて変換可能なもの
音声あり、中辞典。Weblioを引くと表示されるのはだいたいこれ。
大辞典。英和。
大辞典。和英。
コーパスとして。
コーパスとして。