Text Extraktion

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
wagneru
User
Beiträge: 29
Registriert: Freitag 3. Januar 2014, 13:55
Wohnort: Groß-Gerau

Hallo,

ich müsste aus mehreren tausend strukturierten Datein Inhalte extrahieren. Bspw. kommt im Text vor:
"Geeignete Löschmittel: Wassersprühstrahl, Kohlendioxid" alles hinter "Geeignet Löschmittel:" landet dann in einem Textfeld. Die Logik könnte allgemein so aussehen "Starttext" .. alles bis zu "Endtext" entnehmen und Inhalte in
Felder übernehmen. Meine stille Hoffnung ist, das es hierfür Bibliotheken gibt, die dies erleichtern (und keine regulären Audrücke :) ).
Für Hinweise, wie man hier vorgeht wäre ich dankbar.

Sollte ich nicht klar kommen, können sich auch Entwickler/innen melden, die dies im Rahmen eines Werkvertrages erledigen können (über PM).
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Welche Struktur haben die Dateien denn? Ist das ein fixes und konsistentes Format?

In Deinem Beispiel wäre der Doppelpunkt ja offenbar das Trennzeichen. Mit einfachsten Python-Bordmitteln könnte man das einfach extrahieren:

Code: Alles auswählen

data = "Geeignete Löschmittel: Wassersprühstrahl, Kohlendioxid"
print(data.split(":")[1].strip())
> Wassersprühstrahl, Kohlendioxid
Da wären ein paar mehr Infos über das Format und dessen Herkunft angebracht! :-)

Eine ganz und gar universelle Lösung wird es kaum geben...
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
wagneru
User
Beiträge: 29
Registriert: Freitag 3. Januar 2014, 13:55
Wohnort: Groß-Gerau

Hyperion hat geschrieben:Welche Struktur haben die Dateien denn? Ist das ein fixes und konsistentes Format.
Da wären ein paar mehr Infos über das Format und dessen Herkunft angebracht! :-)
Berechtigter Einwand. Daher habe ich hier einen Ausschnitt aus der Datei (die Originale sind sogenannte Sicherheitsdatenblätter und umfassen ca. 5 - 12 Seiten) angefügt. Interessant wären in diesem Fall immer Informationseinheiten, wie die Löschmittel oder auch ganze Abschnitte.

Code: Alles auswählen

ABSCHNITT 5. Maßnahmen zur Brandbekämpfung 
 5.1 Löschmittel  
 Geeignete Löschmittel
 Kohlendioxid (CO2), Schaum, Löschpulver 
 Ungeeignete Löschmittel
 Für diesen Stoff/ dieses Gemisch existieren keine Löschmittel-Einschränkungen. 
  
 5.2 Besondere vom Stoff oder Gemisch ausgehende Gefahren  
 Brennbarer Stoff, Dämpfe sind schwerer als Luft und breiten sich über dem Boden aus. 
 Explosionsfähige Gemische mit Luft sind schon bei Normaltemperaturen möglich. 
 Auf Rückzündung achten. 
 Im Brandfall Entstehung gefährlicher Brandgase oder Dämpfe möglich. 
  
 5.3 Hinweise für die Brandbekämpfung  
 Besondere Schutzausrüstung für die Brandbekämpfung
 Aufenthalt im Gefahrenbereich nur mit umluftunabhängigem Atemschutzgerät. Hautkontakt 
 durch Einhalten eines Sicherheitsabstandes oder Tragen geeigneter Schutzkleidung vermeiden. 
  
Die Zeilennummern bitte wegdenken.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da das reiner *Text* und kein *Markup* ist, wird ein Parsing dabei immer ein wenig knifflig; denn einleitende Suchwörter wie "Ungeeignete Löschmittel" könnten ja auch irgend wo in einem Satz stehen. Da braucht man sehr präzise Einschränkungen und/oder eine gute Fehlertolleranz.

Du musst hier noch wesentlich besser definieren, *was* Du hier extrahieren willst! Du musst Dir im klaren sein, *wie* man interessante Informationen erkennt und zudem auch *was* diese darstellen. Also sprich wie soll eine Zieldatenstruktur überhaupt aussehen?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
wagneru
User
Beiträge: 29
Registriert: Freitag 3. Januar 2014, 13:55
Wohnort: Groß-Gerau

Hallo,

danke für deine Zeit bisher. Die gewünschten Abschnitte kann man (bis auf eine Ausnahme) immer sehr gut definieren. Im obigen Beispiel wäre das der gesamte Text nach Kapitel 5.1 (ohne die Überschrift) bis zur Überschrift Kapitel 5.2. Die Textblöcke um die es geht kann man alle genau angeben. Der von oben Text (Kapitelüberschrift) und der nach unten
begrenzende Text ist bekannt.

Zum fachlichen Hintergrund: aus Sicherheitsdatenblättern muss jeder Arbeitgeber sog. Betriebsanweisungen nach Gefahrstoffverordnung erstellen (nach TRGS 555, wer nachlesen will :)). Um unseren Mitarbeitern zu ersparen, diese Daten stumpfsinnig abzutippen, sollen Entwürfe schon mit Text gefüllt angeboten werden.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

wagneru hat geschrieben:Die gewünschten Abschnitte kann man (bis auf eine Ausnahme) immer sehr gut definieren. Im obigen Beispiel wäre das der gesamte Text nach Kapitel 5.1 (ohne die Überschrift) bis zur Überschrift Kapitel 5.2. Die Textblöcke um die es geht kann man alle genau angeben. Der von oben Text (Kapitelüberschrift) und der nach unten
begrenzende Text ist bekannt.
Und wie lautet da eine allgemeine Definition? Die hast Du uns immer noch nicht verraten! Handelt es sich immer um die "x.1"-Abschnitte, also 1.1, 2.1, 3.1 usw.? Wenn Du etwas automatisiert erledigen willst, brauchst Du allgemein gültige Regeln. Am einfachsten ist dies über strukturelle Merkmale (also Schlüsselwörter, Syntax wie Satzzeichen, Spiegelstriche usw.) zu regeln; eine inhaltliche Analyse wird dagegen wesentlich schwerer.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Ich vermute mal man kann mehr als nur die Abschnittsnummerierung nehmen, nämlich wohl tatsächlich '5.1 Löschmittel'. Habe im Netz mal nach solchen Dokumenten gesucht und die sind nach irgendeiner (gesetzlichen?) Vorlage erstellt und Abschnit 5.1 hat offenbar als Titel immer 'Löschmittel'. Zumindest in den paar Dokumenten die ich mir angeschaut hatte.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ja gut, dann wäre das also immer von einer Zeile, die bekannt ist ("5.1 Löschmittel") bis einschließlich der ersten Leerzeile, oder, falls das zu strikt ist, bis zur nächsten Zeile, die mit "Nummer.Nummer" beginnt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Antworten