豪鬼メモ

一瞬千撃

オープンなKindle用英和辞書

Kindleの実機(無印、Paperwhite、Oasis、Voyage等)で使えるオープンな英和辞書を作ってみた。以前の記事で紹介したEPUB辞書をKindleのmobiフォーマットに変換したものである。データソースにはWordNetWiktionaryなどのオープンに使えるものを使っている。辞書ファイルをダウンロードできるようにしておいたので、試しに使ってみてほしい。


何年かぶりに、Kindle Paparwhiteの新型が発売された。私にとっては待望だったので、早々に購入して使っている。画面が広くなってコントラストも高くなって動作も早くなって、値段が17000円と高い以外は、良いこと尽くめだ。とはいえ、よく使う期間には携帯電話よりも長時間触れるデバイスであるから、それなりの投資をするのに吝かではない。

Kindle端末には、もともとプログレッシブ英和中辞典がバンドルされている。日本人が英語の書籍を読む際にはそれを使うのが普通だろう。プロが作った辞書なので、語義の説明もちゃんとしているし、用法や例文も載っていて勉強になる。しかし、英文多読の一助とするには少し不満がある。

まず、語義説明が冗長だ。例えば、「considerable」の語義説明は以下のようになっている。読解の際には、「かなりの」という意味と「重要な」という意味があることだけを把握できればよいのだが、第一義の「かなりの」の説明でポップアップが埋められて、「重要な」に行き着くにはスクロールが必要になってだるい。2秒あれば済む操作だが、その2秒が何回もあると集中力が削がれてしまう。

読書に辞書を用いる場合、語句の大体の意味だけが分かればよく、例文や用例の説明は不要だ。例文は既に本文中にあるし、英作文をしているわけではないので文法的な詳細を知る必要もない。理想的には、調べた語句の、その文脈での適切な訳語がいきなり出てきてほしい。機械翻訳システムではないのでそこまでのことはできないが、次善として、妥当な訳語のリストが、十分な粒度で、よく使う順に並べられていてほしい。例えば「considerable」の第一義である「かなりの」という意味の訳語としては、「かなりの」「相当な」「すごい」「無視できない」などいろいろ考えられるが、代表的な「かなりの」だけがあれば良い。第二義の「重要な」という意味の訳語としては「重要な」「大事な」「著名な」などが考えられるが、「重要な」だけがあれば良い。つまり、ポップアップのファーストビューで、少なくとも「かなりの」と「重要な」が並べられていてほしい。そのような辞書を作った。

次に、既存の辞書では、派生語のたらい回しが辛い。「polytheistic」の語義が「[形]->polytheism」って書いてあるが、Kindleだとその場で二度引きできないので、そこで詰んでしまう。「inquisitiveness」も「[形]->inquisitive」って書いてあって、落胆する。「obnoxiously」は「[副]->obnoxious」って書いてあって、発狂しそうになる。プログレッシブ英和中辞典の名誉のために書くと、紙の辞書ではそれで良かったのだ。二度引きできるし、多くの場合、すぐ隣にその参照先がある。電子辞書としての最適化が今一歩なだけだ。Kindleに二度引きの機能があればと思うが、残念ながら現状はそうではない。

たらい回しにするのではなく、ちゃんと訳語や語義を一回の検索で表示してほしい。英語を含む多くの言語では接頭辞や接尾辞をつなげることでいくらでも派生語が作られるが、日常的に使われるようなパターンのほとんどはWiktionaryがカバーしてくれる。それとWordNetを組み合わせて、うまいこと派生語に訳語や語義を伝搬させた辞書を作った。

最初に訳語のリストが表示されるので、多くの場合、基本的にはそれを一瞥するだけで、調べた語句の意味が把握できるだろう。だいたいの意味が把握できたなら、1秒でポップアップを閉じて、また本文に戻れる。訳語のリストだけでは意味がわからない場合、WordNet由来の英文の語義説明を読むことになる。つまり、英和辞書であるとともに、英英辞書でもある。用法ではなく意味を把握したい場合、英語の説明を読んだ方がむしろわかりやすい。WordNetの語義説明は非常に簡潔なので、英英辞書といっても、オックスフォードとかより読みやすい。

さらに、複数語からなるフレーズも多く収録している。「get through」「go under」「put off」などの句動詞や、「out of the blue」「ballpark figure」「tip of the iceberg」などの熟語や、その他「at hand」「in time」「to date」などの定型フレーズも収録している。フレーズの全ての語をドラッグして検索することもできるし、中心となる語を選択するだけでも検索できる。

まあそういうわけで、読書のお供に最適化したポップアップ辞書データが実装できた。WordNet、日本語WordNetWiktionary英語版、Wiktionary日本語版のデータを組み合わせて作っているので、再配布可能なデータである。Web上から集めた対訳コーパスから抽出した訳語を補って、カバレッジを上げる努力もしている。オープンなデータを統合して作ったので、以後この辞書を「統合英和辞書」と呼ぶ。ここに公開するので、よかったら使ってみてほしい。

インストールは簡単だ。まず、このMOBI形式の辞書ファイルをPC上にダウンロードする。そして、KindleをUSBケーブルで繋げてファイルシステムにマウントする。ダウンロードした辞書ファイルunion-enja-dict.mobiをKindle内のdocumentsフォルダの中のdictionariesフォルダにコピーする。それから、Kindleをアンマウントして、USBケーブルを抜く。Kindleの画面の上の方をタップして、設定メニュに入り、そこにある「言語と辞書」の中の、「辞書」の中の「英語」を選ぶ。表示されるリストの中に「Union English-Japanese Dictionary」というのがあるはずだ。それを選んで「OK」を押す。これで、英語のコンテンツの辞書として統合英和辞書が使われるようになる。同様にして、オープンな英和例文辞書和英辞書も利用可能である。

ちなみに、Webブラウザでポップアップ辞書を使いたい人は、Chrome拡張を試してほしい。同じ辞書データをポップアップ辞書として任意のWebページで使えるようになる。


ここから先は実装の説明になるので、興味がある人だけ読んでほしい。統合英和辞書の辞書データは自作の検索システム用に既に用意してある。作り方については、この辺の記事でひたすら蘊蓄を語っている。今回はKindle用のデータを書き出す際の工夫を紹介したい。

辞書検索システムの辞書データの全てを書き出してしまうと、168MBにもなる。ストレージ8GBのKindleに168MBの辞書を入れるのは許容範囲だとは思うが、データは小さいに越したことはない。辞書のサイズと検索速度に負の相関があるかもしれない(確認はしていない)。よって、必要なデータに厳選して書き出すことにした。まず、収録語彙を絞る。具体的には、WordNetの語義が存在するか、訳語が存在するか、文単位の出現率が0.01%を上回る語の派生語であるか、文単位の出現率が0.02%を上回るものだけを扱う。これによって、246469語から127389語に絞られた。さらに、それぞれの語に対して、発音記号と屈折形と上位6件の訳語と上位10件の語義のみを抽出するようにした。結果として、MOBIファイルの容量を49MBに抑えることができた。収録語彙が13万件弱で大丈夫かなとも思ったが、今のところ、私の読書生活では問題ない。

英単語は、意味や文中での役割によって変化する。具体的には、名詞の複数形、形容詞の比較級と最上級、動詞の三単現形と過去形と現在分詞と過去分詞は、元のスペルとは異なることが多い。これらの変化を屈折(インフレクション)などと呼ぶ。Kindleの辞書機能では屈折形を選択することでも検索できるようにできる。当然、そのためには屈折形と原形の対応関係をインデックスとして書き出さねばならない。Wiktionaryが屈折形のデータを持っているので、それを書き出すことで対応した。

屈折に関わる厄介な問題がある。屈折形が独立した派生語としても登録されている場合、元の語を表示した方がいいのか、派生語の方を表示した方がよいのか、悩ましいのだ。例えば、「best」は「good」の最上級だが、「best」という独立した見出し語として登録されている。この場合には「best」の内容を表示した方がよいだろう。「pouring」は「pour」の現在分詞だが、元来の「注ぐ」という意味だけでなく「土砂降り」という意味も持つようになっているから、派生語として扱われている。しかし、「He's pouring water into the cup.」などという例文で「pouring」を引いた場合には、「pour」の内容を表示した方が理解しやすいだろう。ただ、Kindleはそのような動的な判断はできない。辞書データを生成する時点でその利用法を想定できるわけでもない。よって、派生語の語義のひとつとして、原形の訳語を挿入するという解法に至った、つまり、以下のようなデータを作る。

pouring  /ˈpɔːɹɪŋ/
  土砂降り, 鋳込み, 注ぐ, 注入
  [形] flowing profusely
  [語幹] pour : 注ぐ, 流れる, 殺到する, 流す
  [複数] pourings

同じ理屈で、「-ly」「-ness」「-ful」「-ity」などがついて作られた派生語に対しても、語幹となる語をルールベースで探して、語義を注入している。これによって、派生語たらい回し問題は解決された。

practicality
  実用性, 実用主義, 実用的, 実際的, 現実的, 現実性
  [名] concerned with actual use rather than theoretical possibilities
  [語幹] practical : 実用的な, 実際的な, 現実的な, 経験豊かな

派生語との区別は明確ではないのだが、同じ綴りで別の意味を持つ同綴語というのもある。例えば「Japan」は「日本」という意味の語であるとともに、「漆器」という意味の「japan」という語としても登録されている。「China」は「中国」という意味の語であるとともに、「陶磁器」という意味の「china」という語としても登録されている。「orange」は橙色または蜜柑の仲間だが、「オレンジ郡」を意味する「Orange」という語も登録されている。それらは文中に現れた場合には大文字か小文字かで区別できるが、文頭の場合は区別できない。そもそも辞書検索は大文字と小文字を区別しないので、データを作るときにどちらの意味を先に表示するかが悩ましい。結論としては、コーパス内で大文字で出現する確率を集計して、確率が大きい方を先に表示することにしている。Kindleの場合、同綴語の二番目以降の語は横スワイプで表示できるようになっているので、「漆器」や「陶磁器」や「オレンジ郡」を意味する場合でも操作に詰むことはない。

語義説明がWordNet由来であることは既に述べた。WordNetは同義語をまとめてSynsetという単位を作り、それに語義説明をつけている。したがって、語義説明が同義語の言い換えだけで終わることがなく、ちゃんとした説明になっていることが多い。しかも、どの語義説明も20語以下という簡潔さなので、理解しやすい。とはいえ、英文を読むのには時間がかかるので、やはりできるだけ訳語をつけたい。訳語は基本的には日本語WordNetから引っ張ってきている。Wiktionary英語版とWiktionary日本語版からも訳語が取れることがあるので、それをマージしている。それでもカバーできない語は、対訳コーパス中の頻出語で補完している。自分でこの辞書を使っての感覚だと、文中に現れる固有名詞以外のほとんどの単語は辞書の見出し語として登録されている。現実的に調べる語句の範囲では、訳語のカバレッジも精度も98%くらいは行っていると思う。というか、訳語がなかったり間違っていたりするケースを実際に見るのは本当に稀だ。

Kindleのカスタム辞書の作り方については、本家の解説を見ればわかる。ここでは、「run」という単語だけを登録した辞書を作る方法をメモしておこう。まず、辞書データをXHTML形式で書き出す。名前はmain.htmlとでもしようか。

<?xml version="1.0" encoding="UTF-8"?>
<html
xmlns:mbp="https://kindlegen.s3.amazonaws.com/AmazonKindlePublishingGuidelines.pdf"
xmlns:idx="https://kindlegen.s3.amazonaws.com/AmazonKindlePublishingGuidelines.pdf">
<head>
<title>My Dictionary</title>
<link rel="stylesheet" href="style.css"/>
</head>
<body>
<mbp:frameset>
<div class="head">
<idx:entry name="en" scriptable="yes" spell="yes">
<idx:orth>run
<idx:infl>
<idx:iform name="present 3ps" value="runs"/>
<idx:iform name="present participle" value="running"/>
<idx:iform name="past" value="ran"/>
<idx:iform name="past participle" value="run"/>
</idx:infl>
</idx:orth>
</div>
<div class="text">走る。滑る。見事に転ぶ。</div>
</idx:entry>
</mbp:frameset>
</body>
</html>

文書のbody要素の直下にmbp:frameset要素が来るところは他のKindleの書籍データと同じだ。辞書データ特有の部分は、idx名前空間で示される。個々のエントリはidx:entry要素で表現される。idx:entry要素のname属性は、ファイル内での辞書のIDを示す。今回は一種類の辞書しか入れないので、省略してもよいが、いちおう書いておく。scriptableとspellはインデックスからの参照の可否とワイルドカード検索の可否を示すらしいが、とりあえずyesにしておけば良い。デフォルトがyesなので省略しても良い。見出し語をidx:orth要素の中に表現するとともに、屈折形のリストをidx:infl要素の中に入れる。個々の屈折形を表すidx:iform要素にはname属性で文法的機能を指定できるのだが、現状のところ使われていないの値は何でもいい。語義は適当なHTMLで表現すれば良い。

CSSスタイルシートのファイルを書き出す。style.cssという名前にする。注意すべきは、Kindle実機のポップアップ内で有効なCSSがかなり限定されているということだ。フォントの種類やサイズの指定は機能しない。:beforeや:afterのcontent属性も使えない。colorの色指定は微調整できないので、#000とそれ以外の2段階と考えるべきだ。文中のマージンやパディングは無視されるので、レイアウトは空白文字を使ってやるしかない。文頭のマージンは指定できるが、3em区切りぐらいのグリッドに寄せられるので、非常に使いにくい。実質、レイアウトの概念は忘れて、単なる行区切りテキストだと思った方がよい。

div.head { font-weight: bold; }
div.text { color: #333; }

本文のデータやスタイルファイルをまとめるためのパッケージファイルを作る。名前はpakcage.opfなどとする。全体的にEPUBと同じOPF形式に則っているが、x-metadata要素がKindle独自だ。DictionaryInLanguage要素で、見出し語の言語を指定する。英和辞書ならenだ。DictionaryOutLanguageで語義説明の言語を指定する。英和辞書ならjaだ。DefaultLookupIndexは言語未指定のユースケースでどのID(idx:entryのname属性と一致)の辞書を検索するか指定するらしいが、今回はenしかないのでそれを書く。

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://www.idpf.org/2007/opf" xml:lang="ja">
<metadata xmlns:dc="http://purl.org/dc/elements/1.1/">
<dc:identifier id="pub-id">urn:uuid:7453bc86-4206-11ec-841c-6709f4a87744</dc:identifier>
<dc:publisher>dbmx.net</dc:publisher>
<dc:title>My Dictionary</dc:title>
<dc:language>en</dc:language>
<x-metadata>
<DictionaryInLanguage>en</DictionaryInLanguage>
<DictionaryOutLanguage>ja</DictionaryOutLanguage>
<DefaultLookupIndex>en</DefaultLookupIndex>
</x-metadata>
</metadata>
<manifest>
<item id="style" href="style.css" media-type="text/css"/>
<item id="main" href="main.html" media-type="application/xhtml+xml"/>
</manifest>
<spine page-progression-direction="default">
<itemref idref="main"/>
</spine>
</package>

この3つのファイルを適当なディレクトリにおいて、Kindle Previewer 3でパッケージファイルを読み込む。すると、電子書籍がうまいこと作られる。あとはそれをMOBI形式でエクスポートすれば、カスタム辞書の完成だ。何万語もある辞書だと10分くらい生成に時間がかかるが、辛抱強く待つこと。AZW形式にするにはAmazonのサービスで同様のことをすればよいらしい。自分で使う分にはMOBI形式で十分だけども。

ところで、スマホやPCのKindleアプリケーションでカスタム辞書を使う方法を探しているが、いまだにわからない。どっかのファイルを置き換えればできそうなんだけど、誰か知ってたら教えてくだされ。たまにKindleを持ち出すのを忘れてスマホで読書することがあるので、可能であれば辞書も揃えたいなと。(追記:この方法でできた)


まとめ。Kindleの実機で使える真にオープンな英和辞書を作った。訳語と語義のシンプルな表示が使いやすく、また派生語たらい回し問題も解決している。WordNetWiktionaryのおかげで収録語数も商用のそれに引けをとらない。我ながら実用性が高いと思っている。

新しいKindle Paperwhiteはマジで良いので、買った方がいいです。読書ほどコスパの良い娯楽はなかなかないので、初期投資もそんなに痛くない。Kindleと自転車さえあれば健康で文化的な生活が送れます。