• 作成:
  • 更新:

DeepLなどに英文を入力する時のために、word wrap的なレイアウトのための改行を消し、本当に改行したそうな場合は残すスクリプト

問題

emacs/etc/NEWS.29 at master · emacs-mirror/emacs のような古式ゆかしいUNIX仕草として、幅を80文字ぐらいに留めておくというものがあります。

その結果、 soft wrapとかword wrapとか言われる、スペースの変わりに改行を挿入することが行われます。英文的には改行もスペースと見做せば意味は変わらないため、これで意味を損なわずに改行が出来るわけですね。

しかし、 DeepLなどの翻訳ツールは改行を一区切りとして認識してしまうことが多いため、そういったものに入力する時に問題となります。

Firefox向けDeepLブラウザ拡張でC-'にショートカットキーを割り当てたかったのですが失敗しました - ncaq で書いたようにFirefox向けのDeepL拡張がリリースされたので、一ヶ月DeepL Proをお試し契約してみることにしました。そこでDeepLを使い倒すための問題は倒してみることにします。

既存の解決策の問題

もちろんこれは認識されていて既存の解決策があります。

ただしこれらはシンプルに全ての改行を消してしまいます。

そうすると1行がとても長くなってしまいます。

それはそれで読みにくいし、元の文章との対応が分かりにくくなってしまうと言った問題があります。

解決実装

なので必要そうな改行は残すスクリプトを書いてみました。

cat NEWS.29.txt|python3 remove_wrapping_newline.py > NEWS.29-1.txt

のような感じで実行してください。

実装は簡単です。改行のみや末尾が単語を構成する文字ではない場合は残すだけです。

このプログラムの課題

元のEmacsのニュースリリースで言うと、

Local variables:
coding: utf-8
mode: outline
mode: emacs-news
paragraph-separate: "[   ^L]"
end:

のように改行を維持するべきな所も問答無用で改行を削除してしまいます。

単純に:を行に含む場合は改行維持という方針もアリですが、その場合は誤爆も多そうで悩みどころです。

それこそ単純な文字列処理じゃなくて文脈を見てくれるGPTのようなものに処理させたいところですが…

TypeScriptで実装するべきでした

何故私が好きでもないPythonで実装しているのかというと、最初はChatGPTのCode Interpreterでテキストを処理して改行を消そうと思ったからです。

なのでその流れでPythonで実装したわけですが、とにかく正規表現で全てを解決しようとして全然要件を満たさなかったり、あまりにもポンコツ過ぎたので、結局自分がほぼゼロから実装することになりました。 ChatGPTくんなんでもPythonと正規表現で解決しようとしてうまく行かないこと多くないですか?

これならTypeScriptで実装するべきでした。そうしたら楽にJavaScriptに変換出来るので、 webブラウザ拡張のSurfingkeysに載せて、 DeepLを開く時に変換出来たりもします。

ローカルで動かす場合でも割とヘビーな文字列処理を行うため、 Rust, D, C++, Haskellあたりで書くべきでしたね。

Emacs Lispで書いてEmacs内部で動かすのも手ですね。

まあ実装はあまり外部ライブラリに頼ってたりしなくて単純なので、そのうちTypeScriptバージョンも書きます。

簡単な実装にならなくなってきてしまいました

最初の実装は本当に簡単なものだったのですが、無意味なスペースを入れたくないなとか、あまり翻訳前処理に関係ないものを入れていったらそこそこ複雑なものになってしまいました。

もっと単純化する余地がありそうですが、これ以上はPythonでやるべきではないですね。

とりあえずGistで開発するのではなくリポジトリで開発して、テストケースで実験するべきです。