Spaces:
Sleeping
Sleeping
# Creating your fully corrected Hugging Face Space project | |
# app.py | |
import os | |
import tempfile | |
import gradio as gr | |
import faiss | |
import numpy as np | |
from transformers import AutoModel, AutoTokenizer | |
from langchain.text_splitter import RecursiveCharacterTextSplitter | |
from sentence_transformers import SentenceTransformer | |
from pdfminer.high_level import extract_text | |
from docx import Document | |
# Load Arabic embedding model | |
embedding_model = SentenceTransformer("sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2") | |
index = None | |
texts = [] | |
def extract_text_from_pdf(pdf_path): | |
return extract_text(pdf_path) | |
def extract_text_from_docx(docx_path): | |
doc = Document(docx_path) | |
return "\n".join([para.text for para in doc.paragraphs]) | |
def process_files(files, progress=gr.Progress()): | |
global index, texts | |
texts = [] | |
temp_dir = tempfile.mkdtemp() | |
# Step 1: Extract text | |
progress(0.1, desc="\u062c\u0627\u0631\u0650 \u0627\u0633\u062a\u062e\u0631\u0627\u062c \u0627\u0644\u0646\u0635\u0648\u0635 \u0645\u0646 \u0627\u0644\u0643\u062a\u0628...") | |
for file in files: | |
file_path = os.path.join(temp_dir, file.name) | |
with open(file_path, "wb") as f: | |
f.write(file.file.read()) | |
if file.name.endswith(".pdf"): | |
text = extract_text_from_pdf(file_path) | |
elif file.name.endswith(".docx") or file.name.endswith(".doc"): | |
text = extract_text_from_docx(file_path) | |
else: | |
continue | |
texts.append(text) | |
# Step 2: Chunk the text | |
progress(0.4, desc="\u062a\u0642\u0637\u064a\u0639 \u0627\u0644\u0646\u0635\u0648\u0635 \u0625\u0644\u0649 \u0641\u0642\u0631\u0627\u062a...") | |
splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50) | |
chunks = [] | |
for text in texts: | |
chunks.extend(splitter.split_text(text)) | |
# Step 3: Embed the text | |
progress(0.7, desc="\u062a\u062d\u0648\u064a\u0644 \u0627\u0644\u0641\u0642\u0631\u0627\u062a \u0625\u0644\u0649 \u0645\u062a\u062c\u0647\u0627\u062a...") | |
embeddings = embedding_model.encode(chunks, show_progress_bar=True) | |
# Step 4: Build FAISS index | |
progress(0.9, desc="\u0628\u0646\u0627\u0621 \u0642\u0627\u0639\u062f\u0629 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0628\u062d\u062b...") | |
embeddings = np.array(embeddings).astype(np.float32) | |
index = faiss.IndexFlatL2(embeddings.shape[1]) | |
index.add(embeddings) | |
texts.clear() | |
texts.extend(chunks) | |
return "\u2705 \u0627\u0644\u0646\u0638\u0627\u0645 \u062c\u0627\u0647\u0632 \u0644\u0644\u0625\u062c\u0627\u0628\u0629 \u0639\u0644\u0649 \u0623\u0633\u0626\u0644\u062a\u0643" | |
def answer_question(question): | |
if index is None: | |
return "\u064a\u0631\u062c\u0649 \u062a\u062d\u0645\u064a\u0644 \u0643\u062a\u0628 \u0648\u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 \"\u0627\u0628\u062f\u0623 \u0627\u0644\u062a\u062f\u0631\u064a\u0628\" \u0623\u0648\u0644\u0627" | |
embedded_question = embedding_model.encode([question]).astype(np.float32) | |
D, I = index.search(embedded_question, k=1) | |
if len(I[0]) == 0: | |
return "\u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u0639\u062b\u0648\u0631 \u0639\u0644\u0649 \u0625\u062c\u0627\u0628\u0629." | |
answer = texts[I[0][0]] | |
return answer | |
with gr.Blocks(theme=gr.themes.Soft()) as demo: | |
gr.Markdown("# \ud83d\udcda محاكاة دماغ المؤلف بناءً على الكتب المرفوعة") | |
with gr.Row(): | |
files = gr.File(label="ارفع ملفات الكتب", file_types=[".pdf", ".docx", ".doc"], file_count="multiple") | |
upload_button = gr.Button("ابدأ التدريب على الكتب") | |
output_text = gr.Textbox(label="مخرجات التدريب", interactive=False) | |
upload_button.click(fn=process_files, inputs=[files], outputs=[output_text]) | |
gr.Markdown("## اطرح سؤالك بعد إكمال التدريب:") | |
question = gr.Textbox(label="سؤالك بالعربية") | |
answer = gr.Textbox(label="الإجابة", interactive=False) | |
ask_button = gr.Button("أجب عن سؤالي") | |
ask_button.click(fn=answer_question, inputs=[question], outputs=[answer]) | |
demo.launch(share=True) | |