asl01 / app.py
mkfallah's picture
Upload 2 files
01a49dc verified
import gradio as gr
import pdfplumber
import fitz # PyMuPDF
from sentence_transformers import SentenceTransformer, util
import faiss
import numpy as np
import re
# تابع استخراج متن از PDF
def extract_text_from_pdf(file):
text = ""
with pdfplumber.open(file.name) as pdf:
for page in pdf.pages:
page_text = page.extract_text()
if page_text:
text += page_text + "\n"
return text
# تابع پاک‌سازی متن
def clean_text(text):
text = re.sub(r'\n+', '\n', text)
text = re.sub(r'[ \t]+', ' ', text)
return text.strip()
# تابع تقسیم‌بندی متن به بخش‌های معنادار
def chunk_text(text, chunk_size=500, overlap=50):
sentences = re.split(r'(?<=[.!?]) +', text)
chunks = []
current_chunk = ""
for sentence in sentences:
if len(current_chunk) + len(sentence) <= chunk_size:
current_chunk += " " + sentence
else:
chunks.append(current_chunk.strip())
current_chunk = sentence
if current_chunk:
chunks.append(current_chunk.strip())
return chunks
# بارگذاری مدل تعبیه
model = SentenceTransformer("sentence-transformers/all-MiniLM-L6-v2")
# تابع اصلی برای پاسخ به پرسش‌ها
def answer_question(pdf_file, question):
# استخراج و پاک‌سازی متن
raw_text = extract_text_from_pdf(pdf_file)
cleaned_text = clean_text(raw_text)
# تقسیم‌بندی متن
chunks = chunk_text(cleaned_text)
# تعبیه بخش‌ها
embeddings = model.encode(chunks)
# ساخت ایندکس FAISS
index = faiss.IndexFlatL2(embeddings.shape[1])
index.add(np.array(embeddings))
# تعبیه پرسش
question_embedding = model.encode([question])
# جستجوی نزدیک‌ترین بخش‌ها
D, I = index.search(np.array(question_embedding), k=3)
# جمع‌آوری پاسخ‌ها
answers = [chunks[i] for i in I[0]]
return "\n\n---\n\n".join(answers)
# رابط کاربری Gradio
iface = gr.Interface(
fn=answer_question,
inputs=[
gr.File(label="آپلود فایل PDF", file_types=[".pdf"]),
gr.Textbox(label="پرسش خود را وارد کنید")
],
outputs="text",
title="پاسخ به پرسش‌ها از روی فایل PDF",
description="یک سیستم RAG ساده برای پاسخ به پرسش‌ها از روی محتوای فایل PDF"
)
iface.launch()