質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

Q&A

2回答

2762閲覧

python pdfデータの英語論文 自動翻訳

MONO3648

総合スコア0

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

自然言語処理

自然言語処理は、日常的に使用される自然言語をコンピューターに処理させる技術やソフトウェアの総称です。

0グッド

0クリップ

投稿2021/07/08 00:34

前提・実現したいこと

英語論文のpdfデータを日本語に自動翻訳するプログラムをpythonで行いたいと考えています。
Google翻訳とPythonを使ってPDF論文を一発で翻訳する こちらの方が既に作成してくださったソースコードをそのまま用いた形になります。

まだpythonを始めたばかりで、エラーの内容やpythonの構造に関して知識も浅く、自らで調べても原因が分かりませんでした。
もしよろしければご教示願います。

発生している問題・エラーメッセージ

error: the following arguments are required: -input

該当のソースコード

python

1import argparse 2import requests 3from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter 4from pdfminer.converter import TextConverter 5from pdfminer.layout import LAParams 6from pdfminer.pdfpage import PDFPage 7from io import StringIO 8import re 9import os 10 11 12def is_float(n): 13 try: 14 float(n) 15 except ValueError: 16 return False 17 else: 18 return True 19 20 21def get_text_from_pdf(pdfname, limit=1000): 22 # PDFファイル名が未指定の場合は、空文字列を返して終了 23 if (pdfname == ''): 24 return '' 25 else: 26 # 処理するPDFファイルを開く/開けなければ 27 try: 28 fp = open(pdfname, 'rb') 29 except: 30 return '' 31 32 # PDFからテキストの抽出 33 rsrcmgr = PDFResourceManager() 34 out_fp = StringIO() 35 la_params = LAParams() 36 la_params.detect_vertical = True 37 device = TextConverter(rsrcmgr, out_fp, codec='utf-8', laparams=la_params) 38 interpreter = PDFPageInterpreter(rsrcmgr, device) 39 for page in PDFPage.get_pages(fp, pagenos=None, maxpages=0, password=None, caching=True, check_extractable=True): 40 interpreter.process_page(page) 41 text = out_fp.getvalue() 42 fp.close() 43 device.close() 44 out_fp.close() 45 46 # 改行で分割する 47 lines = text.splitlines() 48 49 outputs = [] 50 output = '' 51 52 # 除去するutf8文字 53 replace_strs = [b'\x00'] 54 55 is_blank_line = False 56 57 # 分割した行でループ 58 for line in lines: 59 60 # byte文字列に変換 61 line_utf8 = line.encode('utf-8') 62 63 # 余分な文字を除去する 64 for replace_str in replace_strs: 65 line_utf8 = line_utf8.replace(replace_str, b'') 66 67 # strに戻す 68 line = line_utf8.decode() 69 70 # 連続する空白を一つにする 71 line = re.sub("[ ]+", " ", line) 72 73 # 前後の空白を除く 74 line = line.strip() 75 #print("aft:[" + line + "]") 76 77 # 空行は無視 78 if len(line) == 0: 79 is_blank_line = True 80 continue 81 82 # 数字だけの行は無視 83 if is_float(line): 84 continue 85 86 # 1単語しかなく、末尾がピリオドで終わらないものは無視 87 if line.split(" ").count == 1 and not line.endswith("."): 88 continue 89 90 # 文章の切れ目の場合 91 if is_blank_line or output.endswith("."): 92 # 文字数がlimitを超えていたらここで一旦区切る 93 if(len(output) > limit): 94 outputs.append(output) 95 output = "" 96 else: 97 output += "\r\n" 98 #前の行からの続きの場合 99 elif not is_blank_line and output.endswith("-"): 100 output = output[:-1] 101 #それ以外の場合は、単語の切れ目として半角空白を入れる 102 else: 103 output += " " 104 105 #print("[" + str(line) + "]") 106 output += str(line) 107 is_blank_line = False 108 109 outputs.append(output) 110 return outputs 111 112 113def translate(input): 114 api_url = "https://script.google.com/macros/s/*******************/exec" 115 params = { 116 'text': "\"" + input + "\"", 117 'source': 'en', 118 'target': 'ja' 119 } 120 121 #print(params) 122 r_post = requests.post(api_url, data=params) 123 return r_post.json()["text"] 124 125def main(): 126 127 parser = argparse.ArgumentParser() 128 parser.add_argument('-input', type=str, required=True) 129 parser.add_argument('-limit', type=int, default=1000) 130 args = parser.parse_args() 131 132 path = os.path.dirname(args.input) 133 base_name = os.path.splitext(os.path.basename(args.input))[0] 134 135 # pdfをテキストに変換 136 inputs = get_text_from_pdf(args.input, limit=args.limit) 137 138 with open(path + os.sep + "text.txt", "w", encoding="utf-8") as f_text: 139 with open(path + os.sep + "translate.txt", "w", encoding="utf-8") as f_trans: 140 141 # 一定文字列で分割した文章毎にAPIを叩く 142 for i, input in enumerate(inputs): 143 print("{0}/{1} is proccessing".format((i+1), len(inputs))) 144 # 結果をファイルに出力 145 f_text.write(input) 146 f_trans.write(translate(input)) 147 148 149if __name__ == "__main__": 150 main() 151

試したこと

130行目のargs = parser.parse_args() でエラーが発生しているようです。

補足情報(FW/ツールのバージョンなど)

pythonのバージョンは3.9.5で、vscodeを利用しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Pythonのエラーではなく、コマンド実行時のコマンドラインオプションが足りないというメッセージです。
作成したソースファイルの名前がtranslate.pyだとすると

shell

1$ python translate.py -input english.pdf

と起動しなければならないのに、そうなっていないです、という意味です。

コマンドの使い方を知りたければ、以下で表示されます。

shell

1$ python translate.py -h 2

argparseの使い方を知りたければ、argparse --- コマンドラインオプション、引数、サブコマンドのパーサーを見てください。

投稿2021/07/08 01:01

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

実行時に--inputを指定する必要があるので、pythonファイル名をmain.pyとした場合、以下のように指定する必要があります。

python main.py --input PDF_NAME

--inputに指定する値PDF_NAMEget_text_from_pdfpdfnameとして渡される値(pdfのファイルパス)となるので、変更して指定してください。

投稿2021/07/08 00:57

編集2021/07/08 01:01
nnkkmto

総合スコア175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問