概要
最新のAI技術の動向をキャッチアップするためには英語論文から情報を得ることは避けて通れません。しかし、英語で数10ページの文章を読むのはいささか骨が折れます。AbstractとConclusionだけなら何とか英語のまま読むとして、本文を全部は読まないにしてもIntroducitonやRelated Work、Discussionなどを全部英語で読み通し、なおかつ数も熟す。。。今の筆者には到底不可能な離れ業です。そこで、徐々にそうなるために訓練をするとして、まずは英語論文を継続的に読む習慣をつけることにしました。昨今はGoogle翻訳やDeepL翻訳など機械翻訳アプリケーションの性能も一昔前とは比べ物になりません。しかも、DeepL翻訳はAPIが公開されており、一部文字数などに制限が有りますが、無料で利用出来ます。論文PDFを渡してスクリプトを実行したら翻訳付きPDFが出力されるツールを作るのも一興と思い、その前準備としてPythonからPDFを読み込むためのライブラリpypdfを使ってみることにしました。
環境構築
今回は以下の環境を用いました。
- macOS Sonoma 14.5
- Python 3.10.7
- notebook(旧Jupyter Notebook) 7.2.1
- pypdf 4.2.0
実際にPDFを読み込んでみる
Notebook上でpypdfを実行してPDFを読み込んでみることにします。事前に読み込むPDFファイルを用意しておきます。筆者は以下の英語論文を読み込んでみることにしました。
公式ドキュメントの以下のページを参考にPDFを読み込んでみます。
以下のコードをNotebook上で実行しました。全ページのテキストを抽出すると途轍もない分量になるので1ページのみ抽出します。
from pypdf import PdfReader
reader = PdfReader("pdf/Transformers_are_SSMs.pdf")
pages = reader.pages
# 全ページのテキストを抽出する場合、以下のfor文を実行
# for i, page in enumerate(pages):
# print(f"Page {i+1}")
# print(page.extract_text())
print(pages[0].extract_text())
正しく1ページ目のテキストが抽出されています。
続けて、レイアウトモードでテキストを抽出してみます。extract_text()ファンクションに引数extraction_mode="layout"を与えるだけです。
print(pages[0].extract_text(extraction_mode="layout"))
縦方向の余分な空白を削除して表示してみます。
print(pages[0].extract_text(extraction_mode="layout", layout_mode_space_vertically=False))
最終的にDeepL翻訳に投げることを考えると、レイアウトモードでの抽出は適さないと考えました。(因みに、レイアウトモードでのRotated text discovered. Output will be incomplete.
という警告は、論文の左端に回転文字の透かしが入っているのが抽出出来なかったことから出ている様です。)ここで、縦方向の余分な空白のみ削除して抽出してみることにしました。
print(pages[0].extract_text(layout_mode_space_vertically=False))
これでテキストの抽出及び余分な空白の削除に成功しました。最終行の1arXiv:...
の部分が回転文字透かしの部分です。これは不要なので最終的には取り除きたいですが、今回のテストではそのままにしておきます。
まとめ
無事に英語論文PDFからテキストの抽出に成功しました。抽出したテキストからDeepL翻訳に投げるべきテキストの選択は正規表現などを用いることで指定出来るだろうと考えています。今回は検証しませんでしが、追加の機能をpypdfにインストールすることで、図の抽出なども出来る様になります。
Reference