Praktische Einführung und Programmierung
Stefan Bosse
Universität Koblenz - FB Informatik
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung ::
Wie werden Texte maschinell verarbeitet?
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung ::
Wie werden Texte maschinell verarbeitet?
Welche Algorithmen und Datenstrukturen werden gebraucht?
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung ::
Wie werden Texte maschinell verarbeitet?
Welche Algorithmen und Datenstrukturen werden gebraucht?
Was sind reguläre Ausdrücke und wie und wofür verwendet man sie?
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Anwendungen für Textverarbeitung
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
https://files.ifi.uzh.ch/cl/hess/classes/le/regex.0.l.pdf
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
Direkte Angabe von Zeichenketten, also Abfolgen von Zeichen, sind der einfachste Fall:
/einzig//einzig|winzig/
Suche nach dem Vorkommen von "einzig" im Text oder alternativ durch "|" getrennt nach "einzig" und "winzig" (Disjunktion).
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
/[A-Z]/
ein beliebiger Grossbuchstabe (aber ohne Umlaute, ß und Buchstaben mit Akzenten)/[A-Za-z]/
ein beliebiger Gross- oder Kleinbuchstabe (ditto)/[0-9]/
eine beliebige Ziffer/[ab17G-K]/
/[^abc]/
passt auf alle Zeichen außer a,b und c. Man kann bei der Suche das Flag "g" hinter den Ausdruck setzen. Dann wird dieser mehrfach angewendet und liefert alle passenden Ergebnisse.
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
Sollen Sequenzen von Zeichen die aus einzelnen Teilen zusammengesetzt sind gesucht werden braucht man Wiederholungen.
Quantifikatoren geben an, wie häufig das direkt vorangehende Zeichen bzw. die direkt vorangehende Gruppe oder Zeichenklasse vorkommen können soll.
*
Keinmal oder beliebig oft+
Mindestens einmal?
Einmal oder keinmalBeispiel:
s="aabbba"match(/a+|b+/g,"abbaab") => [ 'a', 'bb', 'aa', 'b' ]
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke und Automaten
Reguläre Ausdrücke bzw. deren Anwendung ist i.A. zustandslos und kontextfrei.
Folgendes Beispiel:
if a=0 then a=1 end
Das "then" ist nur nach einem "if" zulässig, dazwischen befindet sich ein Ausdruck. Es gibt also einen Kontext. Das Gleichheitszeichen hat hier zwei Bedeutungen: Vergleich und Zuweisung (wie z.B. in der Programmiersprache Basic). Es gibt also einen Kontext. Ist =
in einem Ausdruck dann ist es ein Vergleich und liefert einen Booleschen Wert, ist es Bestandteil einer Anweisung dann ist es eine Zuweisung. Das kann ein regulärer Ausdruck nicht unterscheiden.
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke und Automaten
Mit einer Ausnahme:
Rückverweise sind ein sehr mächtiges Instrument beim Schreiben von regulären Ausdrücken.
Innerhalb des RA kann mit "\i" auf Teilmuster(matches) zurückverwiesen werden:
/\b([egin]{3,3}).*?\b\s\1/
Suche nach dem Vorkommen einer Zeichenkette, die mit einer Wortgrenze beginnt, gefolgt von genau 3 Zeichen, die jeweils entweder "e", "g", "i" oder "n" sind (dieses Muster wird als erstes Muster gespeichert), gefolgt von beliebigen Zeichen bis zur ersten Wortgrenze, gefolgt von einem white space, gefolgt vom ersten Muster
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Reguläre Ausdrücke und Automaten
Man kann jeden regulären Ausdruck in einen Endlichen Zsutandsautomaten übersetzen. RA sind aber viel mächtiger und ausdrucksstärker. RA können Graphen beschreiben!
Endlicher Automat zum regulären Ausdruck
0+1(0+1)*
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Suche in Texten
Jetzt wollen wir uns einen Algorithmus für eine Suche eines einfachen Musters in einem Text anschauen.
function BruteForceSearch (text, pat) { // Eingabe: zu durchsuchender Text text der Länge n, // gesuchtes Muster pat der Länge m for (i= 0; i<= n − m;i++) { j = 0; while (j < m && pat[j] == text[i + j]) { j = j + 1 } if (j >= m) return i } return −1}
Zwei geschachtelte Schleifen für die Brute-Force-Suche in Texten
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Suche in Texten
addp
Ablauf beim Brute-Force-Algorithmus
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Suche in Texten
Das Problem des Brute-Force-Verfahrens ist im Wesentlichen, dass bei Feststellen einer Nichtübereinstimmung sowohl der Zeiger im Muster als auch der Zeiger im Text zurückgesetzt werden.
An dieser Stelle setzt der Algorithmus von Knuth, Morris und Pratt an, der die Suche mit einer Komplexität von O(n + m) ermöglicht.
function KMPSearch (text, pat) { // Eingabe: zu durchsuchender Text text der Länge n, // gesuchtes Muster pat der Länge m j = 0; for (i = 0;i<n;i++) { while (j >= 0 && pat[j] != text[i]) j = next[j] j = j + 1; if (j = m) return i − m + 1 } return -1}
Zwei geschachtelte Schleifen für die Brute-Force-Suche in Texten. Es wird ein voraus berechnetes Hilfsfeld next verwendet was Rücksrpungpositionen bei Nichtübereinstimmung angibt
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Suche in Texten
function initNext (pat) { i = 0, j = − 1 next[0] = − 1 while (i < pat.length() − 1) { while (j > = 0 && pat[i] != pat[j]) j = next[j] i++; j++ next[i] = j } return next;}
Berechung des Hilfsfeldes next
Die Anzahl der zu verschiebenden Stellen ist dabei nur vom Muster abhängig. Der Knuth-Morris-Pratt-Algorithmus (kurz »KMP«) nutzt dies aus, indem in einem Vorverarbeitungsschritt die Struktur des Musters analysiert wird. Daraus kann abgeleitet werden, wie weit im Fall einer Nichtübereinstimmung zurückgegangen werden muss. Diese Informationen werden in einem Feld gespeichert, das als next- bzw. border-Feld oder manchmal auch als Fehlerfunktion bezeichnet wird. Es enthält für jede Position des Musters die Distanz für eine sichere Verschiebung. Diese Werte werden bestimmt, indem für jedes j das längste Präfix des Musters pat ermittelt wird, das auch Suffix von pat[1… j] ist.
Stefan Bosse - Algorithmen und Datenstrukturen - Modul X Textverarbeitung :: Suche in Texten
Berechnung des next Feldes für das Muster
ABCAAB