K_DM Book
用語集
対象者 標準
対象者別の入口 →

対象者の設定はこのブラウザの中にだけ保存されます。

言語 JA

deeplで論文を翻訳

01.6.1

deeplで論文を翻訳

最終更新 2020-01-29 読了時間 3 分
まとめ
このページでは、arXiv の論文 ID「1706.03762」(Vaswani et al. の “Attention Is All You Need”)を arxiv.Search でダウンロードし、PyMuPDF(fitz)で 1 ページ目のテキストを取り出して、“Abstract” と “Introduction” の文字位置を手がかりに概要だけを切り出し、deepl.Translator.translate_text(source_lang="EN", target_lang="JA") で日本語にします。コードは 5 ブロックで、「取得 → テキスト抽出 → 必要部分の切り出し → API 翻訳」の順に進みます。読み終えると、text.find による位置指定がどこで効いているか、認証キーを os.getenv("DEEPL_AUTH_KEY") で環境変数から読む理由を説明できるようになります。

arXivから論文を取得する #

次の論文を arXiv からダウンロードして、概要(Abstract)を翻訳します。断りがない限り、コード中に出現する英文はこの論文の Abstract の一部です。

Vaswani, Ashish, et al. “Attention is all you need.” Advances in neural information processing systems 30 (2017).

最初のブロックは、論文 ID を指定して arXiv のメタデータ(タイトルなど)を取ってきます。

1
2
3
4
5
import arxiv

search = arxiv.Search(id_list=["1706.03762"])
paper = next(search.results())
print(f"論文タイトル:{paper.title}")
論文タイトル:Attention Is All You Need

次のブロックで PDF 本体をカレントディレクトリに保存します。

1
2
pdf_path = paper.download_pdf()
print(f"pdf保存先:{pdf_path}")
pdf保存先:./1706.03762v5.Attention_Is_All_You_Need.pdf

pdfからテキストを抽出する #

次のブロックは PyMuPDF(fitz)で 1 ページ目のテキストを取り出し、“Abstract” の直後から “Introduction” の直前までを概要として切り出します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import fitz

abstract_text = ""
with fitz.open(pdf_path) as pages:
    first_page = pages[0]
    text = first_page.get_text().replace("\n", "")
    print(f'アブスト開始位置:{text.find("Abstract")}, イントロ開始位置:{text.find("Introduction")}')
    abstract_text = text[text.find("Abstract") + 8 : text.find("Introduction") - 1]

print(f"{abstract_text[:400]}...")
アブスト開始位置:394, イントロ開始位置:1528
The dominant sequence transduction models are based on complex recurrent orconvolutional neural networks that include an encoder and a decoder. The bestperforming models also connect the encoder and decoder through an attentionmechanism. We propose a new simple network architecture, the Transformer,based solely on attention mechanisms, dispensing with recurrence and convolutionsentirely. Experimen...

deepl-pythonを使って英語を翻訳する #

次のブロックは DeepL の公式クライアント deepl で翻訳器を作り、短い英文で API が動くことを確かめます。

1
2
3
4
5
6
import deepl
import os

translator = deepl.Translator(os.getenv("DEEPL_AUTH_KEY"))
result = translator.translate_text("Good morning!", source_lang="EN", target_lang="JA")
print(result)
おはようございます。

最後のブロックで、切り出した Abstract を同じ翻訳器に渡します。

1
2
result = translator.translate_text(abstract_text, source_lang="EN", target_lang="JA")
print(result)
優性配列変換モデルは、エンコーダとデコーダを含む複雑なリカレントニューラルネットワークまたは畳み込みニューラルネットワークをベースにしています。また、最も優れたモデルでは、エンコーダとデコーダをアテンションメカニズムで接続しています。本研究では、再帰や畳み込みを必要とせず、注目メカニズムのみに基づいた新しいシンプルなネットワークアーキテクチャ「Transformer」を提案する。2つの機械翻訳タスクを用いた実験では、これらのモデルが優れた品質を持ち、並列化が可能で学習時間が大幅に短縮されることが示された。WMT 2014の英独翻訳タスクにおいて、我々のモデルは28.4 BLEUを達成し、アセンブルを含む既存の最良の結果よりも2 BLEU以上向上した。WMT 2014の英仏翻訳タスクでは、8つのGPUを用いて3.5日間の学習を行った結果、41.8という最新のBLEUスコアを達成しましたが、これは文献に掲載されている最高のモデルの学習コストのごく一部です。また、大規模および限定的な学習データを用いた英語の構文解析に適用することで、Transformerが他のタスクにもよく適応することを示しました。

使いどころと落とし穴 #

find("Abstract") による切り出しは 1 段組みで見出しが “Abstract” と書かれた論文を前提にしているので、2 段組みや “ABSTRACT” と大文字の論文では位置が −1 になり、スライスが空文字列になります。text.lower().find("abstract") のように大文字小文字を揃えるか、re.search(r"abstract", text, re.I) を使うと取りこぼしが減ります。翻訳 API は文字数で課金されるため、全文ではなく Abstract だけを送る今回の構成は料金の面でも理にかなっています。DEEPL_AUTH_KEY のような秘密情報は .env ファイルと python-dotenv で管理し、リポジトリには含めないでください。