豪鬼メモ

一瞬千撃

私のブロンプトン総集編

ブロンプトンを8年間乗ってきた感想と、ここ1年ほどでカスタマイズしてきた内容を総集編的にまとめてみる。所有感や美観よりも実用重視でカスタマイズしたので、走れる使えるブロンプトンを手に入れたい人は参考になるかと思う。

続きを読む

対訳電子書籍その3: Kindle用のmobiファイルを作る

前回までの議論で、文分割された原文の書籍の各文に対して対訳を生成したファイルを作る方法が整った。今回はそれを使ってKindle用のmobiファイルを作る。本文の読解に集中できるようにするために、ちょっとした工夫を要した。

続きを読む

対訳電子書籍その2: 小説の全文を機械翻訳にかける

任意の英文から、その文毎の対訳を収録した電子書籍を作る計画の概要を前回書いた。英文を文毎に分割する仕組みは既にできたので、今回は文毎の対訳を作ってみる。といっても、機械翻訳APIに原文を投げて、結果を収録するだけだ。

続きを読む

対訳電子書籍その1: ChatGPTに英文の文分割をさせる

任意の英語の文章から対訳の電子書籍を生成するシステムを作ってみることにした。その最初の段階として、任意の英語の文章から文のリストを作る必要がある。LLMには初歩的なタスクなので、ChatGPTを回して遂行した。

      • -

日本のラノベの英訳本を読むという迂遠な英語学習法を実践している私だが、元来の英文も読むべきなので、とりあえずタダで読める文学作品から読み始めている。しかし、やはり難しく感じる。文学作品は語彙が高難度で倒置やら省略やら比喩やらが多いのがひとつ、私は英語文化圏の常識を持たないので文脈による類推が利きにくいというのがひとつ、古い話だし外国の話だしで登場人物に共感しづらいというのがひとつだ。でも、何事も、面白く感じるまでは時間がかかるものだし、ちょっと頑張ってみよう。アンとかトムとか子供も読めるものから始めれば何とかなる。たまに出てくる未知語は統合英和辞書で調べればいいし、それも面倒な時は未知語アノテーションシステムに投げることもできるので、読み進めることは可能だ。Kindleならポップアップで辞書検索できるし、紙の本を読んでいる時にも、スマホのデスクトップに辞書のブックマークを作っておけばすぐ調べられる。だだし、辞書引きだと限界があり、句動詞や熟語などの理解が難しかったり時間がかかったりすることがある。対訳コーパスだったら対訳文を見れば一発なのだが、残念ながらそれは存在しない。著名な作品は和訳本があるが、それは文とその対訳の対応関係が取れているわけじゃない。原文と和訳の二つの本を開きながら読解を進めるという手もあるが、面倒すぎる。なので、自分で作ってしまうことにした。

大意がわかればいいので、和訳の方は機械翻訳の結果で十分だ。近年の機械翻訳の発達ぶりは凄まじく、言い回しが不自然なことはあっても、支離滅裂な訳を生成することは稀だ。ならば、原文を文に分割した上で、文ごとに機械翻訳にかければ、実用的な対訳本を作ることができるだろう。文ごとに翻訳するよりは文章単位やパラグラフ単位で翻訳した方がコンテキストが反映できて翻訳精度が上がる可能性はあるが、その結果から文のペアのアラインメントを抽出するのが手間だし、文が結合されたり分割されたり入れ替えられたりした場合の対処が厄介なので、文ごとに処理した方が楽だ。それに、あくまで和訳は原文の理解の参考にするだけなので、コンテキストを反映した流暢な言い回しをしてくれるよりは、文毎に焦点を当てた直訳調の結果の方が望ましいことも多い。いずれにせよ、翻訳をどうやるかは別の機会に回そう。

英文読解では、基本的には英文だけを読みたい。知らないと意味が通らない未知語だけは辞書で調べて読み進め、対訳には頼らないでテンポよく読んでいきたい。しかし、つまづいた時には気軽に対訳を見て、不可解なフレーズの意味を把握したい。私が好きなタイプの単語帳はそれを可能にする対訳付きのものだ。同じようなことを、任意の英文小説でできたら幸せだろう。ところで、原文と対訳が別ページに書いてあるものだと、原文の文章内のとある文に対応する訳文を対訳の文章内から探すのに時間がかかる。なので、できれば原文の文とその訳文が一対一で対応していると助かる。以下のような構造だ。

With this Mrs. Rachel stepped out of the lane into the backyard of Green Gables.
    (レイチェル夫人が小径から出てグリーンゲイブルズの裏庭に入った)
Very green and neat and precise was that yard, set about on one side with great patriarchal willows and the other with prim Lombardies.
    (その庭は緑が多くて、きちんとしていて、几帳面であり、立派な柳が片方に、もう一方には上品な西洋柳が植えられていた)
Not a stray stick nor stone was to be seen, for Mrs. Rachel would have seen it if there had been.
    (もしあればレイチェル夫人が見逃すはずもないが、散らばった小枝や小石の一つも見当たらなかった)
Privately she was of the opinion that Marilla Cuthbert swept that yard over as often as she swept her house.
    (彼女が内心思ったのは、彼女が家を掃除するような頻度で、マシュー・クスバートが庭中を掃除したということだ)
One could have eaten a meal off the ground without over-brimming the proverbial peck of dirt.
    (諺にあるのようなほんのわずかな土を避けつつ、地面から食事をとることができたくらいだ)

最後の文など、直訳されても意味がよくわからないが、意味不明な事が分かれば十分とも言える。諺を引用した比喩表現だとわかれば、読み飛ばしてしまっても読解に支障はなく、機械でも翻訳できないなら仕方ないと割り切れる。ちなみに、落ちた食べ物を三秒ルール的に食べる時に「a peck of dirt」(ひとつつきの泥)がついているという慣用表現を使うらしく、この文は「それさえつかないほど地面が綺麗だ」と言いたいらしい。

話を戻すと、原文が読解できなかった場合にのみ訳文を見たい。よって、何らかの操作で原文の個別の文を選択した際にのみその訳文が表示されるのが望ましい。それが不可能な場合、訳文は目立たないように小さく併記されているのが望ましい。HTMLの場合、ポインタが文の上にあるhover状態でポップアップを出すとかが考えられる。hoverだとスマホタブレットで操作しずらいので、各文の末尾に「†」みたいなマークをつけておいてそれをクリックしたら和訳が挿入されるとかでもいいだろう。Kindleなどの電子書籍リーダだと対話的な操作ができないので、文ごとに改行して表示するとともに、和訳はフォントを小さくしたり色を薄くしたりして表現することになるだろう。いずれにせよ、表示をどうするかは別の機会に回そう。

今回まず決めておきたいのは、翻訳の方法でもなく、表示の方法でもなく、データ形式である。英文の小説の原文の構造をある表現しつつ、各文に対応した和訳文も表現できるようなデータ形式だ。機械が処理しやすい形式でありつつ、そのデータを人間が読んでも読みやすいようにしたい。よって、XMLでもYAMLでもJSONでもなく、Markdown的な記法を採用する。以下のような感じだ。

# ANNE OF GREEN GABLES
%% グリーンゲーブルズのアン

## Chapter I: Mrs. Rachel Lynde is Surprised
%% 第一章: レイチェル・リンド夫人は驚かされる

MRS. Rachel Lynde lived just where the Avonlea main road dipped down into a little hollow, fringed with alders and ladies’ eardrops and traversed by a brook that had its source away back in the woods of the old Cuthbert place;
%% レイチェル・リンド夫人は、アヴォンリーの幹線道路が少しくぼみに落ち込んだところに住んでいて、ハンノキとミミズミに縁取られ、カスバートの古い場所の森の奥に源を発する小川が流れていた。
it was reputed to be an intricate, headlong brook in its earlier course through those woods, with dark secrets of pool and cascade;
%% この川は、森の中を流れる最初のコースでは、プールと滝の暗い秘密を備えた、複雑で真っ直ぐに流れる小川であると評判でした。
but by the time it reached Lynde’s Hollow it was a quiet, well-conducted little stream, for not even a brook could run past Mrs. Rachel Lynde’s door without due regard for decency and decorum;
%% しかし、リンドズ・ホローに到着する頃には、それは静かでよく流れた小さな川になっていた。礼儀と礼儀を無視して、小川ですらレイチェル・リンド夫人の家のドアを通過することはできなかったからである。
it probably was conscious that Mrs. Rachel was sitting at her window, keeping a sharp eye on everything that passed, from brooks and children up, and that if she noticed anything odd or out of place she would never rest until she had ferreted out the whys and wherefores thereof.
%% おそらく、レイチェル夫人が窓辺に座って、小川や子供たちに至るまで、通り過ぎるすべてのものに鋭い目を光らせており、何か奇妙なことや場違いなことに気づいたら、その理由や場所を見つけるまで決して休まないことを意識していたのでしょう。

There are plenty of people in Avonlea and out of it, who can attend closely to their neighbor’s business by dint of neglecting their own;
%% アボンリーにもアボンリー以外にも、自分のことは無視しても隣人の仕事にはしっかりと取り組むことができる人がたくさんいます。
but Mrs. Rachel Lynde was one of those capable creatures who can manage their own concerns and those of other folks into the bargain.
%% しかし、レイチェル・リンド夫人は、自分自身の懸念と他の人々の懸念を取引にうまく対処できる有能な生き物の一人でした。

見出し1#、見出し2は##、見出し3は###といった感じにする。それ以外の特殊記法は使わない。各文は改行で区切り、段落区切りは空行で示す。段落内の強制改行は許さない。%%は今回の独自仕様で、直上の文の和訳を示す。よって、%%で始まる行をgrep -vで削除すれば、markdownの文書として処理できることになる。適当なプログラムを書けば、Webブラウザ用のHTMLを生成できるし、Kindle用のEPUBモドキのデータを生成できる。

さて、gutenberg.orgにてプレーンテキストやHTMLのデータは手に入るのだが、文区切りのデータはない。ピリオドで単純に区切るわけにはいかない。Mr.やMrs.などのピリオドは無視すべきだし、文内の引用文にあるピリオドも無視すべきだし、文区切りのセミコロンも処理しないといけない。ルールベースのプログラムを書いてもいいのだが、面倒なのでChatGPTにやらせようというのが今回の肝だ。それにあたって、見出しに#や##をつけて、段落は全て単一の行にまとめ、段落を改行で区切ったテキストを準備する。それを入力すると、各見出しや段落に対してChatGPTを呼んで、文分割した結果を出力させる。文分割したデータがあれば、あとはChatGPTなりGeminiなりDeepLなりGoogle翻訳なりを呼んで、各文の和訳を生成できる。各文の和訳は上記の仕様に基づいて各文の次の行に%%をつけて挿入すれば、対訳文データの完成だ。

LLMに与えるプロンプトは、例によって、冒頭の指示とfew-shotの提示という形式を取る。具体的には以下のものだ。引用符内の文の扱いやセミコロンの扱いはfew-shotで例示するだけで、よしなにやってくれるのがLLMの凄いところだ。

Segment the given paragraph into sentences.

Paragraph: I live with Mr. Tanaka and Mrs. Johnson in Calif. U.S. They are so kind! I love them.
Sentence 1: I live with Mr. Tanaka and Mrs. Johnson in Calif. U.S.
Sentence 2: They are so kind!
Sentence 3: I love them.

Paragraph: He said "I love you. Forever." Thus, I trust him; To the end of my life.
Sentence 1: He said "I love you. Forever.
Sentence 2: Thus, I trust him;
Sentence 2: To the end of my life.

Paragraph: "Do you know him?" "No. I don't.
Sentence 1: "Do you know him?
Sentence 2: "No. I don't.

Paragraph: Apples are fluits; Fluits include apples. Boys, each one is OK.
Sentence 1: Apples are fluits;
Sentence 2: Fluits include apples.
Sentence 3: Boys, each one is OK.

Paragraph: “The Miracle happend. I must say; It was almost impossible!” He swore it.
Sentence 1: “The Miracle happend.
Sentence 2: I must say;
Sentence 3: It was almost impossible!”
Sentence 4: He swore it.”

Paragraph: “Good evening, Rachel,” Marilla said briskly. “This is a real fine evening, isn’t it? Won’t you sit down? How are all your folks?”
Sentence 1: “Good evening, Rachel,” Marilla said briskly.
Sentence 2: “This is a real fine evening, isn’t it?
Sentence 3: Won’t you sit down?
Sentence 4: How are all your folks?”

Paragraph: Hello, Nancy. How are you? Do you have any spare batteries?

出力はこんな感じになる。これを後処理で文のリストに直せば完成だ。

Sentence 1: Hello, Nancy.
Sentence 2: How are you?
Sentence 3: Do you have any spare batteries?

ざっと結果を見たところ、分割の精度は98%、再現率は95%くらいといったところか。過度に分割する例は少なく、分割すべきところでしていない例は、そこそこ多い。たまに、なぜかカンマで分割したり、セミコロンで分割しなかったりということがある。こういった典型的なエラーはルールベースの後処理で対処すればいい。後処理を経れば、ほとんどエラーのない状態になる。文分割されているだけで元々のレイアウトより読みやすく感じるのは、私がラノベ脳もしくは携帯小説脳だからかな。

アンシリーズ全8冊とホームズシリーズ5冊とトムソーヤシリーズ2冊とアリスシリーズ2冊と、その他いくつか読みやすそうな作品の分割結果をこちらに置いておく(ファイル名に-segmentedがついているもの)。これらを適当な翻訳サービスに投げれば、文単位の対訳が生成でき、それをまとめれば対訳電子書籍が作れるはずだ。これだけ読めばそこそこ英語も上達するはずだ。翻訳の手順を分離したのは、任意の翻訳機を試し分けたり、人間の翻訳結果で代替したりできるようにするためだ。一方で、各種データ形式の原文データから今回の入力形式に変換する作業は意外に手間で、残念ながら自動化できない。特にヘッダの抽出が面倒だ。なので、この20冊で公開用のは打ち止めだ。このデータに後工程の処理を施して、実際の電子書的の使用感を確かめることにする。

余談だが、別の案として、原文と翻訳書を両方読み込んでから各文のアラインメントを取るというのも考えた。双方のデータさえあれば、既存のツールにかけるだけでできる。しかし、原文は著作権が切れていても翻訳の方はそうでないことが多いので、任意に処理できるデータが手に入らないのが問題だ。自分で使うだけなら、スキャンやスクショにOCRかけるなりDRMを解除するなりの手段を取っても合法なのだが、それもかなり面倒くさい。それよりは、原文に機械翻訳をかける方が簡単確実だ。原文だけなら、トゥエインやらクリスティやらドイルやらヘミングウェイの古典なら簡単に入手できる。あとはそれを機械翻訳にかければ、自分でも使えるし、再配布可能なデータになる。私は自炊した英語版ラノベのデータを持っているので、それをこのシステムにかけて個人的に楽しもうと思っている。あと、今さらながらハリーポッターも読む。

Webページであれば、選択した文の機械翻訳の結果をポップアップで表示する機能は既にある。Google翻訳やDeepL翻訳のChrome拡張を使うのが最も簡単だ。自作のポップアップ辞書Chrome拡張を使った方が勉強にはなるのだが、時短が優先であれば翻訳した方が早い場合も多い。内容理解だけが目的であればページ全体を翻訳するという手もあるのだが、やっぱり原文を中心に読み進めたいと思うのは学習者の性だ。

Webページのポップアップ翻訳で今さら似たようなものを作っても仕方がないので、私は電子書籍の方に焦点を当てよう。具体的に言えば、Kindle版を作りたい。KindleでもポップアップでBing翻訳の結果を出す機能はあるのだが、操作感が悪過ぎて使えない。それよりは、文毎に対訳が併記してある方が使いやすい。それに、Webページじゃ気が散るからだめなのだ。読書はやはり専用の電子書籍リーダでないと集中できない。対訳英文小説だけを何冊か入れたKindleだけを持ってお出かけして、川辺や海辺や焚き火の炉端で読書に耽りたい。

まとめ。英語の小説とその文毎の対訳を収録した電子書籍を作るにあたり、まずは英文の文分割をして適当なフォーマットで保存する作業を行った。ChatGPTによる文分割はfew-shotで例を指示すれば簡単にでき、十分な結果が得られている。

ブロンプトンのスタンドをアクリル棒で作る

ブロンプトンのキックスタンドの代用をアクリル棒で作ってみた。要は、ロード乗りにはお馴染みの「めだたんぼー」を自作するという話だ。以下の写真を見るとスタンド無しに自立しているようにも見えるが、よく見ると透明のアクリル棒がクランクアーム付近を支えている。これはブロンプトン以外の自転車でも使える。500円の出費かつ14.4gの重量増加で済むので、最安かつ最軽量の解決策だと思う。

続きを読む

ChatGPTに英語の共起語のリストを生成させる

統合英和辞書には各見出し語の典型的な共起語のリストを収録しているが、その生成をChatGPTにやらせてみた。結構まともな結果が得られ、類語検索や連想単語帳の精度が上がった。さらに、例文を選択する際にその共起語を含むものを優先することで、より典型的な例文を提示できるようにした。

続きを読む

フラットペダルのグリップ向上策の三度目

MKSのUrban Platformのグリップが弱すぎる問題に対するDYIの対策をさらにやってみた。ハーフクリップとこのグリップを組み合わせると、ストラップをつけなくてもかなり強力に引き足ができるようになる。

続きを読む

ブロンプトンのリムテープをポリエステル製にした

ブロンプトンのチューブが何度も内部破裂するのを経験していて、それはリムテープが原因であることはわかっていたので、頑丈なポリエステル製のものに換装した。コスパもいいし、丈夫だし、軽量化できるので、おすすめだ。

続きを読む

ブロンプトンのシートポストをカーボン製に換装

ブロンプトンのシートポストをカーボン製のものに換装して、274gの軽量化を果たした。乗り味は実際のところ大して変わらないが、理論上は、より軽い力で走れるようになって、衝撃吸収性も少しよくなっているはずだ。そして、シート高の調整目盛りがついたのがめっちゃ便利だ。ついでに、シートスリーブを付け直して、ラッカーで被覆して、シートポストがずれたり摩耗したりしにくいように調整した。

続きを読む

ブロンプトンにディズナのチェーンガードを装着

ブロンプトンにディズナのチェーンガードを装着して、スボンの裾汚れを防止するとともに、チェーン外れを防止した。若干の重量増加は欠点だが、利便性の向上は確かなものだ。

続きを読む