File size: 2,645 Bytes
01a49dc |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
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()
|