Spaces:
Paused
Paused
File size: 1,926 Bytes
bda6294 | 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 | # -*- coding: utf-8 -*-
"""
Analyse de documents televerses (PDF, DOCX, TXT, CSV) - Space edition.
Le texte est traite en memoire pour la session, croise avec le contenu du
site, puis oublie (aucune conservation).
"""
import io
import gdpr
def extract_text(file_name, file_bytes):
name = file_name.lower()
if name.endswith(".pdf"):
from pypdf import PdfReader
reader = PdfReader(io.BytesIO(file_bytes))
parts = []
for page in reader.pages:
try:
parts.append(page.extract_text() or "")
except Exception:
continue
return "\n".join(parts).strip()
if name.endswith(".docx"):
import docx
doc = docx.Document(io.BytesIO(file_bytes))
return "\n".join(p.text for p in doc.paragraphs).strip()
if name.endswith((".txt", ".md", ".csv")):
return file_bytes.decode("utf-8", errors="ignore")
raise ValueError(f"Format non pris en charge : {file_name}")
def analyze_document(file_name, file_bytes, question, lang="fr"):
import rag_engine
raw = extract_text(file_name, file_bytes)
if not raw:
msg = ("Impossible d'extraire du texte de ce document."
if lang != "en" else
"Could not extract text from this document.")
return msg, [], ""
clean = gdpr.safe_for_processing(raw)
if not question:
question = ("Resume ce document et indique ses liens avec les "
"informations du site Vizyon Ayiti 360."
if lang != "en" else
"Summarize this document and relate it to the Vizyon "
"Ayiti 360 website information.")
response, sources = rag_engine.answer(question, lang=lang,
extra_context=clean)
preview = clean[:600] + ("..." if len(clean) > 600 else "")
return response, sources, preview
|