豪鬼メモ

一瞬千撃

Kindle用英和辞書の未収録派生語転送

Kindle用英和辞書で、ファイル容量の制限のために収録できなかった派生語を、派生元の語の別名として登録した。これにより、辞書に収録されなかった派生語を調べた場合にも、次善策として派生元の語が表示されるようになった。さらに、派生関係を使った訳語の伝搬アルゴリズムも少し改良して、より多くの語に訳語を付与した。結果として、和英辞書のカバレッジも少し上がっている。


Kindle用の辞書ファイルは、加工前のデータファイルの容量が90MBくらいを超えられないという制限がある。これは仕様による制限というよりは、HTMLデータを電子書籍用のデータ(KFXかMOBI)を作るためのKindle Previewer 3の不具合のせいである。なので、各語の語義の数を制限したりとか、各語義のテキストの長さを切り詰めたりとか、収録語数を16万語ほどに厳選したりとか、涙ぐましい工夫をしている。エラーになるかどうかが、加工処理を開始して2時間くらい経ってからしか分からないから、試行錯誤に非常に時間がかかってしまう。Kindle Previewer 3の開発者が自分達では使ってないからそういう駄目仕様になるんだろう。憤懣やる方ない。

辞書を引いても該当が見つからないとがっかりするので、収録語数は多い方が望ましい。しかし、同じ容量内で収録語を増やすには各語のデータを削るしかない。現状、語義は最大8個までに制限しているが、多義語の利便性を考えると、これ以上は削りたくない。この辞書のウリである訳語のリストや派生語や熟語の情報も削れない。したがって、収録語数をこれ以上増やすことはできない。

収録語数の選定は、基本的には語の出現頻度を基準に行っている。コーパス内でよく出現する語句は収録され、そうでない語句は捨てられる。基本的には、まれにしか出現しない語は知らなくても読解に問題ないことが多い。仮に、頻出語である stomach(胃)が読書中に出てきてその意味を知らなかったとして、stomachが何たるかが本文中で言い換えられることはないので、辞書を引かないと読解に支障が出る。一方で本文中に pylorus(幽門)という専門用語が出てきた場合には、「the muscular valve of the organ」とかの言い換えが出てくることが期待できるし、胃のどこかの部位だということは文脈で推定できるので、辞書を引かなくても読解に支障が出ないことが多い。実際にはpolorusくらいなら従来の版の辞書にも収録されているのだが、もっと難解な医学用語とか動植物の名前とか化合物の名前とかになると未収録になる。

専門用語はネイティブ話者も知らないことが多いので、我々ESL学習者も知らなくて読解に問題はない。しかし、非頻出語であってもネイティブ話者は当然知っているとみなされ、読解に支障が出る語句がある。それが派生語だ。例えば、measles(麻疹)という単語はネイティブ話者なら誰でも知っているので、ESL学習者も習得することが望ましい。それを知らない状態で本文に出てきたなら辞書を引くことになるだろう。さて、measleslikeという派生語は、measlesに比べると頻度は非常に低いが、ネイティブ話者であれば当然「measlesのような」という意味であることは理解するので、つまりmeaslesを知っている人間はmeasleslikeも知っているとみなされる。しかし、出現頻度で辞書を作るとなると、measleslikeは捨てざるを得ない。そして、measlesを知らないESL学習者がmeasleslikeを調べようとした時に問題になる。

紙の辞書であれば該当箇所の近くにmeaslesという語があるのでそれを読むことで代用できるが、ポップアップの電子辞書の場合はそうもいかない。ならば、measleslikeを調べた時にmeaslesが勝手に表示されるように索引を作り変えてしまえばいい。snowboardlike(snowboardのような)、aggressivism(aggressiveな考え方)、poetryless(poetryが無い)、immoralization(immortalにすること)、aborally(aboralな方法で)、abortee(abortされたもの)といった派生語は、語幹となる語の意味さえ分かれば理解できるだろう。なので、容量の関係で未収録にせざるを得なかった語句が別の収録語の派生語である場合には、そちらを参照するように索引だけを登録すると有用そうだ。

ということで、実際にやってみたところ、約188000個ほどの別名索引が登録された。実際にはinflection(屈折)として登録している。うち15000個はson in lawとsun-in-lawなどの表記揺れを吸収するための別名で、残り173000個が派生語の別名である。容量の増加は索引の分の8MBくらいで済み、なんとかKindle Previewer 3も動かすことができた。オックスフォード英英辞典とかプログレッシブ英和辞典とかは派生語の処理がもともとうまくできていて、その分だけ派生語が語幹の語を隠す問題がうざかったりもしたのだが、今回の改修でそれらに追いついて追い越した感じかな。実際に使われた全ての別名のリストをここに上げておく。一例を以下に挙げるが、unselfconsciousnessとかunserviceabilityなんて語を拾ってくる辞書もあんまりないだろう。

unsearchably
unsearchableness
unseasonableness
unseaworthiness
unseeably
unseeableness
unseeingly
unseeingness
unseemliness
unseemlily
unsemely
unselectively
unselfconsciousness
unsentimentality
unsentimentally
unsentimentalist
unsentimentalize
unseriously
unseriousness
unserviceability
unserviceableness
unserviceably

実際のところ、measleslikeとかいった語が出てくることはあまりないのだが、カバレッジが高い辞書を携えていることは、読書のモチベーションを上げてくれる。むしろ私なんかは、難解な語が出てくると嬉々として辞書を引いて、ちゃんと該当が出てくると「フムフム」「ナルホドー」などと呟きながら読書を進めている。そこで該当が出なかったらがっかりしちゃうだろう。カバレッジは高ければ高いほうがいい。かの大橋巨泉は、オーストラリアやカナダに在住して英語ペラペラであるにもかかわらず、辞書を片手にスポーツ観戦をして、解説者が言った未知語をひたすら調べていたという。私はリスリングが壊滅的に駄目なのでそんな芸当はできないが、読書のときくらいは似たような知的探求をしてもいいかなと思っている。

以下、実装のうんちく。派生語のリンク関係はWordNetの派生語リンクとWiktionaryの語源データと手製の適当なルールベースのアルゴリズムで抽出した。というか、以前作った連想英単語集のデータをそのまま流用している。このデータは機械的に抽出した上で最終的に私自ら手動で修正しているので、再現率も精度もかなり高いものになっている。日常で使う語はほとんどカバーされていると思う。

今回はカバレッジを上げることを目的としているので、前回の派生語対応とは異なり、既に収録している派生語に対して別名を追加することはない。未収録の派生語の表層表現を、語幹となる既存の収録語の別名として登録するのだ。検索した語が収録されていなかった場合にのみ発動してほしいので、orthography(正書法)索引ではなくinflection(屈折)索引に登録する。また、派生語の屈折形も登録して、過去形などを選択した際にも検索できるようにする。結果的に索引の項目数はかなり増えることになる。XMLデータはこんな感じ。sentenceの派生語がこんなにあるなんて、皆知ってたかい?

<span class="word">
<idx:orth>sentence
<idx:infl inflgrp="noun">
<idx:iform name="plural" value="sentences"/>
</idx:infl>
<idx:infl inflgrp="verb">
<idx:iform name="present 3ps" value="sentences"/>
<idx:iform name="present participle" value="sentencing"/>
<idx:iform name="past" value="sentenced"/>
<idx:iform name="past participle" value="sentenced"/>
</idx:infl>
<idx:infl inflgrp="common">
<idx:iform name="child" value="sentencewise"/>
<idx:iform name="child" value="sentenceable"/>
<idx:iform name="child" value="sentencehood"/>
<idx:iform name="child" value="sentencer"/>
<idx:iform name="child" value="sentencers"/>
<idx:iform name="child" value="sentoid"/>
<idx:iform name="child" value="sentoids"/>
<idx:iform name="relative" value="nonsentence"/>
<idx:iform name="relative" value="nonsentences"/>
<idx:iform name="relative" value="resentence"/>
<idx:iform name="relative" value="resentences"/>
<idx:iform name="relative" value="resentencing"/>
<idx:iform name="relative" value="resentenced"/>
<idx:iform name="relative" value="midsentence"/>
<idx:iform name="relative" value="subsentence"/>
<idx:iform name="relative" value="subsentences"/>
<idx:iform name="relative" value="hypersentence"/>
<idx:iform name="relative" value="hypersentences"/>
<idx:iform name="relative" value="multisentence"/>
<idx:iform name="relative" value="presentence"/>
<idx:iform name="relative" value="pseudosentence"/>
<idx:iform name="relative" value="pseudosentences"/>
<idx:iform name="relative" value="foresentence"/>
<idx:iform name="relative" value="foresentences"/>
<idx:iform name="relative" value="foresentencing"/>
<idx:iform name="relative" value="foresentenced"/>
</idx:infl>
</idx:orth>
<idx:orth value="sentencing"></idx:orth>
<idx:orth value="sentenced"></idx:orth>
</span>
</div>
<div>文章, 判決, 文, 宣告, センテンス, 言い渡す</div>
</idx:entry>

ところで、一つの派生語が複数の語幹語を持つことがある。名詞aggressivismは形容詞aggresiveの派生語だが、aggressiveは動詞aggressの派生語である。この場合、aggressivisimはaggressの派生語であるとも言える。語の派生関係は明確なツリー構造ではなく、複数の親を持っていたり、親子のどっちが先だかわからないような関係のものも多い。ともかく言えることは、一つの語が複数の語を親に持っていたり、先祖が循環しているように見えることもあったりと、複雑なグラフ構造になっているということだ。

今回は頻度の低い未収録語から頻度の高い収録語にリンクを張るので、必ずしも子から親に転送するとは限らない。親の方が頻度が低くて未収録語になっているような場合もたまにある。重要なのは、ある未収録語が複数の収録語にリンクしている場合に、どちらを転送先にするかということだ。これは、親子関係と頻度で決める。可能であれば親に転送したいが、親が複数いる場合には頻度の高い親を選びたいし、親の頻度があまりに低い場合には子の方がいいかもしれない。そこで、適当な経験則を適用する。親なら10、子なら1を基準スコアとして、それに出現確率を掛けた値が最大のものを選択する。実は元来の屈折でも同じ問題があり、dyingがdieの現在分詞なのかdyeの現在分詞なのかといった衝突問題を同じような頻度による順位付けで解決している。結局のところ、正解はないので、こんな簡便法で十分だ。

まとめ。Kindle辞書の容量を増やさずにカバレッジを上げる方法として、未収録の派生語を調べると語幹の語が自動的に表示されるようにした。ちょっとずるだけど、紙の辞書だって、たらい回しをいっぱいするのだし、古典的な手法だとも言える。こうして、measleslikeを見て、あれmeaslesって麻疹だっけ風疹だっけと迷って引いてみたけどヒットしなくて苛ついたことに対するカタルシスは完了した。resentenceを見てresentの名詞形だと勘違いして意味が通らんなと思って調べたら出てこなくて、別の辞書で調べたらre-sentence(再判決を下す)って意味だと分かったときのようなタイムロスももうなくなる。実際問題として、読書を進めるための安心感が増した。大抵の派生語の意味は語幹から理解できる。たとえ語幹も含めて検索に失敗しても、派生語だから辞書に載っていないのではなく、語幹も含めて辞書に載っていないと思えるなら、おそらくネイティブ話者も知らない語なのだと納得して読み進められるようになる。

出現頻度によって選ばれた16万語の見出し語とその屈折形17万個を元々収録していた辞書はカバレッジの面で既に各種の商用辞書に匹敵するものであった。今回さらに派生語からの転送を19万個ほど水増ししたことで、もしかして電子辞書の中では最強クラスなんじゃないかと思えてきた。実際の書籍を読みながらだと、漏れが全くと言っていいほどない。むしろ、人名などの固有名詞以外で検索失敗を起こすには非常に苦労するだろう。