研究をぼちぼちやっているぴのです。先日も研究室に向かい、一日中専門書を読んで理解したフリをしていました。あと数回は読むことになりそうです。
研究には論文が付き物ですが、その中でも特に数が多いのが英語で書かれた論文です。管理人も読まなければいけない英語論文がたくさんありますが、管理人は英語が苦手なので最後まで読むのに体力と精神力を9割ほど消費します。日本語の論文でもしんどいのに、英語の論文がしんどくないわけがない。
そんなわけで今回は、英語論文を放り込むとまるっと翻訳して返してくれるプログラムを作りました!これまでチマチマ翻訳機に突っ込んでいた手間が省けるスグレモノです(たぶん)。
英語論文翻訳機
概要
PDF形式の英語論文からテキストを抽出して日本語に翻訳し、テキストファイルとして出力するプログラムです。
開発環境
Google Colaboratory (Python)
ライブラリのインストール
!pip install pdfminer.six #PDF操作
!pip install googletrans #翻訳
!pip install tqdm #進捗表示
ソースコード
テキスト抽出
指定したPDFファイルからテキストデータをまるごと抽出します。
from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter
from pdfminer.converter import TextConverter
from pdfminer.layout import LAParams
from pdfminer.pdfpage import PDFPage
from io import StringIO
def pdf2txt(path):
rsrcmgr = PDFResourceManager()
retstr = StringIO()
laparams = LAParams()
laparams.detect_vertical = True
device = TextConverter(rsrcmgr, retstr, codec='utf-8', laparams=laparams)
with open(path, 'rb') as file:
interpreter = PDFPageInterpreter(rsrcmgr, device)
pagenos=set()
for page in PDFPage.get_pages(file, pagenos, check_extractable=True):
interpreter.process_page(page)
text = retstr.getvalue()
device.close()
retstr.close()
return text
text = pdf2txt('/content/drive/My Drive/deepcs.pdf')
テキスト整形
そのままでは文中の改行文字が残ってうまく翻訳できないので(翻訳機にコピペしたことがある人はわかると思います笑)、問題になりそうな部分の改行を置換します。
また、今回は「REFERENCES(参考文献)」の部分を翻訳対象に入れないので、参照番号([5, 7]等)も正規表現を用いて取り除いています。このあたりは好みで調整しましょう。
import re
text_shaped = text[text.find('ABSTRACT'):text.find('REFERENCES')]
text_shaped = text_shaped.replace("-\n", '').replace(",\n", '')
text_shaped = re.sub("([a-z])(\n)+", r'\1 ', text_shaped)
text_shaped = re.sub("(\n)+([a-z])", r'\2 ', text_shaped)
text_shaped = re.sub(" \[(\d+, )*\d+\]", '', text_shaped)
翻訳
整形したテキストデータを日本語に翻訳します。
途中でテキストをリストに変換したり処理ごとに0.5秒停止したりしているのは、文字数制限やアクセス制限を回避するためです。googletransはそもそも公式のものではないので、そのあたりが面倒なら「Google Translate API (公式)」や「DeepL API」などを使いましょう(有料)。
from googletrans import Translator
import time
from tqdm import tqdm
BLOCK_SIZE = 10
TRANS_TERM = 0.5
translator = Translator()
text_listed = text_shaped.split("\n")
text_blocked = []
result = ''
for i in range(len(text_listed)):
if i % BLOCK_SIZE == 0:
text_blocked.append(text_listed[int(i/BLOCK_SIZE)] + "\n")
else:
line = text_listed[i] + "\n"
text_blocked[int(i/BLOCK_SIZE)] += line
for block in tqdm(text_blocked):
trans = translator.translate(block, dest='ja')
result += trans.text
time.sleep(TRANS_TERM)
print(result)
出力
翻訳結果をテキストファイルとして出力します。
with open('/content/drive/My Drive/result.txt', 'w') as file:
file.write(result)
動作例
終わりに
これまで英語論文は(翻訳機を使いながら)何個か読みましたが、翻訳機に改行されたまま入ってしまって正しく翻訳できず手作業で改行を消すという大変手間がかかることをしていました。その手間が面倒だと感じたので、今回のようなプログラムを作ろうという発想に至りました。とりあえず改善点としては以下の点があげられると思います。
- 表や欄外のテキストまで抽出してしまう点
- 改行の置換にいくつか見落としがある点
また、今回の翻訳機もできればホームページに埋め込んでみたいと考えていますが、前回のように苦渋を味わうことになる可能性もあるので実装できるかは不明です。【2020/08/06追記】ホームページに埋め込みました。
そういうわけで翻訳機も完成したので、今から論文を読んでいきたいと思います^^
コメント