見出し画像

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: 要約結果を出力ファイルに保存します。

いいなと思ったら応援しよう!