Einleitung
Unstructured.io ist ein Open-Source-Framework zur strukturierten Aufbereitung unstrukturierter Dokumente wie PDFs, Word-Dateien, HTML-Seiten oder E-Mails. Ziel ist es, aus diesen heterogenen Formaten semantisch verwertbare Inhalte zu extrahieren, etwa Überschriften, Absätze, Tabellen oder Listen, und sie in ein einheitliches, maschinenlesbares Format zu überführen. Der Hauptanwendungsfall liegt in der Vorbereitung von Textdaten für nachgelagerte KI-Verarbeitung, insbesondere für Systeme mit Retrieval-Augmented Generation (RAG).
Der typische Einsatz erfolgt im Rahmen von Dokumentenanalyse, Wissensmanagement oder zur Vorbereitung von Eingaben für Embedding-Modelle. Dabei kommen mehrere Verarbeitungsschritte zum Einsatz. Diese vier Schritte bilden den Kern der Unstructured.io-Pipeline und werden bei jeder regulären Nutzung der Bibliothek durchlaufen.
- Partitioning
Zerlegung des Dokuments in logische Content-Elemente wie Absätze, Überschriften oder Tabellen. - Cleaning
Entfernung irrelevanter Bestandteile wie Kopfzeilen, Fußzeilen oder Wasserzeichen. - Extracting
Extraktion des reinen Textinhalts sowie begleitender Metadaten. - Staging
Aufbereitung dieser Informationen in einem konsistenten strukturierten Format (z. B. JSON oder Markdown).
Darüber hinaus existieren optionale Erweiterungen:
- Chunking: Längere Inhalte werden in kleinere Texteinheiten zerlegt, die besser für Embedding-Modelle geeignet sind. Dieser Schritt ist nicht zwingend Teil der Kernbibliothek, aber für viele KI-Anwendungen notwendig.
- Embedding: Die entstandenen Text-Chunks werden an externe Modelle (z. B. OpenAI, HuggingFace, SentenceTransformers) übergeben, um Vektorrepräsentationen zu erzeugen. Dieser Schritt erfolgt außerhalb von Unstructured und muss vom Nutzer selbst implementiert oder über vorhandene Beispielpipelines ergänzt werden.
Damit ist klar: Unstructured.io übernimmt die Dokumentvorverarbeitung bis zur strukturierten Textausgabe. Für eine vollständige RAG-Pipeline – bestehend aus Embedding, Vektordatenbank, Retrieval-Logik und Sprachmodell – sind zusätzliche Werkzeuge notwendig. Unstructured stellt somit den ersten, vorbereitenden Abschnitt einer solchen Architektur dar.
Beispiel PDF-Dokumente zum Experimentieren
https://github.com/Unstructured-IO/unstructured/tree/main/example-docs/pdf
Unterstützte Datentypen
Kategorie | Dateitypen |
Apple | .cwk, .mcw |
CSV | .csv |
Data Interchange | .dif* |
dBase | .dbf |
.eml, .msg, .p7s | |
EPUB | .epub |
HTML | .htm, .html |
Image | .bmp, .heic, .jpeg, .jpg, .png, .prn, .tiff |
Markdown | .md |
OpenOffice | .odt |
Org Mode | .org |
Other | .eth, .pbd, .sdp |
Plain text | .txt |
PowerPoint | .pot, .ppt, .pptm, .pptx |
reStructured Text | .rst |
Rich Text | .rtf |
Spreadsheet | .et, .fods, .mw, .xls, .xlsx |
StarOffice | .sxg |
TSV | .tsv |
Word processing | .abw, .doc, .docm, .docx, .dot, .dotm, .hwp, .zabw |
XML | .xml |
Benötigte externe Bibliotheken
Bibliothek | Beschreibung |
ibmagic-dev | Erkennt den genauen Typ einer Datei (z.B. ob es sich um ein PDF, ein JPG, etc. handelt). |
poppler-utils und tesseract-ocr | Werden für die Verarbeitung von Bildern und PDFs benötigt, insbesondere zur Texterkennung (OCR). |
tesseract-lang | Stellt die notwendigen Sprachpakete für die Texterkennung in zusätzlichen Sprachen bereit. |
libreoffice | Dient zur Verarbeitung und zum Einlesen von Dokumenten im Microsoft Office-Format (Word, PowerPoint, etc.). |
pandoc | Konvertiert verschiedene Dokumentformate und wird hier für .epub-, .odt- und .rtf-Dateien genutzt. |
Daten-Pipeline (Data Pipeline)
Der unstructured.io-Workflow ist eine mehrstufige Datenpipeline, die Rohdokumente systematisch in KI-fertige Informationen umwandelt. Der Prozess beginnt mit dem Partitioning, bei dem ein Dokument in seine logischen Elemente wie Titel, Absätze und Tabellen zerlegt wird. Im anschließenden Cleaning-Schritt werden diese Elemente von störenden Inhalten wie Kopf- oder Fußzeilen befreit. Darauf folgt das Extracting, bei dem die reinen Textinhalte sowie wichtige Metadaten aus den Elementen extrahiert werden. Der Staging-Bereich dient dann dazu, diese extrahierten Daten zu strukturieren und für die nächsten Phasen vorzubereiten. Im Chunking werden längere, zusammenhängende Texte in kleinere, für Modelle optimierte Abschnitte unterteilt. Der finale Schritt, das Embedding, wandelt diese Text-Chunks in numerische Vektoren um, die von KI-Systemen wie RAG-Anwendungen verarbeitet und durchsucht werden können.
[ Partitioning ] > [ Cleaning ] > [ Extracting ] > [ Staging ] > [ Chunking ] > [ Embedding ]
Kern-Pipeline Schritte (Pflichtschritte)
[ Partitioning ] > [ Cleaning ] > [ Extracting ] > [ Staging ]
Partitioning
Die Bibliothek unstructured bietet Partitionierungsfunktionen, um rohe Dokumente in strukturierte Bausteine wie Titel, Fließtext oder Listenelemente zu zerlegen. Dies erlaubt es Anwendern, gezielt nur die Inhalte auszuwählen, die sie für ihre spezifische Aufgabe benötigen, zum Beispiel nur den Fließtext für das Training eines Zusammenfassungs-Modells.
Dokumenttyp | Partitionierungs-funktion | Strategien | Tabellenunterstützung | Optionen |
CSV-Dateien (.csv) | partition_csv | N/A | Ja | Keine |
E-Mails (.eml) | partition_email | N/A | Nein | Encoding; Include Headers; Max Partition; Process Attachments |
E-Mails (.msg) | partition_msg | N/A | Nein | Encoding; Max Partition; Process Attachments |
EPubs (.epub) | partition_epub | N/A | Ja | Include Page Breaks |
Excel-Dokumente (.xlsx/.xls) | partition_xlsx | N/A | Ja | Keine |
HTML-Seiten (.html/.htm) | partition_html | N/A | Nein | Encoding; Include Page Breaks |
Bilder (.png/.jpg/.jpeg/.tiff/.bmp/.heic) | partition_image | “auto”, “hi_res”, “ocr_only” | Ja | Encoding; Include Page Breaks; Infer Table Structure; OCR Languages, Strategy |
Markdown (.md) | partition_md | N/A | Ja | Include Page Breaks |
Org Mode (.org) | partition_org | N/A | Ja | Include Page Breaks |
Open Office Dokumente (.odt) | partition_odt | N/A | Ja | Keine |
PDFs (.pdf) | partition_pdf | “auto”, “fast”, “hi_res”, “ocr_only” | Ja | Encoding; Include Page Breaks; Infer Table Structure; Max Partition; OCR Languages, Strategy |
Reintext (.txt/.text/.log) | partition_text | N/A | Nein | Encoding; Max Partition; Paragraph Grouper |
PowerPoints (.ppt) | partition_ppt | N/A | Ja | Include Page Breaks |
PowerPoints (.pptx) | partition_pptx | N/A | Ja | Include Page Breaks |
ReStructured Text (.rst) | partition_rst | N/A | Ja | Include Page Breaks |
Rich Text Files (.rtf) | partition_rtf | N/A | Ja | Include Page Breaks |
TSV-Dateien (.tsv) | partition_tsv | N/A | Ja | Keine |
Word-Dokumente (.doc) | partition_doc | N/A | Ja | Include Page Breaks |
Word-Dokumente (.docx) | partition_docx | N/A | Ja | Include Page Breaks |
XML-Dokumente (.xml) | partition_xml | N/A | Nein | Encoding; Max Partition; XML Keep Tags |
Code-Dateien (.js/.py/.java/ etc.) | partition_text | N/A | Nein | Encoding; Max Partition; Paragraph Grouper |
Beispiel *.PDF Datei zum Testen der unstructured.io Bibliotkek:
Die partition-Funktion hat das obige PDF-Dokument analysiert. Anstatt das Dokument nur als eine lange, unformatierte Textsequenz zu betrachten, hat sie die visuelle Struktur und das Layout der Seite interpretiert, um einzelne logische Bausteine (Document Elements), z.B. „Titel“ und „NarrativeText“ zu identifizieren.
Erklärung der einzelnen Element-Typen aus dem PDF z.B. Title:
Tag (Schlüssel) | JSON Beispielwert | Erklärung |
type | „Title“ | Gibt den klassifizierten Typ des Elements an. unstructured identifiziert verschiedene Typen wie Title (Titel), NarrativeText (Fließtext), ListItem (Listenelement) etc., basierend auf dem Layout des Dokuments. |
element_id | „42a9c358d559f0be7034cffd155ae0b4“ | Eine einzigartige, automatisch generierte ID für jedes einzelne Element. Dies ist nützlich, um Elemente zu referenzieren. |
text | „OPITZ CONSULTING UND STACKIT…“ | Der reine Textinhalt, der aus dem erkannten Element extrahiert wurde. |
metadata | {…} | Ein Objekt, das als Container für alle zusätzlichen Daten (Metadaten) dient, die das Element beschreiben. Alle folgenden Tags sind Teil dieses metadata-Objekts. |
metadata.detection_class_prob | 0.6857117414474487 | Die „detection class probability“ ist ein Konfidenzwert zwischen 0 und 1. Er gibt an, wie sicher sich das Modell ist, dass die Klassifizierung unter type (hier: „Title“) korrekt ist. Ein Wert von 1 bedeutet die höchstmögliche Sicherheit. Das Modell ist sich zu 100 % sicher, dass die Zuordnung des Typs (z. B. als „Title“) korrekt ist. Als Anwender kann man durch die Auswahl der Strategie, z.B. „hi_res“ diesen Wert erhöhen. Strategien – „fast„: Schnell, aber ungenauer. Führt oft zu niedrigeren Konfidenzwerten. – „hi_res„: Nutzt komplexe Modelle zur visuellen Analyse des Dokuments. Dies ist langsamer, erkennt aber Layouts, Titel und Absätze viel zuverlässiger und führt in der Regel zu höheren Konfidenzwerten. – „ocr_only„: Erzwingt OCR auf allen Seiten, auch wenn digitaler Text vorhanden wäre. Nützlich für „kaputte“ PDFs, aber für die Layout-Erkennung ist „hi_res“ überlegen. |
metadata.coordinates | {…} | Ein Objekt, das alle Informationen zur Positionierung des Elements auf der Seite enthält. |
metadata.coordinates.points | [[197.0, 771.66], [197.0, 903.39], …] | Eine Liste von [X, Y]-Koordinatenpaaren, die eine Bounding Box (ein umgebendes Rechteck) um das Element definieren. Dies beschreibt die exakte Position und Größe des Elements auf der Seite. |
metadata.coordinates.system | „PixelSpace“ | Gibt das verwendete Koordinatensystem an. „PixelSpace“ bedeutet, dass die Werte in points, layout_width und layout_height in Pixeln gemessen werden. |
metadata.coordinates.layout_width | 1654 | Die Gesamtbreite der Seite des Dokuments in der Einheit des angegebenen system (hier: Pixel). |
metadata.coordinates.layout_height | 2339 | Die Gesamthöhe der Seite des Dokuments in der Einheit des angegebenen system (hier: Pixel). |
metadata.last_modified | „2025-05-31T08:21:16“ | Der Zeitstempel der letzten Änderung der Quelldatei, falls diese Information verfügbar ist. |
metadata.filetype | „application/pdf“ | Der MIME-Typ der Quelldatei. Er gibt an, um welche Art von Datei es sich handelt (z.B. PDF, DOCX, HTML). |
metadata.languages | [„deu“, „eng“] | Eine Liste der im Text des Elements erkannten Sprachen, angegeben als dreibuchstabige ISO 639-2 Codes (z.B. „deu“ für Deutsch, „eng“ für Englisch). |
metadata.page_number | 1 | Die Seitenzahl im Originaldokument, auf der dieses Element gefunden wurde. |
metadata.filename | „test_oc.pdf“ | Der Dateiname der verarbeiteten Quelldatei. |
metadata.parent_id | (nicht in diesem Beispiel, aber relevant) | Dieser Schlüssel würde hier erscheinen, wenn das Element ein untergeordnetes Element wäre. Sein Wert wäre die element_id des übergeordneten Elements (z.B. die ID des Titels für einen ihm folgenden Absatz). |
Das hier ist die Lister der wichtigsten Dokumentelemente wie z.B. Text, Header, Image usw. Die komplette Liste der Elemente ist hier zu finden: Link
Element-Typ | Beschreibung |
Address | Ein Textelement zur Erfassung von physischen Adressen. |
CodeSnippet | Ein Textelement zur Erfassung von Code-Schnipseln. |
EmailAddress | Ein Textelement zur Erfassung von E-Mail-Adressen. |
FigureCaption | Ein Element zur Erfassung von Text, der zu Bildunterschriften gehört. |
Footer | Ein Element zur Erfassung von Dokumenten-Fußzeilen. |
FormKeysValues | Ein Element zur Erfassung von Schlüssel-Wert-Paaren in einem Formular. |
Formula | Ein Element, das Formeln in einer Datei enthält. |
Header | Ein Element zur Erfassung von Dokumenten-Kopfzeilen. |
Image | Ein Textelement zur Erfassung von Bild-Metadaten. |
ListItem | ListItem ist ein NarrativeText-Element, das Teil einer Liste ist. |
NarrativeText | NarrativeText ist ein Element, das aus mehreren, gut formulierten Sätzen besteht. Dies schließt Elemente wie Titel, Kopf- und Fußzeilen sowie Bildunterschriften aus. |
PageBreak | Ein Element zur Erfassung von Seitenumbrüchen. |
PageNumber | Ein Element zur Erfassung von Seitenzahlen. |
Table | Ein Element zur Erfassung von Tabellen. |
Title | Ein Textelement zur Erfassung von Titeln. |
UncategorizedText | Basiselement zur Erfassung von freiem Text aus Dateien. Gilt für extrahierten Text, der keinen Bounding-Boxen zugeordnet ist. |
Cleaning
Die cleaning-Funktion dient dazu, unerwünschte Inhalte aus Dokumenten zu entfernen, um die Daten für nachgelagerte Aufgaben wie die Verarbeitung durch Sprachmodelle (LLMs) vorzubereiten. Das Ziel ist es, „saubere“ und relevantere Daten zu erhalten.
Die folgende Tabelle bietet einen Überblick über die verschiedenen cleaning-Funktionen. Quelle: Link
Name | Erklärung |
bytes_string_to_string | Konvertiert einen Bytes-String in einen normalen String. Man kann es sich so vorstellen: Ein Computer speichert einen Emoji wie 😊 nicht als Bild, sondern als eine Abfolge von Bytes – einen sogenannten „Byte-String“. Für das 😊 lautet dieser Code beispielsweise b’\xf0\x9f\x98\x8a‘. Wenn unstructured eine HTML-Datei verarbeitet, kann es vorkommen, dass der Parser über ein solches Sonderzeichen stolpert. Anstatt das Zeichen korrekt zu lesen und das 😊 in den Text einzufügen, wird manchmal fälschlicherweise eine Art „Beschreibung des Byte-Codes“ als normaler Text ausgegeben. Das Ergebnis ist dann eine Zeichenkette, die so aussieht: „b’\xf0\x9f\x98\x8a'“. Dies ist kein echter Byte-String mehr, sondern nur noch normaler Text, der so aussieht wie ein Byte-String. Die Funktion bytes_string_to_string agiert als Reparaturwerkzeug für dieses Problem. Sie erkennt das b’…‘-Muster in einem Text und wandelt es zurück in das ursprüngliche, korrekte Zeichen. |
clean | Die Funktion clean bereinigt einen Textabschnitt, indem sie mehrere spezifische Reinigungsaktionen in einem einzigen Aufruf kombiniert. Man kann durch einfache Schalter (True oder False) steuern, welche Bereinigungen durchgeführt werden sollen. Die verfügbaren Optionen sind: – bullets=True: Entfernt Aufzählungszeichen (z. B. ● oder *) am Anfang des Textes. – extra_whitespace=True: Entfernt überflüssige Leerzeichen, zum Beispiel mehrere Leerzeichen zwischen Wörtern. – dashes=True: Bereinigt verschiedene Arten von Binde- und Gedankenstrichen. – trailing_punctuation=True: Entfernt Satzzeichen am Ende des Textes. – lowercase=True: Wandelt den gesamten Text in Kleinbuchstaben um. Bsp.: clean(„● An excellent point!“, bullets=True, lowercase=True) |
clean_bullets | Entfernt Spiegelstriche oder Aufzählungszeichen vom Anfang eines Textes. |
clean_dashes | Ersetzt verschiedene Arten von Bindestrichen (z.B. Geviertstrich, Halbgeviertstrich) durch einen Standard-Bindestrich. |
clean_non_ascii_chars | Entfernt alle Nicht-ASCII-Zeichen aus einem Text. ASCII enthält: – Die Buchstaben des englischen Alphabets (A-Z, a-z) – Die Zahlen (0-9) – Grundlegende Satz- und Sonderzeichen wie ! ? @ $ & Alle anderen Zeichen gelten als Nicht-ASCII-Zeichen. Dazu gehören beispielsweise: – Deutsche Umlaute (ä, ö, ü, ß) – Symbole wie €, ®, ©, ● – Emojis wie 👍 oder 😊 Für deutsche Texte sollte clean_non_ascii_chars nicht aktiviert werden. |
clean_ordered_bullets | Entfernt geordnete Aufzählungszeichen wie „1.“, „a.)“ oder „i)“ vom Anfang eines Textes. |
clean_postfix | Die Funktion prüft das Ende einer Zeichenkette. Wenn das Ende mit einem definierten Muster (meist ein regulärer Ausdruck) übereinstimmt, wird dieser Teil entfernt. – pattern: Das Muster (hier: r“(END|STOP)“), das am Ende des Textes gesucht und entfernt werden soll. – ignore_case=True: Sorgt dafür, dass Groß- und Kleinschreibung beim Abgleich ignoriert wird. END passt also auch auf end. (Standard ist False) – strip=True: Entfernt nach dem Löschen des Musters auch verbleibende Leerzeichen am Ende. (Standard ist True) |
clean_prefix | Entfernt ein bestimmtes Präfix (Vorsilbe) aus einem Text, falls es vorhanden ist. |
clean_trailing_punctuation | Entfernt Satzzeichen am Ende eines Textes, lässt aber Satzzeichen innerhalb des Textes unberührt. |
group_broken_paragraphs | Fügt Textzeilen zusammen, die durch Zeilenumbrüche getrennt wurden, aber eigentlich zum selben Absatz gehören. Sehr nützlich für Texte aus PDFs. Anders gesagt: Diese Funktion „repariert“ Absätze, die nur aus visuellen oder formatierungsbedingten Gründen durch einzelne Zeilenumbrüche (\n) unterbrochen sind. |
remove_punctuation | Diese Funktion entfernt alle Satzzeichen z.B. , . ; ! ? aus einem Text. |
replace_unicode_quotes | Diese Funktion ersetzt veraltete oder problematische Unicode-Codes für Anführungszeichen durch ihre modernen, typografisch korrekten Entsprechungen. Manchmal enthalten Texte, die aus älteren Systemen oder Programmen wie Microsoft Word kopiert werden, keine standardmäßigen Anführungszeichen. Stattdessen werden spezielle Steuerzeichen oder Codes (wie \x91, \x93 usw.) verwendet. Diese können in modernen Systemen zu Anzeigefehlern führen oder die weitere maschinelle Verarbeitung stören. Die Funktion replace_unicode_quotes dient als „Reparaturwerkzeug“, das diese spezifischen, veralteten Codes findet und sie in die heute üblichen „intelligenten“ Anführungszeichen (Smart Quotes) umwandelt. |
translate_text | Die Funktion translate_text nutzt professionelle Übersetzungsmodelle (Helsinki NLP), um Texte zwischen vielen verschiedenen Sprachen wie Russisch, Chinesisch, Deutsch und weiteren zu übersetzen. Parameter: – text: Der Text, der übersetzt werden soll. – source_lang (Quellsprache): Der Sprachcode (z.B. de für Deutsch) des Originaltextes. Wird dieser nicht angegeben, versucht die Funktion, die Sprache automatisch zu erkennen. – target_lang (Zielsprache): Der Sprachcode der Zielsprache. Wenn nichts anderes festgelegt wird, ist das Standardziel Englisch (en). |
Extraction
Der Schritt „Extracting“ isoliert gezielt spezifische Informationen aus bereits bereinigten Textelementen.
Angenommen, ein Text enthält den Satz: Für weitere Informationen kontaktieren Sie bitte support@example.com. Anstatt den ganzen Satz zu verarbeiten, würde eine Extraktionsfunktion wie extract_email_address nur den gewünschten Datenpunkt, nämlich support@example.com, herausziehen.
Name | Erklärung |
extract_datetimetz | Extrahiert Datum, Zeit und Zeitzone aus den „Received“-Feldern einer .eml-Datei (E-Mail-Datei). |
extract_email_address | Findet und extrahiert eine oder mehrere E-Mail-Adressen aus einem Text. |
extract_ip_address | Extrahiert IP-Adressen aus einem Text. |
extract_ip_address_name | Extrahiert die Namen, die zu den jeweiligen IP-Adressen in den „Received“-Feldern einer .eml-Datei gehören. |
extract_mapi_id | Extrahiert die „MAPI ID“ aus den „Received“-Feldern einer .eml-Datei. |
extract_ordered_bullets | Extrahiert Text von geordneten Aufzählungen (z.B. „1.“, „a.)“). Bsp.: extract_ordered_bullets(„1.1 This is a very important point“) Ausgabe: („1“, „1“, None) extract_ordered_bullets(„a.1 This is a very important point“) Ausgabe: („a“, „1“, None) |
extract_text_after | Extrahiert den Text, der nach einem bestimmten Muster oder Wort vorkommt. Bsp.: text = „SPEAKER 1: Look at me, I’m flying!“ extract_text_after(text, r“SPEAKER \d{1}:“) Ausgabe: „Look at me, I’m flying!“ |
extract_text_before | Extrahiert den Text, der vor einem bestimmten Muster oder Wort vorkommt. |
extract_us_phone_number | Extrahiert eine Telefonnummer im US-Format aus einem Textabschnitt. |
group_broken_paragraphs | Fügt Textzeilen zusammen, die durch Zeilenumbrüche getrennt wurden, aber eigentlich zum selben Absatz gehören. Sehr nützlich für Texte aus PDFs. Anders gesagt: Diese Funktion „repariert“ Absätze, die nur aus visuellen oder formatierungsbedingten Gründen durch einzelne Zeilenumbrüche (\n) unterbrochen sind. Diese Funktiuon stammt aus Cleaning. Der einzige Unterschied ist der Kontext oder die Absicht, mit der die Funktion aufgerufen wird. |
remove_punctuation | Diese Funktion entfernt alle Satzzeichen z.B. , . ; ! ? aus einem Text. Diese Funktiuon stammt aus Cleaning. Der einzige Unterschied ist der Kontext oder die Absicht, mit der die Funktion aufgerufen wird. |
replace_unicode_quotes | Diese Funktion ersetzt veraltete oder problematische Unicode-Codes für Anführungszeichen durch ihre modernen, typografisch korrekten Entsprechungen. Manchmal enthalten Texte, die aus älteren Systemen oder Programmen wie Microsoft Word kopiert werden, keine standardmäßigen Anführungszeichen. Stattdessen werden spezielle Steuerzeichen oder Codes (wie \x91, \x93 usw.) verwendet. Diese können in modernen Systemen zu Anzeigefehlern führen oder die weitere maschinelle Verarbeitung stören. Die Funktion replace_unicode_quotes dient als „Reparaturwerkzeug“, das diese spezifischen, veralteten Codes findet und sie in die heute üblichen „intelligenten“ Anführungszeichen (Smart Quotes) umwandelt. Diese Funktiuon stammt aus Cleaning. Der einzige Unterschied ist der Kontext oder die Absicht, mit der die Funktion aufgerufen wird. |
translate_text | Die Funktion translate_text nutzt professionelle Übersetzungsmodelle (Helsinki NLP), um Texte zwischen vielen verschiedenen Sprachen wie Russisch, Chinesisch, Deutsch und weiteren zu übersetzen. Parameter: – text: Der Text, der übersetzt werden soll. – source_lang (Quellsprache): Der Sprachcode (z.B. de für Deutsch) des Originaltextes. Wird dieser nicht angegeben, versucht die Funktion, die Sprache automatisch zu erkennen. – target_lang (Zielsprache): Der Sprachcode der Zielsprache. Wenn nichts anderes festgelegt wird, ist das Standardziel Englisch (en). Diese Funktiuon stammt aus Cleaning. Der einzige Unterschied ist der Kontext oder die Absicht, mit der die Funktion aufgerufen wird. |
Staging
Staging-Funktionen im unstructured-Paket dienen der Aufbereitung extrahierter Dokumentelemente für nachgelagerte Verarbeitungsschritte. Als Eingabe wird eine Liste strukturierter Elemente erwartet, beispielsweise Title oder NarrativeText. Die Ausgabe ist ein sogenanntes formatgerechtes Dictionary. Darunter ist eine strukturierte Sammlung von Daten in Form von Schlüssel-Wert-Paaren zu verstehen. Die einzelnen Informationen, etwa ein Textabschnitt oder ein Metadatum, werden dabei einem eindeutigen Bezeichner zugeordnet. Diese Bezeichner, sogenannte Schlüssel, können zum Beispiel „text“, „metadata“ oder „type“ heißen. Ziel ist es, die Daten so aufzubereiten, dass sie vom jeweils vorgesehenen Zielsystem direkt weiterverarbeitet werden können.
Für verschiedene Anwendungsfälle standen ursprünglich spezialisierte Konvertierungsfunktionen zur Verfügung:
- Eine Basis-Konvertierung wie convert_to_csv zur Überführung in tabellarische Formate
- Eine Konvertierung für maschinelles Lernen und NLP-Plattformen wie stage_for_transformers zur Vorbereitung von Trainingsdaten
- Eine Konvertierung für Vektordatenbanken wie stage_for_weaviate zur semantischen Indexierung
Diese Funktionen sind mittlerweile veraltet. Die weitere Entwicklung konzentriert sich auf das Konzept sogenannter Destination Connectors z.B. für Kafka, Weaviate oder MongoDB. Damit lassen sich Daten nach der Extraktion automatisiert an externe Plattformen übergeben.
Konnektor | Beschreibung |
Astra DB | Eine cloud-native NoSQL-Datenbank-as-a-Service (DBaaS), die auf Apache Cassandra basiert. Sie ist für hohe Skalierbarkeit und Leistung optimiert und enthält Funktionen für Vektorsuche, was sie für KI-Anwendungen nützlich macht. |
Azure | Bezieht auf den Azure Blob Storage, einen Objektspeicherdienst von Microsoft zum Speichern großer Mengen unstrukturierter Daten in der Cloud. |
Azure AI Search | Ein cloud-basierter Suchdienst von Microsoft, der Entwicklern APIs und Werkzeuge zur Verfügung stellt, um umfangreiche Suchfunktionen (einschließlich Vektor- und semantischer Suche) in ihre Anwendungen zu integrieren. |
Box | Eine cloud-basierte Plattform für die Verwaltung und Speicherung von Inhalten und die Zusammenarbeit. Als Ziel kann man Daten und Dokumente in eine sichere Box-Umgebung übertragen. |
Chroma | Eine Open-Source-Vektordatenbank, die speziell für die Entwicklung von KI- und LLM-Anwendungen (Large Language Model) konzipiert ist, um Vektor-Einbettungen zu speichern und zu durchsuchen. |
Couchbase | Eine verteilte NoSQL-Datenbank, die für interaktive Anwendungen optimiert ist. Sie kombiniert einen schnellen Key-Value-Store mit einem flexiblen JSON-Dokumentenmodell und SQL-ähnlichen Abfragen. |
Databricks Volumes | Eine Funktion innerhalb von Databricks, die es ermöglicht, auf nicht-tabellarische Daten (wie Bilder, PDFs, Textdateien) im Cloud-Speicher zuzugreifen, diese zu speichern und zu verwalten, als wären sie ein lokales Dateisystem. |
Delta Tables in Amazon S3 | Ermöglicht das Speichern von Daten im Delta-Lake-Format direkt in Amazon S3. Delta Lake ist ein Open-Source-Speicher-Framework, das ACID-Transaktionen, Zeitreisen (Data Versioning) und Skalierbarkeit für Data Lakes bietet. |
Delta Tables in Databricks | Speichert Daten im optimierten Delta-Lake-Format innerhalb der Databricks-Plattform. Dies ist die native und leistungsstärkste Methode zur Nutzung von Delta Tables in Databricks. |
Dropbox | Ein Cloud-Speicherdienst, der es ermöglicht, Dateien online zu speichern und zu teilen. Als Zielkonnektor dient er dazu, Dateien und Daten in die Dropbox-Ordnerstruktur zu schreiben. |
DuckDB | Ein spaltenorientiertes, prozessinternes analytisches Datenbanksystem (OLAP). Es ist extrem schnell und darauf ausgelegt, direkt in einer Anwendung zu laufen, ohne dass ein separater Server benötigt wird. |
Elasticsearch | Eine hochskalierbare Open-Source-Such- und Analyse-Engine. Sie wird häufig für Volltextsuche, Log-Analyse, Sicherheitsinformationen und Business-Analyse verwendet. |
Google Cloud Storage | Der Objektspeicherdienst von Google (ähnlich wie Amazon S3). Er dient zum Speichern und Abrufen beliebiger Datenmengen in der Google Cloud. |
IBM watsonx.data | Ein offener Data Lakehouse-Service von IBM, der es ermöglicht, Daten aus Data Warehouses und Data Lakes mit einer einzigen Abfrage-Engine zu verwalten und zu analysieren und für KI-Workloads zu nutzen. |
Kafka | Apache Kafka ist eine verteilte Open-Source-Event-Streaming-Plattform. Als Ziel kann man Datenströme (Events) in Kafka-Topics schreiben, von wo aus sie von anderen Anwendungen in Echtzeit konsumiert werden können. |
KDB.AI | Eine hochleistungsfähige Vektordatenbank, die für Echtzeit-KI-Anwendungen wie Ähnlichkeitssuche, Personalisierung und Retrieval-Augmented Generation (RAG) entwickelt wurde. |
LanceDB | Eine einbettbare Vektordatenbank für KI-Anwendungen, die ohne Server auskommt und für multimodale Daten (Text, Bilder etc.) und schnelle, effiziente Vektorsuche optimiert ist. |
Local | Bezieht sich auf das Speichern von Daten auf dem lokalen Dateisystem der Maschine, auf der der Prozess ausgeführt wird. |
Milvus | Eine Open-Source-Vektordatenbank, die für die Verwaltung und Suche von massiven Mengen an Vektor-Einbettungen entwickelt wurde und eine hohe Leistung bei der Ähnlichkeitssuche bietet. |
MongoDB | Eine führende dokumentenorientierte NoSQL-Datenbank. Sie speichert Daten in flexiblen, JSON-ähnlichen Dokumenten, was sie bei Entwicklern für moderne Anwendungen sehr beliebt macht. |
MotherDuck | Ein serverloser Cloud-Analysedienst, der auf DuckDB aufbaut. Er kombiniert die Geschwindigkeit von DuckDB auf dem lokalen Rechner mit der Skalierbarkeit und den Freigabemöglichkeiten der Cloud. |
Neo4j | Eine der führenden Graphen-Datenbanken. Anstatt Daten in Tabellen zu speichern, speichert sie Daten als Knoten und Beziehungen, was ideal für die Analyse komplexer Verbindungen ist. |
OneDrive | Der Cloud-Speicherdienst von Microsoft. Als Zielkonnektor können Dateien und Daten direkt in die OneDrive-Cloud eines Benutzers oder einer Organisation geschrieben werden. |
OpenSearch | Ein von Amazon Web Services (AWS) geforktes Open-Source-Such- und Analyse-Framework, das von Elasticsearch abgeleitet ist. Es wird für ähnliche Anwendungsfälle wie Log-Analyse und Volltextsuche genutzt. |
Pinecone | Eine cloud-basierte, verwaltete Vektordatenbank, die es Entwicklern leicht macht, hochleistungsfähige Vektorsuche in KI-Anwendungen zu integrieren, ohne sich um die Infrastruktur kümmern zu müssen. |
PostgreSQL | Ein leistungsstarkes, objektrelationales Open-Source-Datenbanksystem. Es ist bekannt für seine Zuverlässigkeit, Robustheit und seinen großen Funktionsumfang nach SQL-Standard. |
Qdrant | Eine Open-Source-Vektordatenbank und ein Vektor-Such-Engine, die für den Einsatz in großen Produktionsumgebungen konzipiert ist und eine einfache API zum Speichern und Suchen von Vektoren bietet. |
Redis | Eine extrem schnelle In-Memory-Datenbank, die als Key-Value-Store fungiert. Sie wird häufig als Cache, Message Broker oder für Echtzeitanwendungen eingesetzt. |
S3 | Amazon Simple Storage Service (S3) ist ein hochskalierbarer Objektspeicherdienst von AWS. Er ist ein de-facto-Standard für das Speichern von Daten in der Cloud. |
SFTP | SSH File Transfer Protocol ist ein sicheres Protokoll zur Dateiübertragung. Als Zielkonnektor ermöglicht es, Daten sicher auf einen entfernten Server hochzuladen. |
SingleStore | Ein verteiltes, relationales SQL-Datenbanksystem, das für seine hohe Geschwindigkeit bei der Datenaufnahme, bei Transaktionen und Abfragen bekannt ist und sowohl transaktionale als auch analytische Workloads unterstützt. |
Snowflake | Eine cloud-basierte Datenplattform, die als Data Warehouse-as-a-Service bereitgestellt wird. Sie ist für ihre Fähigkeit bekannt, Speicher- und Rechenleistung unabhängig voneinander zu skalieren. |
SQLite | Eine serverlose, in sich geschlossene, transaktionale SQL-Datenbank-Engine, die direkt in eine Anwendung eingebettet wird. Sie ist das weltweit am weitesten verbreitete Datenbanksystem, vor allem in mobilen Apps und Browsern. |
Vectara | Eine End-to-End-Plattform für Entwickler zur Erstellung von GenAI-Anwendungen, die sich auf Retrieval-Augmented Generation (RAG) spezialisiert hat und Halluzinationen durch genaue Hybridsuche minimieren soll. |
Weaviate | Eine Open-Source-Vektordatenbank, die sowohl Datenobjekte als auch deren Vektor-Repräsentationen speichert. Dies ermöglicht die Kombination von Vektorsuche mit strukturierten Filtern. |
Die Auswahl unterstützter Plattformen wird laufend erweitert. Falls eine gewünschte Zielumgebung nicht enthalten ist, kann diese im Community-Slack vorgeschlagen werden.
Erweiterte-Pipeline Schritte (Optional)
[ Chunking ] > [ Embedding ]
Chunking
Unstructured verwenden Metadaten und Dokumentelemente, die mit Partitionsfunktionen erkannt wurden, um Elemente zu nützlicheren „Chunks“ umzuwandeln.
Chunking Strategie
Aktuell bietet Unstructured die beiden Chunking-Strategien „basic“ und „by_title“ an. Wesentliche Bestandteile der basic-Strategie sind:
basic
Die „basic“-Strategie ist die einfachste und eine der am häufigsten verwendeten Methoden in der unstructured-Bibliothek. Ihre Hauptaufgabe ist es, sequenzielle (aufeinanderfolgende) Elemente eines Dokuments zu kombinieren, um Chunks zu erstellen, die so groß wie möglich sind, ohne eine festgelegte maximale Zeichenzahl zu überschreiten:
- max_characters: eine harte Grenze, die nicht überschritten werden darf
- new_after_n_chars: eine weiche Grenze. Bei der Überschreitung wird ein neuer Chunk begonnen, auch wenn die harte Grenze noch nicht erreicht ist. Wird diese Schwelle überschritten, wird vorzugsweise ein neuer Chunk begonnen, wenn es semantisch sinnvoll oder technisch machbar ist. Sie kann also ignoriert werden, wenn das Modell erkennt, dass es sich besser kombinieren lässt, solange die harte Grenze eingehalten wird.
- overlap: Wenn ein einzelnes Element zu groß ist und zerschnitten werden muss, gibt dieser Parameter an, wie viele Zeichen sich am Ende des einen und am Anfang des nächsten Chunks überlappen sollen. Dies hilft, den Kontext über die Chunk-Grenzen hinweg zu erhalten.
- overlap_all: Wenn auf True gesetzt, wird ein Überlapp nicht nur bei übergroßen, geteilten Elementen angewendet, sondern zwischen allen aufeinanderfolgenden Chunks.
Sonderfall Tabellen: Tabellen (Table-Elemente) werden immer als eigenständige Chunks behandelt und niemals mit anderen Elementen kombiniert. Ist eine Tabelle selbst zu groß, wird sie ebenfalls aufgeteilt.
Bei „basic“ stoßen wir bei stark strukturierten Dokumenten wie Berichten, wissenschaftlichen Arbeiten oder Handbüchern an die Grenzen dieser Strategie.
by_title
Die by_title-Strategie erbt alle grundlegenden Verhaltensweisen der basic-Strategie (wie z. B. das Respektieren von max_characters), fügt aber drei entscheidende, neue Regeln hinzu:
- Die Strategie identifiziert Title-Elemente (Überschriften) als Beginn eines neuen Abschnitts. Wenn der Algorithmus auf eine Überschrift stößt, führt er folgende Aktion aus:
- Der aktuelle Chunk wird sofort geschlossen.
- Ein neuer Chunk wird gestartet, beginnend mit diesem Title-Element.
Dies geschieht selbst dann, wenn die Überschrift textlich noch perfekt in den vorherigen Chunk gepasst hätte.
- Standardmäßig behandelt die Strategie Seitenumbrüche nicht als harte Trennung. Das bedeutet, ein Abschnitt kann sich über mehrere Seiten erstrecken, ohne in einen neuen Chunk aufgeteilt zu werden. Dieses Verhalten wird durch den Parameter multipage_sections=True (Standardwert) gesteuert.
- Manchmal werden in Dokumenten sehr kurze Texte, wie z. B. einzelne Listeneinträge, fälschlicherweise als Title-Element identifiziert. Dies kann zu einer Flut von winzigen, unerwünschten Chunks führen. Um dieses Problem zu lösen, gibt es den Parameter combine_text_under_n_chars:
- Dieser Parameter erlaubt es, mehrere aufeinanderfolgende, kleine Abschnitte zu einem einzigen Chunk zu kombinieren, um das Chunking-Fenster (max_characters) bestmöglich zu füllen.
- Standardmäßig ist der Wert von combine_text_under_n_chars derselbe wie der von max_characters. Dies stellt sicher, dass kleine Sektionen effizient zusammengefasst werden.
- Bei 0 wird jeder noch so kleine, als Title erkannte Abschnitt als ein neuer Chunk definiert.
Die by_title-Strategie ist die bessere Wahl für alle Dokumente mit einer klaren, hierarchischen Gliederung wie z.B., Berichten, Forschungsartikeln, Anleitungen oder Verträge.
Embedding
Nach der Extraktion von Inhalten aus Dokumenten mittels der Open-Source-Bibliothek unstructured ist ein häufiger nachgelagerter Schritt die Konvertierung der extrahierten Textelemente in Vektor-Embeddings. Diese Vektoren sind die Grundlage für semantische Suchfunktionen und Retrieval-Augmented Generation (RAG).
Die unstructured-Kernbibliothek selbst enthält keine nativen Funktionen zum Aufrufen von Embedding-Anbietern. Stattdessen existieren zwei primäre Methoden, um Embeddings für unstructured-Ausgaben zu erzeugen.
Metode 1: Das Unstructured-Ökosystem stellt eine erweiterte Funktionalität in Form der Unstructured Ingest Kommandozeile (CLI) und der zugehörigen Python-Bibliothek zur Verfügung. Diese Komponenten sind für die Erstellung vollständiger End-to-End-Verarbeitungspipelines konzipiert und bieten eine eingebaute Unterstützung für die Anbindung an Embedding-Anbieter.
Bei diesem Ansatz wird die Embedding-Erzeugung nahtlos in den Datenaufnahmeprozess („Ingest Pipeline“) integriert. Dies ermöglicht die vollständige Automatisierung des Workflows vom Rohdokument bis zum fertigen Vektor-Embedding. Informationen zur Konfiguration sind in der offiziellen Dokumentation verfügbar.
Methode 2: Eine alternative Methode ist die manuelle Anreicherung der von unstructured erzeugten JSON-Dateien. Dieser Ansatz bietet ein hohes Maß an Flexibilität, insbesondere bei der Auswahl des Embedding-Modells, und eignet sich für Szenarien, in denen keine vollständige Ingest-Pipeline zum Einsatz kommt.
Der Prozess folgt typischerweise einem festen Schema:
- Input: Eine von der unstructured-Bibliothek generierte JSON-Datei dient als Eingangsquelle.
- Einlesen: Der Inhalt der JSON-Datei wird als strukturiertes Objekt in den Speicher geladen.
- Embedding-Generierung: Eine Drittanbieter-Bibliothek, wie beispielsweise sentence-transformers, wird verwendet, um für den Wert des text-Feldes jedes Elements in der JSON-Datei ein Embedding zu erzeugen. Das Modell sentence-transformers/all-MiniLM-L6-v2 von Hugging Face ist ein gängiges Beispiel hierfür.
- Datenanreicherung: Das generierte Embedding wird als neues Feld neben dem korrespondierenden text-Feld in das JSON-Objekt eingefügt.
- Speichern: Das modifizierte JSON-Objekt mit den hinzugefügten Embeddings wird zurück in die Ursprungsdatei oder eine neue Datei geschrieben.
Dieser Ansatz gewährt volle Kontrolle über den Prozess und lässt sich in bestehende Arbeitsabläufe integrieren, die auf dem Austausch von JSON-Dateien basieren.