PDFs, E-Mails, Dokumente: Alles wird zugänglich
\nJeder Dokumenttyp hat seine Eigenarten. PDFs verstecken Text in komplexen Layern, E-Mails sind in archaischen Formaten strukturiert, Word-Dokumente mischen Content mit Formatierung. Diese Formate zu knacken und den wertvollen Text zu extrahieren ist handwerkliche Arbeit, aber lösbar.
\nPDF-Extraktion ist oft der schwierigste Teil. Moderne PDFs enthalten echten Text, alte oder gescannte PDFs sind im Grunde Bilder. Dazwischen gibt es alle Arten von Zwischenlösungen mit verschiedenen Encoding-Problemen und Layout-Herausforderungen.
\nDocument Processing ist zu 80% Problemlösung für Edge Cases. Das Standard-Happy-Path-PDF funktioniert einfach, aber korrupte, verschlüsselte oder schlecht formatierte Dokumente erfordern robusten Error-Handling und Fallback-Strategien.
\nVerschiedene PDF-Libraries haben verschiedene Stärken. PyPDF2 ist einfach aber limitiert, pdfplumber behält Layout-Informationen, pymupdf ist schnell und feature-rich. Für robuste Systeme brauchst Du oft mehrere Tools als Fallbacks.
\nMulti-Tool-PDF-Extraktion:
\ndef extract_pdf_text(file_path):
\n# Versuch 1: PyMuPDF (schnell, robust)
\ntry:
\nimport fitz
\ndoc = fitz.open(file_path)
\ntext = ""
\nfor page in doc:
\ntext += page.get_text()
\nif len(text.strip()) > 100: # Mindest-Content
\nreturn text
\nexcept:
\npass
\n# Versuch 2: pdfplumber (besseres Layout)
\ntry:
\nimport pdfplumber
\nwith pdfplumber.open(file_path) as pdf:
\nreturn '\\n'.join([page.extract_text() for page in pdf.pages])
\nexcept:
\nreturn None
\nOCR für gescannte PDFs ist ein eigenes Thema. Tesseract ist der Standard für Open-Source-OCR, aber es braucht gute Preprocessing: Kontrast-Anpassung, Noise-Removal, Rotation-Correction. Die Qualität schwankt stark je nach Scan-Qualität.
\nVielleicht magst Du OCR als separaten Schritt behandeln. Erst versuchen normalen Text zu extrahieren, nur bei Bedarf OCR anwenden. Das spart Zeit und Ressourcen für die 90% der PDFs, die echten Text enthalten.
\nE-Mail-Verarbeitung ist komplex wegen der verschiedenen Formate. MBOX-Dateien von Thunderbird, PST-Files von Outlook, EML-Files als Einzelnachrichten - jedes Format braucht einen eigenen Parser. Und dann sind da noch Attachments, HTML vs. Plain-Text, Encoding-Issues.
\nE-Mail-Extraktion multi-format:
\nMBOX-Dateien (Thunderbird, Apple Mail)
\nimport mailbox
\nfor message in mailbox.mbox('inbox.mbox'):
\nsubject = message['Subject']
\nbody = message.get_payload(decode=True)
\nEML-Dateien (Einzelnachrichten)
\nimport email
\nwith open('message.eml', 'r') as f:
\nmsg = email.message_from_file(f)
\nsubject = msg['Subject']
\nbody = msg.get_payload()
\nPST-Dateien (Outlook) - benötigt libpst
\nimport pypff
\npst = pypff.file()
\npst.open('outlook.pst')
\nHTML-Cleanup in E-Mails ist essentiell. E-Mail-HTML ist oft schlecht formatiert und voller Tracking-Pixel und Layout-Code. BeautifulSoup oder html2text extrahieren den reinen Text und entfernen den HTML-Ballast.
\nE-Mail-Privacy: E-Mails enthalten persönliche und vertrauliche Informationen. Überlege Dir genau, was Du indexierst und wie lange Du es aufbewahrst. Compliance-Regeln können hier relevant sein.
\nWord-Dokumente sind relativ einfach mit python-docx. Das Library versteht die DOCX-Struktur und extrahiert Text, Tabellen und Metadaten sauber. Alte DOC-Dateien sind schwieriger und brauchen oft LibreOffice als Konverter.
\nOffice-Dokumente verarbeiten:
\nDOCX-Dateien
\nimport docx
\ndoc = docx.Document('document.docx')
\ntext = '\\n'.join([paragraph.text for paragraph in doc.paragraphs])
\nTabellen extrahieren
\nfor table in doc.tables:
\nfor row in table.rows:
\nrow_data = [cell.text for cell in row.cells]
\nPowerPoint (PPTX)
\nfrom pptx import Presentation
\nprs = Presentation('presentation.pptx')
\nfor slide in prs.slides:
\nfor shape in slide.shapes:
\nif hasattr(shape, "text"):
\ntext += shape.text
\nEncoding-Probleme sind der Fluch der Dokumenten-Verarbeitung. UTF-8, Latin-1, Windows-1252, und dutzende andere Encodings können in einem einzigen Archiv vorkommen. Chardet hilft bei der automatischen Encoding-Erkennung, aber 100% perfekt ist es nie.
\nEncoding-Realität: Plane für Encoding-Fehler. Nicht jedes Dokument lässt sich perfekt dekodieren. Graceful Degradation und Fallback zu "ignore" oder "replace" Strategien sind praktischer als perfekte Encoding-Behandlung.
\nBatch-Processing-Pipeline für große Dokumentenmengen braucht sorgfältige Planung. Memory-Management, parallele Verarbeitung, Progress-Tracking, Error-Recovery - ein robustes System ist deutlich komplexer als ein einfacher Script.
\nRobuste Batch-Processing-Pipeline:
\nimport multiprocessing as mp
\nfrom concurrent.futures import ProcessPoolExecutor
\ndef process_document(file_path):
\ntry:
\n# Text extrahieren
\ntext = extract_text(file_path)
\n# Embeddings generieren
\nembedding = generate_embedding(text)
\n# In ChromaDB speichern
\nstore_in_chromadb(file_path, text, embedding)
\nreturn {"status": "success", "file": file_path}
\nexcept Exception as e:
\nreturn {"status": "error", "file": file_path, "error": str(e)}
\nParallelverarbeitung
\nwith ProcessPoolExecutor(max_workers=4) as executor:
\nresults = executor.map(process_document, file_list)
\nTabellen und strukturierte Daten aus Dokumenten zu extrahieren ist eine Kunst für sich. PDFs mit Tabellen, Excel-Dateien, CSV-Files - jedes Format hat seine Eigenarten. pandas ist oft der beste Freund für strukturierte Datenverarbeitung.
\nEs ist besser, Tabellendaten separat zu indexieren. Eine Tabelle pro ChromaDB-Eintrag, nicht das gesamte Dokument. Das macht Suchen präziser und Ergebnisse relevanter.
\nAttachments in E-Mails sind oft die wertvollsten Inhalte. Verträge, Präsentationen, Berichte - aber sie sind schwer zu finden, weil sie in E-Mails versteckt sind. Attachments extrahieren und separat indexieren macht sie durchsuchbar.
\nE-Mail-Attachment-Extraktion:
\ndef extract_attachments(email_message, output_dir):
\nattachments = []
\nfor part in email_message.walk():
\nif part.get_content_disposition() == 'attachment':
\nfilename = part.get_filename()
\nif filename:
\nfile_path = os.path.join(output_dir, filename)
\nwith open(file_path, 'wb') as f:
\nf.write(part.get_payload(decode=True))
\nattachments.append(file_path)
\nreturn attachments
\nPerformance-Monitoring hilft beim Identifizieren von Bottlenecks. Welche Dokumenttypen brauchen am längsten? Wo ist RAM-Verbrauch problematisch? Diese Daten helfen bei der Optimierung der Pipeline.
\nGroße Dokumente können Memory-Problems verursachen. 100MB-PDFs oder PST-Files mit Gigabyte-Größe sprengen schnell den verfügbaren RAM. Streaming-Processing oder Dokument-Splitting können helfen.
\nMetadata-Preservation ist wichtig für späteren Kontext. Wann wurde das Dokument erstellt? Wer hat es geschrieben? In welcher E-Mail war es attached? Diese Informationen machen Suchergebnisse wertvoller.
\nUmfassendes Metadata-Schema:
\n{
\n"source_type": "email_attachment",
\n"email_subject": "Quarterly Report Q4 2024",
\n"email_sender": "ceo@company.com",
\n"email_date": "2024-01-15T10:30:00Z",
\n"attachment_name": "Q4_Report.pdf",
\n"document_author": "Finance Team",
\n"document_created": "2024-01-10T14:20:00Z",
\npages": 23,
\n"file_size": 2048576,
\n"extraction_method": "pymupdf"
\n}
\nKontinuierliche Verbesserung der Extraction-Quality durch Feedback-Loops. Welche Dokumente wurden nicht gut extrahiert? Wo sind manuell nacharbeiten nötig? Diese Erkenntnisse fließen in bessere Preprocessing-Pipelines.
\nDocument Processing ist wie Archäologie: Du gräbst wertvollen Content aus verschiedensten Formaten und Encodings aus. Geduld und robuste Tools sind wichtiger als perfekte Algorithmen.
\nMit systematischer Dokument-Verarbeitung hast Du alle wichtigen Informationsquellen erschlossen. Jetzt können wir die wahre Kraft semantischer Suche entfalten und nach Bedeutung statt nur nach Wörtern suchen.
\n\n