随分間が開いてしまいましたが、その間に翻訳システムの開発が進んだかというとそういうわけでもなく、有り体に書くなら単に仕事に追われていました。あまりにも更新がないと死亡認定されてしまいそうで心配なので、小手先の実装の話も芸がないということもあって、この辺で設計について少々論じてみます。
主題は、およそ自然言語処理に携わる以上は避けては通れない道、語彙(語義)・構文・文意・文脈等の曖昧性解消を如何にすべきか、というものです。
車輪の再発明どころか、発明という言葉を用いるのもおこがましい作業ですが、ともあれこのウェブログのサイドバーの表示・非表示を切り替える(トグルする)機能を追加しました。検索ボックス近傍サイドバー上部にある「段組非表示」「段組表示」という箇所が切り替えの引き金です。通常は二段組みの割り付けですが、サイドバーを非表示にすると本文部のみを表示させることが出来ます。
やっていることは極めて単純です。
document.getElementById('komplemento').style.visibility = 'visible';するか、或いは'hidden';する。厳密にはdisplay = 'none';かdisplay = 'block';を切り替えても良い。サイドバーという用語自体、GUIなユーザエージェントを念頭としたもので気にくわないので、内部的には補足(komplemento)というid属性を与えているのですが、それはさて措いて。document.getElementById('universala').style.marginLeft = '1em';するか、或いは'14em';する。委細はソースのstandardo.jsをそのままご覧いただくとして、ここでは意外にも蹴っ躓いた点を備忘録的に記述しておきます。
エスペラントは日本語と同様に語順が比較的自由です。対格(akuzativo; 英accusative)の名詞句は述語(predikato; 英predicate)の目的語(objekto; 英object)であり、主格の名詞句は主語(subjekto; 英subject, nominative)となることによります。よって、以下のいずれも非文(nefrazo, 英nonsentence)とはなりません。
歯の浮くような例を挙げましたが、それはそれとして、エスペラント語日本語翻訳システム「Ermitejo」では、構文解析と意味解析に主辞駆動句構造文法(HPSG: Head-driven Phrase Structure Grammar)という近代的な文法を採用しています。より正直に述べるなら、採用を決めて実現可能性調査を終えた段階で、まさに文法を記述し始めて間もない段階です。
さてそこで問題となるのは、HPSGにこの自由語順言語をどう実装していくかというものです。
御多分に漏れず、HPSGは英語の実装についての研究が最も盛んであり、英語は語順が比較的固定されているので、英語のHPSGの文法(規則・制約・語彙辞書)をそのまま用いることは出来ません。日本語のHPSGによる実装の研究もありますが、限られた公開物を拝見する限りでは私の頭では理解が追いつきかねました。
そこで、備忘録を兼ねて以下に実装方法の考察を述べてみます。
ようやくversio 0.9.0で実装を始めた音韻関連の機能が整いつつあります。直近で更新した内容は、韻文中での発音に関する二点です。
前者では、アクセントを変更しないという点が曲者です。エスペラントの規則性ゆえに、実装も極めて論理的かつ簡素なものとなっていたのですが、こういう特例の存在により、優雅さとは程遠い泥臭い実装を行う羽目になります。前者ではl’を「ル」と読めるようになるのですが、l’armoをルアーモと読んでしまうために、ここでも特例を設けてラーモと読めるように処理を書き加えました。
良い機会なので、発音をカタカナやIPAで転記する処理の概要をご紹介します。あまり変なことを考えず、人間の頭の中で行っている処理を素直にコード化することが一番と言えます。
('sam', 'ide', 'an', 'o', 'j', 'n')は('sam', 'ideanojn')になります。これはまだ文法上の区切りですが、続け読みが出来るように配慮された配列になっています。'sam'は('sa', 'm')に、'ideanojn'は('i', 'de', 'a', 'no', 'j', 'n')に分解されます。これで、それぞれの要素が一つの音に対応するような配列になりました。('sa', 'm', 'i', 'de', 'a', 'n', 'o', 'j', 'n')というリストを得て、配列に突っ込みます。trすれば事足ります。アクセント位置には長母音の記号を与えて完成です。samとideanojとの間は空白を入れておきます。'sa'は$japana->{'s'}{'a'}で「サ」が求まりますし、母音のみや子音のみの場合にはダミーのキーを与えて$japana->{'m'}{'_'}で「ム」、$japana->{'_'}{'i}で「イ」が求まるという次第です。長母音で「ー」を与えて完成です。このように可能な限り手を抜いて楽をして発音させている無邪気な実装なので、世知辛いesper’などという文字列を与えたら、まず「’」なんてハッシュキーがないのでこけますし、これを無視したら母音が一つ足りないわけでエスペル(エがアクセント)と読もうとするしで大変です。
そこで、以下のように機能追加することによって、こうした言語現象にも対応出来るようにしました。
音韻関係のモジュールを先の辞書引き機能の改版に合わせて新規に作成したのですが、予想通り、初物の機能はなかなか安定しませんでした。それというのも、エスペラントの規則性を過大評価したというかこれに甘えてしまい、乏しいテストケースしか用意しなかったのが敗因と言えます。結果、連日連夜の改版を行うこととなりました。大多数の場合は問題なかったとはいえ、誤った発音が表示されたり、処理が異常終了したりすることがあり、反省しています。
もう少し具体的に述べますと、エスペラントの規則性に例外があるというのではなく(sam/ide/an/oやらといった場合は除きますが)、Perlで字上符付き文字を実装する際に手抜きをしており、これが後々尾を引いているといったところでしょうか。
実は、エスペラント語日本語翻訳システム「Ermitejo」は、21世紀、このUnicodeの時代に、字上符付き文字の内部処理を前時代的なx後置式の代用表記で行っています。関数名やら変数名やらをエスペラント式に名付けているだけなら特に問題がないのですが、取り扱うデータを代用表記すると、色々不都合が起きます。
普通に処理している場合には、外部から正書法ないし代用表記で突っ込まれたデータのアルファベートを変換して内部で使い、外部に表示する際には逆変換して正書法で返しているので問題はありませんでした。しかし、エスペラントの誇る1文字1音という原則が崩れ、「ĉ」の音「ʧ」を「cx」と2文字で表現することになりますので、音韻関係の機能の実装で舞台裏が拙さが露見したという次第です。
責任転嫁するつもりは毛頭ありませんが、コーディングに使っているエディタのサクラエディタがUTF-8への対応が甘く、なかなかこうした悪癖を改められないという思いもあります。サクラエディタは内部コードがUTF-8等ではなくShift-JISなので、UTF-8のファイルの読み書き自体は出来ますが、エスペラントの字上符付き文字等やIPA等は保存出来ないので、痛いところです。今更秀丸にも戻れませんが、さりとてサクラエディタの抜本的な書き直しを行える技量も時間も私には無いので、開発者の方々に声援を送ることしか出来ません。
【追記】kobake氏のウェブサイト「digital hole」にて、UNICODE版サクラエディタの開発が進められています。
ということで、そうした発音関係の修正を中心として、ここ数日での改版点の委細を以下に転記します。
| 月 | 火 | 水 | 木 | 金 | 土 | 日 |
|---|---|---|---|---|---|---|
| « 9 月 | ||||||
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |