みなさん,こんにちは。
シンノユウキ(shinno1993)です。
学術論文を読む上での(私の中での)最大のハードルは英語です。
この時代ですので,積極的に機械翻訳に頼りたいところですが,そこでも問題となるのがPDFの改行問題。
これを解消するツールをPythonで作りましたので紹介します。
機械翻訳と改行問題
私は英語を(ほとんど)諦めています。勉強大変だし,機械翻訳もだいぶ発達してきたしで,頑張って勉強するメリットをそこまで見いだせずにいます。特段,英語でコミュニケーションをとりたいわけでもないですし,英語を使うとしたら技術文書か学術論文を読むくらいなので,まぁ機械翻訳でもいいかなと思ってます。頑張らなきゃいけないところをしっかりと自分で読めば,まぁいいかなと思っています。技術文書や学術論文は,機械翻訳で正しく訳せるくらいの英語で書いてほしいと願っています。
さて,機械翻訳はDeepLが現時点では優勢です。かなり自然に訳してくれます(自然すぎて誤訳にも気づかないほど)。専門用語も結構訳してくれるので,ざっと意味を取りたい場面では十分に実用に耐えると思っています。デスクトップ向けのアプリもありますし,かなり利用しやすいです。
ただし,PDFの文書を翻訳する際には一工夫が必要になります。HTMLの文書であればそのままコピーでOKなのですが,PDFの文書をそのままコピー・ペーストすると,PDF内での改行をそのまま拾ってしまうため,意図しない場面に改行コードが入ってしまいます。全部HTMLで公開してくれーと思うのですが,なぜか読みたいものに限ってPDFだったりします。そのため,最低でも改行コードを一斉に削除するくらいのことをしないと,実用的な翻訳は不可能です。
DeepLを使用する場合,Webフォームにテキストをコピー・ペーストすることで改行を削除したテキストを生成してくれる「Shaper」というWebアプリが使われる場面が多いようです。
便利だな~と思っていましたが,1回別の場所にコピーするのは面倒だなと感じましたので,クリップボードに保存されたテキストから直接改行を取り除けるツールを作ることとしました。下記で紹介します。
コードと実際の動き
こちらのツールはPythonを使用して作成しました。最終的にPyinstallerを使ってEXE化した上で利用しています。下記のコードとなりました:
import pyperclip
import time
print("クリップボード操作中...")
print("クリップボードの文字列に含まれる改行コードを半角スペースに置換します")
print("終了する場合は,このテキストが表示されているコンソールを閉じてください")
while True:
clip = pyperclip.paste()
s = (' '.join(clip.splitlines()))
pyperclip.copy(s)
time.sleep(0.3)
上のほうでprintしているテキストはEXE化した時の説明用の文書ですね。Pythonでそのまま使う場合はなくても良いでしょう。
クリップボードの操作には,pyperclipを使用しています。Windowsでは上記のコードで問題ありませんが,MACの場合はちょっと修正が必要かもです。
さて,実際の処理はwhile以下でやってます:
- clip = pyperclip.paste() :クリップボードの文字列を取得
- s = (' '.join(clip.splitlines())):改行コードをすべて半角スペースに置換
- pyperclip.copy(s):クリップボードに保存
- time.sleep(0.3):次のループまでの待ち時間
while True: でループしてるので,Pythonを終了させない限りずっとループし続けます。なんだかスマートでないなという場合は別の手を使っても良いかもですね。
開始するためにはPythonでコードを実行するかEXE化した場合はEXEファイルを実行すればOKです。終了するためには,Pythonを終了するか,EXE化した場合は,コンソールを閉じればOKです。特定の文字列がクリップボードに保存される(例:“Finish”をコピーした際など)にbreakするとかでも良いかもですね。
実際には下記のように動きます:
まとめと補足
今回はPythonでクリップボードを操作し,コピーした文字列から改行を削除するツールを紹介しました。
本当はEXE化して配布とかしたかったのですが,普通にウイルス扱いされるので断念しました。いらぬ誤解も与えたくないですしね。
というわけで,Pythonを使える方は上記を使ってみてください。使えない方は使えるようになってみましょう。