2009年01月24日

上野式でエスペラントを翻訳するには

上野式システムでは、品詞は次のようにコード化されます。

*0 句読点
*1 名詞
*2 代名詞(主格)
*3 他動詞
*4 助動詞
*5 形容詞
*6 副詞(*t以外の副詞)
*7 前置詞
*8 限定詞
*9 接続詞(*a以外の接続詞)

*a and, or, but
*b be動詞
*j 自動詞
*o 代名詞(目的格)
*q 疑問詞
*r 関係詞
*t 時の副詞
*x 間投詞、節、文

その他の属性を表わすために h,l,m,n,p,s,w は使われているため、未使用の文字は

c d e f g i k u v y z

英語の場合は、代名詞の主格(*2)と対格(*o)を考えるだけでよかったのですが、エスペラントでは名詞と形容詞の対格を考えに入れなければいけません。そこで

*e 名詞(対格)
*k 形容詞(対格)

として、

granda birdo → 51
grandan birdon → ke

と処理することにしてみました。


posted by アキラ at 16:46| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月23日

上野式システムの翻訳の手順

上野さんの BASICプログラムは、こんなふうにして英語の文を日本語の文に翻訳します。

まず入力した文を単語に切り分け、個々の単語について辞書から品詞などの情報を得ます。文が"Big birds catch insects."であったとすると、
big→5
birds→1l
catch→3l
insects→1l
のような情報が与えられます。情報の最初の1文字は品詞で、見てわかる通り、1は名詞、3は動詞、5は形容詞です。これを用いて英文は記号化され、"5131"というコードに変化します。

そのコードに1番目の変換表を適用すると"SSVO"になりますが、ここで再び辞書を引いて訳語を得つつ、単語の統合と、対応する記号の統合を行ないます。

big→大きい
birds→鳥
catch→を捕える
insects→虫

"SSVO"は1番目の記号と2番目の記号が同じなので、2つのSは統合されて1つのSになり、コードは"SSVO"から"SVO"に変わります。この統合に対応するように1番目の単語と2番目の単語が統合されて"big-birds"となり、訳語も"大きい-鳥"となります。

"SVO"というコードに2番目の変換表を適用すると"SOV"になるので、その順番にしたがって訳語を並べると、
S 大きい-鳥
O 虫
V を捕える
で、主語(S)に「は」を付け加えれば「大きい鳥は虫を捕える」という訳文が得られます。


posted by アキラ at 22:47| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月22日

外見的には同じようにふるまうプログラム

上野さんの BASICプログラムの解読は難航しています。

そこで攻め方を変えてみました。プログラムがどんなデータを用いて、どんな入力に対してどんな出力を返しているか、細かくチェックしてみたのです。その結果、どうも思ったよりも単純なことしかしてないようだということが明らかになりました。

もっと行儀のいいプログラムでも同じことはできるのに、どうして GOTOを乱用するのか、FOR-NEXTループは2重、3重くらいが普通なのに、21重のループという常識はずれをした上に、ループの外へむやみに飛び出すようなプログラムをなぜ書いたのか。上野さんのプログラムは謎だらけです。

それを何とか解き明かそうと近づいて見るから混乱してしまうので、ちょっと距離を置いて、ブラックボックス扱いすれば答えはわりと簡単に出せたのです。

上野さんの BASICプログラムをなでしこで書き直すことは絶対に不可能です。しかし、それと同じデータを用いて、同じ入力に対して同じ出力を返すプログラムを書くことは難しくないと思います。

この妖しい魅力に満ちた BASICプログラムのそっくりさんをなでしこで書いてみようと思います。

posted by アキラ at 19:18| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月21日

BASICプログラムの比較をしてみたい

そもそものきっかけは20年前、パソコン雑誌に連載された BASICの翻訳プログラムです。作者は上野俊夫という人で、掲載されたのは『PCマガジン』でした。「構造化プログラミング、くそくらえ!」と言わんばかりの、GOTOを乱用したスパゲッティ・プログラムでしたが、当時のパソコンで翻訳プログラムを作ろうとした作者のチャレンジ精神は誉められるべきものだったと思います。いつか自分も翻訳プログラムを作りたいと、この頃から漠然と考えるようになりました。

20年前の私はあまり我慢強くなかったので、上野さんのプログラムからは何ひとつ学んでいません。私が彼から受けた影響は、そのチャレンジ精神だけでした。

先日、本棚を整理していたら『PCマガジン』が何冊か見つかりました。上野さんの連載は全部で5回だったのですが、そのうちの後半3回分を幸運にも見つけることができました。

上野さんのアプローチは、私のアプローチとまったく異なっています。昔に比べれば私も辛抱強くなっているので、同じ課題を上野さんと私がそれぞれどんなふうに解決しているか比較してみようという気になりました。2種類の BASICプログラムの比較です。

なでしこのプログラムとは異なり BASICのプログラムはやたらと長いので、このブログでは取り上げません。どこか他のところで比較をしてみたいと思います。

posted by アキラ at 19:08| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月20日

馬鹿とハサミと機械翻訳

エキサイト等のウェブページ翻訳サービスを利用して、自分のホームページやブログが英語でブラウズできるようにしている人を時々見かけますが、ほとんどの場合、その翻訳は支離滅裂であり、理解不能です。にもかかわらず、ご当人は全世界に向けて発信しているような気になっているので、何とも不憫です。

「馬鹿とハサミは使いよう」と言いますが、機械翻訳のシステムについても同じことが言えそうです。使いようによってはまあまあ役に立つのですが、その使いようをわきまえている人は圧倒的に少数です。

機械翻訳を最も上手に利用するのは、英語が得意で、機械翻訳を必要としていない人です。本当に機械翻訳を必要としている人は、悲しいことに利用法がちゃんとわかっていません。

翻訳システムの非力さ。利用者の認識不足。このようにマイナスとマイナスが重なって、機械翻訳は何とも役立たずな存在になっています。この状況を打開するには、利用者が理解を深める必要があり、システムが柔軟になる必要があります。両方が歩み寄らなければならないのです。大きなシステムがからんでいると、この歩み寄りはなかなか実現しないので、おそらく最初の成功例はパソコン・ベースの機械翻訳だろうと私は見ています。

posted by アキラ at 19:46| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月19日

前処理と2つの辞書

プログラムをできるかぎりシンプルにするために、翻訳する文章に使われている単語だけを集めた臨時の辞書を用意することにしました。元の辞書を大辞典と呼び、臨時の辞書を小辞典と呼ぼうと思います。翻訳する文章を大辞典VortaroJ0と照合することによって小辞典VortaroJ1は自動的に生成されます。大辞典に登録されてない単語が使われているのが見つかれば、ここでプログラムは未登録語の一覧表を吐き出して止まります。

翻訳の本処理にはVortaroJ0は関与しません。必要なデータはすべてVortaroJ1にバトン・タッチしているので、出る幕はないのです。

なでしこ版に取り組む前に作成した BASIC版では、このような前処理は行なっていませんでした。なでしこ版の前処理プログラムを作るのと並行して、BASIC版を作り直したいと思います。

翻訳プログラムでは、文字レベル、単語レベル、句レベル、文レベルといったレベルの間で何度も上のレベルに行ったり、下のレベルに行ったりします。このレベル間の行き来が、なでしこでは段違いに楽に行なえるので、BASIC版を作っていたときには思いつかなかったアイデアをいくつか得ることができました。BASICでは木を見て森が見えなかったのが、なでしこでは森が見えるようになったのです。

posted by アキラ at 18:39| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月18日

今週の目標とトラちゃん95

#1 Mariko iris de Tokio al Sapporo per aeroplano.
#2 Mariko mangxis grandan krabon en Hokajdo.

今週中に、上のようなエスペラント文を下のような英文に翻訳できるようにしたいと思います。

#1 Mariko went from Tokyo to Sapporo by airplane.
#2 Mariko ate a big crab in Hokkaido.

ちなみに「トラちゃん95」の日本語訳は、動詞以降の語を文末から逆向きに訳すことで生成されているようです。「飛行機で札幌へ東京から行った」のような訳を出力するからです。わりとうまい手法ではある(そのアイデアは昔、私も思いついた)のですが、from 〜 to 〜 のような語句が含まれていると少々ボロが出てしまいます。そういう弱点を持たない方式を、私は考え出すつもりです。

さて今日は"Mariko mangxis krabon en Hokajdo."を、下記の辞書データとプログラムで訳してみましょう。

Mariko=真理子は
mangxis=食べた
krabon=蟹を
en=で
Hokajdo=北海道

※ここから下がプログラム
"VortaroJ.txt"を開いて辞書に代入する。
「エスペラント文:」と尋ねる。
単語はそれを" "で区切ったもの。
末尾は単語の要素数−1。
単語[末尾]から1文字右部分が英字か判定。
もし、そうならば
違えば
    単語[末尾]の1文字右端削除。
訳語[0]=辞書@(単語[0])
順番で1から末尾まで繰り返す
    訳語[(末尾−順番+1)]=辞書@(単語[順番])
訳語を""で配列結合して表示する。


posted by アキラ at 11:56| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月17日

とんちで翻訳する

1月15日の「エスペラントは語順が柔軟」で6つの文を話題にしましたが、一休さんをまねて(?)とんちで解決するとこんなぐあいになります。

#1 男が読むんです、本を (Viro legas libron.)
#2 本を読むんです、男が (Libron legas viro.)
#3 男が本を読むんです、 (Viro libron legas.)
#4 本を男が読むんです、 (Libron viro legas.)
#5 読むんです、男が本を (Legas viro libron.)
#6 読むんです、本を男が (Legas libron viro.)

辞書ファイル(VortaroJ.txt)は、やはり単語と訳語を一行に並べて間にイコール(=)を置くという形式ですが、登録内容が少し変わります。

legas=読むんです、
viro=男が
libron=本を
birdo=鳥が
insekton=虫を
kaptas=捕えるんです、
kaptis=捕えたんです、

※ここから下がプログラム
"VortaroJ.txt"を開いて辞書に代入する。
「エスペラント文:」と尋ねる。
単語はそれを" "で区切ったもの。
末尾は単語の要素数−1。
単語[末尾]から1文字右部分が英字か判定。
もし、そうならば
違えば
    単語[末尾]の1文字右端削除。
単語[0]の「[A-Z]」を「[a-z]」へ正規表現入換。
単語[0]はそれ。
順番で0から末尾まで繰り返す
    訳語[順番]=辞書@(単語[順番])
訳語を""で配列結合して表示する。

posted by アキラ at 21:56| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月16日

翻訳プログラムが10行で書ける

日本語プログラミング言語「なでしこ」で翻訳プログラムを書いてみました。10行以内におさめるためにちょっとズルをしていますが、

Birdo kaptas insekton.
→bird catch insect
Birdo kaptis insekton.
→bird caught insect

といった翻訳が可能です。辞書ファイル(VORTARO.TXT)は、単語と訳語を一行に並べて間にイコール(=)を置くという形式です。

birdo=bird
insekto=insect
kaptas=catch
kaptis=caught

※ここから下が「10行の翻訳プログラム」
"VORTARO.TXT"を開いて辞書に代入する。
「エスペラント文:」と尋ねる。
単語はそれを" "で区切ったもの。
末尾は単語の要素数−1。
単語[末尾]の2文字右端削除。
単語[0]の「[A-Z]」を「[a-z]」へ正規表現入換。
単語[0]はそれ。
順番で0から末尾まで繰り返す
    訳語[順番]=辞書@(単語[順番])
訳語を" "で配列結合して表示する。

posted by アキラ at 18:49| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月15日

エスペラントは語順が柔軟

#1 Viro legas libron.
#2 Libron legas viro.
#3 Viro libron legas.
#4 Libron viro legas.
#5 Legas viro libron.
#6 Legas libron viro.

Free Esperanto Course の Lesson 1 で解説されている通り、上記の文は英文の "A man reads a book." に対応するものです。#3と#4は日本語に似た語順(#3は「男が本を読む」で、#4は「本を男が読む」)で、#5はフィリピンのタガログ語に似た語順になっています。

フリーソフトの Esperantilo で英訳してみると#1〜#6の文はどれも"A man reads a book."と翻訳されます。

文中の位置で主語、目的語の判定が行われる英語。主語、目的語の判定は文中の位置とは無関係なエスペラント。

ここで私が選択しなければならないのは、#1のようなパターンのエスペラント文が翻訳できればよしとするか、#1〜#6のすべてのパターンを翻訳できなければならないとするか、です。さあ、どっち?

posted by アキラ at 08:08| Comment(4) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月14日

Free Esperanto Course の「鳥が虫を捕える」

課題1:エスペラント文を英文に翻訳する(例えば"Birdo kaptas insekton."→"A bird catches an insect.")プログラムを作成する。

まず Free Esperanto Course の Lesson 1 で使われているすべてのエスペラント文を英文に翻訳することから始めます。

使用するプログラミング言語はBASICで、BASIC版を完成した後、なでしこ版に取り組むことにします。

WINDOWS95やWINDOWS98のCD-ROMにはQBASICというソフトが付属しており、DOS窓でUSコマンドを実行して英語モードに切り替えれば使うことができました。

そのQBASICと互換性のあるフリーソフトに Tiny Basic for Windows というのがあります。これはQBASICと違って日本語が使えますが、ランダムファイルが利用できないという弱点を持っています。「あちらを立てればこちらが立たず」ですが、当面は問題にならないので、QBASICでも Tiny Basic for Windowsでも動くプログラムという条件で作ることにします。

辞書ファイルは Free Esperanto Courseの Vocabularyのページにあるデータを利用して作成します。

私が作ったプログラムは、現時点では例文を
bird catch insect.
と翻訳します。動詞に3人称単数現在の-esを付け、名詞の前に冠詞の aや anを挿入し、さらに文頭の文字を大文字化する処理がまだ残っています。

ちょっと先回りして日本語への翻訳について考えてみると、語順を操作するという大きな作業があることに気づかされます。逆に言えば、エスペラントと英語との間では語順を変更する必要はほとんどなく、ただ単語を入れ換えていくだけでほぼ翻訳が完了するのだというあっけなさにちょっと驚いてしまうのですが。


posted by アキラ at 18:05| Comment(0) | 日記 | このブログの読者になる | 更新情報をチェックする

2009年01月13日

エスペラント、BASIC、なでしこ

人工言語(計画言語と呼ぶのが正しいようですが)のエスペラント。
いま日本で勉強している人は多少いると思いますが、勉強せずに利用しようという人間はおそらく私だけでしょう。

私の最終目標は、日本語→エスペラント、エスペラント→日本語の翻訳プログラムを完成させることです。基本的に私自身は学習せず、プログラムに学習させて、そのプログラムを私が利用したいと思っています。

欧米の言語をエスペラントに翻訳したり、その逆方向の翻訳をしたりするプログラムは既に作られており、フリーソフトになっているものもあります。私が入手したフリーソフトは英語、ドイツ語、ポーランド語、スウェーデン語とエスペラントとの翻訳が可能なので、例えばエスペラントを経由して日本語からポーランド語に翻訳したり、ポーランド語から日本語に翻訳することができるようにしたいのです。

この長期目標を達成するための短期目標として、エスペラントを英語に翻訳し、英語をエスペラントに翻訳するプログラムにまず取り組もうと考えています。こちらのプログラムの方が段違いにやさしいからです。

プログラムは BASIC と日本語プログラミング言語「なでしこ」で組んでいくつもりです。私は BASIC は熟知していますが、なでしこではプログラミングをした経験が全然ありません。だから、まず BASIC で作ってみて、同じことをなでしこで再現するというスタイルで行きます。

posted by アキラ at 19:36| Comment(5) | 日記 | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

この広告は1年以上新しい記事の投稿がないブログに表示されております。