前提・実現したいこと
英語論文の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を利用しています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。