![見出し画像](https://assets.st-note.com/production/uploads/images/149547984/rectangle_large_type_2_fb3777a7b96b0ecaaf057b2cdc23c4db.png?width=1200)
ChatGPTのAPIでフォルダ内の論文を要約するPythonのコード
概要
ChatGPTのAPIを用いて特定のフォルダに入っている論文を、あるキーワードで抽出して、さらに、そのキーワードで各論文を要約するコード作りました。
Pythonでコピペしたら動きます。GPT-4o-miniが一番トークンのコスパ良いです。なんの論文要約してるかわからないので初めに500文字ほど出力させました。
トークンは単位時間あたりの使用料が設定されていて、使いすぎると待機時間が必要です。その待機時間も設けています。
エラーが起きた場合、エラーをGPTに貼り付けて、対策してください。
コード全文
import fitz # PyMuPDFをfitzとしてインポート
import openai
import os
import time
# OpenAI APIキーを設定
openai.api_key = 'ChatGPT APIキー'
# 論文が保存されているフォルダのパス
folder_path = 'フォルダのパス' # 例: 'C:/path/to/your/pdf_files'
# 出力ファイル
output_file = '出力ファイル'
# 特定のキーワード
keywords = [特定のキーワード']
def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path)
text = ""
for page in doc:
text += page.get_text()
return text
def contains_keywords(text, keywords):
return any(keyword.lower() in text.lower() for keyword in keywords)
def summarize_text(text, title):
while True:
try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini", # GPT-4o-miniモデルを使用
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Summarize the following text mentioning '特定のキーワード':\n\n{text}"}
],
max_tokens=300 # 必要に応じて要約の長さを調整
)
summary = response['choices'][0]['message']['content'].strip()
return f"Title: {title}\nSummary:\n{summary}\n\n"
except openai.error.RateLimitError as e:
print(f"Rate limit reached: {e}. Retrying in 30 seconds...")
time.sleep(30) # 30秒待機して再試行
def main():
summaries = []
for filename in os.listdir(folder_path):
if filename.endswith('.pdf'):
pdf_path = os.path.join(folder_path, filename)
print(f"Processing file: {pdf_path}")
text = extract_text_from_pdf(pdf_path)
print(f"Extracted text: {text[:500]}...") # 最初の500文字を表示
if contains_keywords(text, keywords):
title = os.path.basename(pdf_path)
summary = summarize_text(text, title)
summaries.append(summary)
print(f"Generated summary for {title}: {summary}")
else:
print(f"No relevant keywords found in {filename}")
with open(output_file, 'w', encoding='utf-8') as f:
f.writelines(summaries)
print(f"Summaries saved to {output_file}")
print(f"File size: {os.path.getsize(output_file)} bytes")
if __name__ == "__main__":
main()
コードの各部分の説明
1. ライブラリのインポート
import fitz # PyMuPDFをfitzとしてインポート
import openai
import os
import time
fitz: PyMuPDFライブラリをインポートして、PDFファイルを読み取るために使用します。
openai: OpenAIのAPIを使用するためにインポートします。
os: ファイルやフォルダの操作を行うための標準ライブラリです。
time: 待機やタイマーを扱う標準ライブラリです。
2. OpenAI APIキーを設定
openai.api_key = 'ChatGPT APIキー'
OpenAIのAPIキーを設定します。実際のAPIキーをここに入力してください。
3. フォルダとファイルのパス設定
folder_path = 'フォルダのパス' # 例: 'C:/path/to/your/pdf_files'
output_file = '出力ファイル'
folder_path: PDFファイルが保存されているフォルダのパスを設定します。
output_file: 要約結果を保存する出力ファイルのパスを設定します。
4. 特定のキーワードの設定
keywords = ['特定のキーワード']
要約対象となる特定のキーワードをリストで設定します。
5. PDFからテキストを抽出する関数
def extract_text_from_pdf(pdf_path):
doc = fitz.open(pdf_path)
text = ""
for page in doc:
text += page.get_text()
return text
6. キーワードが含まれているかチェックする関数
def contains_keywords(text, keywords):
return any(keyword.lower() in text.lower() for keyword in keywords)
7. テキストを要約する関数
def summarize_text(text, title):
while True:
try:
response = openai.ChatCompletion.create(
model="gpt-4o-mini", # GPT-4o-miniモデルを使用
messages=[
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": f"Summarize the following text mentioning '特定のキーワード':\n\n{text}"}
],
max_tokens=300 # 必要に応じて要約の長さを調整
)
summary = response['choices'][0]['message']['content'].strip()
return f"Title: {title}\nSummary:\n{summary}\n\n"
except openai.error.RateLimitError as e:
print(f"Rate limit reached: {e}. Retrying in 30 seconds...")
time.sleep(30) # 30秒待機して再試行
summarize_text(text, title): テキストをOpenAIのAPIを使用して要約する関数です。
openai.ChatCompletion.create(): OpenAIのAPIにリクエストを送ります。
RateLimitError: レートリミットエラーが発生した場合、30秒待機して再試行します。
8. メイン処理
def main():
summaries = []
for filename in os.listdir(folder_path):
if filename.endswith('.pdf'):
pdf_path = os.path.join(folder_path, filename)
print(f"Processing file: {pdf_path}")
text = extract_text_from_pdf(pdf_path)
print(f"Extracted text: {text[:500]}...") # 最初の500文字を表示
if contains_keywords(text, keywords):
title = os.path.basename(pdf_path)
summary = summarize_text(text, title)
summaries.append(summary)
print(f"Generated summary for {title}: {summary}")
else:
print(f"No relevant keywords found in {filename}")
with open(output_file, 'w', encoding='utf-8') as f:
f.writelines(summaries)
print(f"Summaries saved to {output_file}")
print(f"File size: {os.path.getsize(output_file)} bytes")
if __name__ == "__main__":
main()
main(): メインの処理を行う関数です。
os.listdir(folder_path): 指定したフォルダ内のファイルをリスト化します。
filename.endswith('.pdf'): PDFファイルのみを処理対象とします。
extract_text_from_pdf(pdf_path): PDFからテキストを抽出します。
contains_keywords(text, keywords): キーワードが含まれているかをチェックします。
summarize_text(text, title): テキストを要約します。
with open(output_file, 'w', encoding='utf-8') as f: 要約結果を出力ファイルに保存します。