|
|
|
|
|
|
|
import fitz |
|
import gradio as gr |
|
from openai import OpenAI |
|
|
|
|
|
def extract_text_from_pdf(pdf_path): |
|
document = fitz.open(pdf_path) |
|
all_text = [] |
|
|
|
for page_num in range(len(document)): |
|
page = document.load_page(page_num) |
|
page_text = page.get_text("text") |
|
all_text.append(page_text) |
|
|
|
return "\n".join(all_text) |
|
|
|
|
|
def calculate_movie_potential(extracted_text, api_key): |
|
client = OpenAI(api_key=api_key) |
|
prompt = ( |
|
"請根據以下內容分析這個人是否適合成為電影主角,並給出百分比評分 (滿分100%)。請依以下分析維度評估:\n" |
|
"1. 戲劇性(是否使用強烈的情緒用詞,如「驚喜」、「崩潰」)。\n" |
|
"2. 成長潛力(是否提到挑戰或困難)。\n" |
|
"3. 幽默感(是否有幽默的描述或笑話)。\n" |
|
"4. 英雄氣質(是否有「幫助他人」的內容)。\n" |
|
"5. 劇情代入感(是否有豐富的細節描述)。\n\n" |
|
f"日記或聊天內容:\n{extracted_text[:4000]}\n\n" |
|
"請給出總評分(百分比)並分項說明每個維度的得分與理由:" |
|
) |
|
response = client.chat.completions.create( |
|
model="gpt-3.5-turbo", |
|
messages=[{"role": "user", "content": prompt}], |
|
max_tokens=1000, |
|
temperature=0.7 |
|
) |
|
response_text = response.choices[0].message.content.strip() |
|
|
|
return response_text |
|
|
|
|
|
def process_pdf_and_generate(api_key, pdf_file): |
|
try: |
|
|
|
extracted_text = extract_text_from_pdf(pdf_file) |
|
|
|
|
|
if not extracted_text.strip(): |
|
return "Error: The uploaded PDF appears to be empty or contains unreadable text. Please upload a valid document." |
|
|
|
|
|
movie_potential = calculate_movie_potential(extracted_text, api_key) |
|
|
|
|
|
return movie_potential |
|
except Exception as e: |
|
return f"Error: {e}" |
|
|
|
|
|
interface = gr.Interface( |
|
fn=process_pdf_and_generate, |
|
inputs=[ |
|
gr.Textbox(label="API Key", type="password"), |
|
gr.File(label="Upload PDF (Diary, Notes, Chat Logs)", type="filepath"), |
|
], |
|
outputs=gr.Textbox(label="Movie Protagonist Potential Analysis"), |
|
title="Movie Protagonist Analyzer with RAG", |
|
description=( |
|
"Upload a PDF (diary, notes, or chat logs) and provide your OpenAI API key. The system will analyze the content " |
|
"and evaluate how suitable you are to be a movie protagonist based on key dimensions using LangChain (RAG)." |
|
) |
|
) |
|
|
|
|
|
interface.launch() |
|
|