Indexieren und Suchen

Ähnliche Dokumente
Indexieren und Suchen

Indexieren und Suchen

Non-Standard-Datenbanken

Zeichenketten Benedikt Straßner. Programming Systems Group Martensstr Erlangen Germany

Algorithmen und Datenstrukturen

1.3 Knuth-Morris-Pratt-Algorithmus

Informatik II, SS 2018

Kapitel 2. Suche nach endlich vielen Wörtern. R. Stiebe: Textalgorithmen, Winter 2005/06 113

Zeichenketten. 10. Mai 2017 Simon Bachstein Simon Bachstein Hallo Welt -Seminar - LS 2 Zeichenketten 1

Effiziente Algorithmen 2

Zeichenketten. 29. April 2015 Benedikt Lorch. Benedikt Lorch Zeichenketten April

Algorithmische Bioinformatik 1

Pat Trees und Pat Arrays Datenstrukturen zur effizienten Suche in Texten

Text Analytics. Referat: Improving Suffix Array Locality for Fast Pattern Matching on Disk

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Entartete Suchbäume. Beispiel: Balancieren von Suchbaum. Wintersemester 2012/13

Algorithmen und Datenstrukturen II

Algorithmische Bioinformatik

2.2 Der Algorithmus von Knuth, Morris und Pratt

Algorithmische Bioinformatik 1

Algorithmen und Datenstrukturen II. Suchen in Texten. Prof. Dr. Oliver Braun. Fakultät für Informatik und Mathematik Hochschule München

ADS: Algorithmen und Datenstrukturen 1

8.4 Suffixbäume. Anwendungen: Information Retrieval, Bioinformatik (Suche in Sequenzen) Veranschaulichung: DNA-Sequenzen

Suchen in Texten. Naives Suchen Verfahren von Knuth-Morris-Pratt Verfahren von Boyer-Moore Ähnlichkeitssuchen Editierdistanz

Algorithmen und Datenstrukturen 2

Suche in Texten. Verschiedene Szenarios: Dynamische Texte. Texteditoren Symbolmanipulatoren. Statische Texte

Algorithmische Bioinformatik 1

ADS: Algorithmen und Datenstrukturen 1

ADS: Algorithmen und Datenstrukturen 1

Bücher und Artikel zum Thema

Materialsammlung zur Implementierung von Information Retrieval Systemen

Informatik II, SS 2014

Zeichenketten. Michael Fularczyk Michael Fularczyk Zeichenketten / 41

Algorithmen und Datenstrukturen

1.8 Shift-And-Algorithmus

Algorithmen und Komplexität Lösungsvorschlag zu Übungsblatt 8

String - Matching. Kapitel Definition

Universität Bremen. Textsuche. Thomas Röfer. Naive Suche Verfahren von Knuth-Morris-Pratt Verfahren von Boyer-Moore Ähnlichkeitssuche Editierdistanz

String matching: Überblick

19. Dynamic Programming I

Übersicht. Volltextindex Boolesches Retrieval Termoperationen Indexieren mit Apache Lucene

Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen (für ET/IT) Programm heute. Sommersemester Dr. Tobias Lasser

Informatik II, SS 2018

19. Dynamic Programming I

Algorithmen auf Sequenzen

Anwenundg regulärer Sprachen und endlicher Automaten

ADS: Algorithmen und Datenstrukturen 1

TU München. Hauptseminar: WS 2002 / Einführung in Suffix - Bäume

Algorithmen und Datenstrukturen (für ET/IT)

Algorithmen und Datenstrukturen (Informatik II) SS Klausur

Informatik II, SS 2016

Informatik II, SS 2016

AUTOMATENBASIERTE ALGORITHMEN UND EXAKTES 2D-PATTERN-MATCHING. Vincent Holluba

1.5 Boyer-Moore-Algorithmus

Suchen und Sortieren Sortieren. Heaps

Proseminar String Matching

elementare Datenstrukturen

Der Boyer-Moore Algorithmus

Algorithmische Bioinformatik

Algorithmen und Datenstrukturen

Wann sind Codes eindeutig entschlüsselbar?

2. Woche Eindeutige Entschlüsselbarleit, Sätze von Kraft und McMillan, Huffmancodierung

Knuth Morris Pratt Algorithmus

Programm heute. Algorithmen und Datenstrukturen (für ET/IT) Such-Algorithmen für Wörterbücher. Wörterbuch. Sommersemester Dr.

Aufgabe 3: Erste Versuche im Indexieren des Templates. Ulf Leser Wissensmanagement in der Bioinformatik

Algorithmen und Datenstrukturen 2

Grundlagen: Algorithmen und Datenstrukturen

Algorithmen und Datenstrukturen

Informatik II Precomputation

Rückblick: Längste gemeinsame Zeichenkette

Inverted Files for Text Search Engines

7. Sortieren Lernziele. 7. Sortieren

Algorithmen und Datenstrukturen 1

Mehrwegbäume Motivation

Bioinformatik Für Biophysiker

Algorithmen und Datenstrukturen 2 VU 3.0 Nachtragstest SS Oktober 2014

Technische Universität München SoSe 2018 Fakultät für Informatik, I Juli 2018 Dr. Stefanie Demirci. Aufgabe 1 Sortieren mit Heap Sort

Algorithmen II Vorlesung am

Algorithmen auf Sequenzen Vorbereitung zur Prüfung

19. Dynamic Programming I

Dynamische Datenstrukturen

Sortieren und Suchen. Jens Wächtler Hallo Welt! -Seminar LS 2

Das Suchproblem 4. Suchen Das Auswahlproblem Suche in Array

Kapitel 5. Textalgorithmen. 5.1 Grundbegriffe

Algorithmen und Datenstrukturen 2

Klausur Informatik 2: Algorithmen und Datenstrukturen. Blättern Sie nicht um bevor Sie dazu aufgefordert werden!

21. Greedy Algorithmen. Aktivitätenauswahl, Fractional Knapsack Problem, Huffman Coding Cormen et al, Kap. 16.1, 16.3

1. Musterlösung. Problem 1: Average-case-Laufzeit vs. Worst-case-Laufzeit ** i=1

0 i = n w n > k v n. V (i +1,k), max v i + V (i +1,k w i )

Das Suchproblem. Gegeben Menge von Datensätzen. Beispiele Telefonverzeichnis, Wörterbuch, Symboltabelle

3. Vorlesung. Skip-Pointer Komprimierung der Postings Speicherung des Dictionarys Kontext-Anfragen. Seite 55

Suffixautomaten. Stringologie. Weitere mögliche Datenstrukturen, die uns Zugriff auf die Suffixe eines Suchtextes erlauben.

Bioinformatik Für Biophysiker

Lernmodul 7 Algorithmus von Dijkstra

ADS: Algorithmen und Datenstrukturen

Informatik II, SS 2014

4.9.7 Konstruktion der Suffixbäume

Algorithmen und Datenstrukturen 12

Transkript:

Universität Potsdam Institut für Informatik Lehrstuhl Maschinelles Lernen Indexieren und Suchen Tobias Scheffer Paul Prasse Michael Großhans

Überblick Index-Datenstrukturen Invertierte Indizes Suffix-Bäume und -Arrays Signaturdateien Suchalgorithmen Boolesche Suche Sequentielle Suche ohne Indexstruktur String-Matching String-Matching mit Indexstruktur 2

Invertierter Index Tries Elementare Datenstruktur für Retrieval-Aufgaben. Kanten sind mit Buchstaben beschriftet. Knoten sind leer oder mit Wörtern und Fundstellen beschriftet. 1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has many words. Words are made from letters. l t w m Letters: 60 a Text: 11,19 Words:33,40 d n Made: 50 Many: 28 3

Invertierter Index Konstruktion eines Tries Beginne mit einem leeren Baum und füge iterativ die Wörter in den Trie ein: Starte an Wurzel, iteriere über Buchstaben, Wenn Terminalknoten mit gleich Wort erreicht ist, füge Position hinzu, fertig. Wenn Terminalknoten mit anderem Wort erreicht wird, ersetze durch interne Knoten, bis Unterschied zwischen altem und neuem Wort erreicht ist, dann Verzweigung und zwei neue Terminalknoten, fertig. Wenn eine Kante den Buchstaben akzeptiert, folge der Kante. Sonst lege eine neue Kante an, beschrifte mit aktuellem Buchstaben und lege Terminalknoten an, der mit aktuellem Wort und Position beschriftet ist. 4

Invertierter Index Was ist das? 1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has many words. Words are made from letters. Terme Letters Made Many Text words Vorkommen 60 50 28 11, 19 33, 40 Abbildung von Termen auf Dokumente / Textpositionen. Oft werden noch Zusatzinformationen gespeichert: Schriftgrad, HTML-Tag 5

Invertierter Index Speicherbedarf für Vokabular: zwischen n 0.4 und n 0.6. Speicherbedarf für Liste der Vorkommen: zwischen 0.3 x Textlänge und 0.4 x Textlänge. Wenn nur Dokumente (nicht Wortpositionen) indiziert werden, 0.2 bis 0.3 x Textlänge. Problem: Hoher Speicherbedarf. Lösung: Speicherreduktion durch Blockadressierung: z.b. Aufteilung der Texte in 256 Blöcke, belegt 0.05 x Textlänge. 6

Invertierter Index Blockadressierung 1 2 3 4 This is a text. A text has many words. Words are made from letters. Terme Letters Made Many Text words Vorkommen 4 4 2 1, 2 3 Bestimmung der genauen Textposition mit sequentieller Suche. 7

Invertierter Index Aufbau eines invertierten Index Iteriere über alle Texte, iteriere über alle Positionen des Textes, an denen ein neues Wort beginnt. Füge (Wort, Position) sortiert in einen Trie ein. Wenn Speicher voll ist, dann speichere Trie, lade einen Unterbaum in den Speicher, berücksichtige nur Wörter, die in diesen Unterbaum gehören. Dann abspeichern, mit nächstem Unterbaum weitermachen, dazu Text neu iterieren. Traversiere den Trie und schreibe die Wörter in den invertierten Index. 8

Invertierter Index Große Datensammlungen Iteriere über Dokumente, parsiere Tokens (Wörter). Füge Tokens mit Textpositionen in unsortierte Liste ein. Hänge alle unsortierten Listen aneinander. Eliminiere doppelt vorkommende Terme, füge die Vorkommen zu einer Liste zusammen. Sortiere die Listen. Voraussetzung: Liste muss in den Speicher passen. 9

Invertierter Index Große Datensammlungen Lies Dokumente in k Blöcken ein. Bilde Termliste für jeweiligen Block. Sortiere lokalen Index für den Block, speichere. Merge lokale Indizes in log 2 k Ebenen. Für alle Ebenen, für alle Paare, sequentiell einlesen, mergen, abspeichern. 10

Invertierter Index Suche Gegeben: Suchanfrage q. Schlage einzelne Terme der Suchanfrage im Index nach, dazu Binärsuche in der Termliste. Greife auf die gefundenen Dokumente zu. Löse Phrasen-, Nachbarschafts- und Boolesche Anfrage anhand der Dokumente auf. (Bei Blockadressierung, Suche in den Blöcken.) Liste der Terme passt in der Regel in den Hauptspeicher, Listen der Vorkommen aller Terme häufig nicht. (Beispiel: Suchmaschiene) 11

Invertierter Index Anwendung: Rechtschreibung Oft hat genauer Suchbegriff keinen Treffer: Z.B. bei falscher Rechtschreibung. Erweitere Suchanfrage um Terme, die Edit-Abstand von höchstens x haben. Verlangsamt die Suche sehr. Lösung: nur, wenn ursprüngliche Anfrage keinen Treffer liefert. 12

Invertierter Index Kontextanfragen Finde Listen der Vorkommen aller Anfrageterme. Listen sind nach Position sortiert. Setze Zeiger auf die ersten Listenelemente. Wiederhole bis eine der Listen leer ist: Wenn Positionen aller aktuellen Listenelemente hintereinander folgen bzw. dicht genug beieinander liegen, dann haben wir eine Fundstelle. Setze den Listenzeiger, der auf die niedrigste Textposition zeigt, weiter. Aufwand: O(n 0.4 0.8 ) 13

Invertierter Index Probleme Für Nachbarschaftsanfragen nicht so gut geeignet. Erfordert Tokenisierung (geht nicht für DNA- Sequenzen). Betrachte nicht einzelne Token, sondern alle Suffixe eines Textes. Idee von Suffix-Bäumen: Text ist ein einziger String, jede Position ist ein Suffix (von hier bis zum Ende). Trie-Struktur über alle Suffixe. 14

Invertierter Index Suffix-Trie Indexpunkte können Wortanfänge oder alle Stringpositionen sein. Text ab Position: Suffix. This is a text. A text has many words. Words are made from letters. Suffixe: text. A text has many words. Words are made from letters. text has many words. Words are made from letters. many words. Words are made from letters. words. Words are made from letters. Words are made from letters. made from letters. letters. 15

Invertierter Index Suffix-Trie Aufbau eines Suffix-Tries: Für alle Indexpunkte: Füge Suffix ab Indexpunkt in den Trie ein. 1 6 9 11 17 19 24 28 33 40 46 50 55 60 This is a text. A text has many words. Words are made from letters. Suffix-Trie: l m t w 60 a d n 50 28 e x t o r d s. 11 19 33. 40 16

Invertierter Index Patricia-Tree Ersetze interne Knoten mit nur einer ausgehenden Kante durch Überleseknoten, beschrifte sie mit der nächsten zu beachtenden Textposition. Suffix-Trie: Patricia-Tree: l m t w 60 l m t w 60 3 5 a d n 50 28 e x t o r d s d. 50 11 n 28 19 33. 6 40. 11 19. 33 40 17

Invertierter Index Suche im Suffix-Trie Eingabe: Suchstring, Wurzelknoten. 1. Wiederhole 1. Wenn Terminalknoten, liefere Position zurück, überprüfe, ob Suchstring an dieser Position steht. 2. Wenn Überleseknoten, springe bis zur angegebenen Textposition weiter. 3. Wenn Verzweigungsknoten, folge der Kante, die den Buchstaben an der aktuellen Position akzeptiert. 2. Bis zum Abbruch in Schritt 1.1. 18

Invertierter Index Suffix-Trie Konstruktion: O(Länge des Textes). Algorithmus funktioniert schlecht, wenn die Struktur nicht in den Speicher passt. Problem: Speicherstruktur wird ziemlich groß ca. 120-240% der Textsammlung, selbst wenn nur Wortanfänge indexiert werden. Lösung: Suffix-Arrays Kompaktere Speicherung. 19

Invertierter Index Suffix-Array Suffix-Trie in lexikographische Reihenfolge bringen. Suffix-Array = Folge der Indexpositionen. Suffix-Trie, Lexikographisch sortiert: Suffix-Array: 60 50 28 11 19 33 40 w m t a e x t o r d s l d n.. 60 50 28 11 19 33 40 20

Invertierter Index Suche in Suffix-Arrays: Binärsuche Eingabe: Suchstring s, Suffix-Array S 1. A = 1 2. E = # Elemente des Arrays. 3. Wiederhole bis A = E 1. M = Mittelpunkt (A, E). 2. Wenn s = Text(S[M]), liefere Textposition 3. Wenn s < Text(S[M]), E = Mittelpunkt (A, M). 4. Sonst A = Mittelpunkt (M, E). Suffix-Bäume: O(Länge des Suchstrings) Suffix-Arrays: O(log(Länge der Textsammlung)) Laufzeit ist schlechter!! 21

Invertierter Index Suche in Suffix-Arrays Binärsuche: log(textlänge) Problem: Viele Datenbankzugriffe. Lösung: Beschleunigung durch Supra-Index. Von jedem k-ten Eintrag werden die ersten Buchstaben in einem Array gespeichert. Zuerst Binärsuche in Supra-Index, ohne Datenbankzugriff, Danach Binärsuche in Unterabschnitt des Suffix- Arrays mit Datenbankzugriffen. Trade-Off zwischen Größe der Suffix-Struktur und Anzahl der Datenbankzugriffe. 22

Invertierter Index Suffix-Arrays mit Supra-Index Supra-Index: Lett text word Suffix-Array: 60 50 28 11 19 33 40 Binärsuche im Supra-Index (ohne Datenbankzugriff) Dann Binärsuche im entsprechenden Abschnitt des Suffix-Arrays (mit Datenbankzugriffen). Speicherbedarf ähnlich wie invertierter Index. 23

Invertierter Index Suffix-Arrays für großen Datensammlungen Lies Text blockweise ein, bilde lokale Suffix-Arrays, speichere. Für alle lokalen Suffix-Arrays: Lies inkrementell den gesamten Text ein, Suche alle Suffixe im lokalen Array, zähle, wie viele Suffixe zwischen den Einträgen fehlen. Daraus ergeben sich die Positionen im globalen Suffix-Array, die jeder Eintrag des lokalen Arrays am Ende einnehmen muss. Speichere Position in lokalem Array. Merge jetzt die Arrays inkrementell, ohne Zugriff auf den Text, berücksichtige nur auf Grundlage der gespeicherten Positionen. 24

Sequentielle Suche Suche eines Strings der Länge m in Text der Länge n ohne Indexstruktur. Brute Force: Für alle Positionen des Textes, iteriere über Suchstring, vergleiche, O(n x m). Suchstring passt: Fundstelle. Unterschied: Vergleich abbrechen. O(n) möglich? 25

Knuth-Morris-Pratt Algorithmus, um ein Muster in einer Zeichenkette zu finden. Nutzt Struktur des Suchmusters aus, indem teilweise Zeichen nach Missmatch übersprungen werden. Besteht aus zwei Teilen: Vorlaufalgorithmus: Bestimmt Präfixtabelle, die angibt, um wie viele Positionen das Muster bei einem Missmatch verschoben werden kann. Suchalgorithmus: Durchsucht Zeichenkette nach dem Muster mithilfe der Präfixtabelle. 26

Knuth-Morris-Pratt Vorlaufalgorithmus kmpproprocess(p) i = 1; j = 0; b[0] = 0; while (i < m) do if (p[j] == p[i]) // Match b[i] = j + 1; i = i + 1; j = j + 1; else if (j > 0) j = b[j-1]; else b[i] = 0; i = i + 1; // Missmatch Laufzeit O(m) Beispiel: j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Muster Präfixarray b[j] ist längster Suffix von p[0 j] der Präfix von p[0... m] ist. 27

Knuth-Morris-Pratt Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) vorberechnet j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: i 0 1 2 3 4 5 6 7 8 9 t d a d a c d a d a b p d a d a b 28

Knuth-Morris-Pratt Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: Mismatch bei i = 4 und j = 4: i 0 1 2 3 4 5 j = 6 7 b[4-1] 8 9 = 2 t d a d a c d a d a b p d a d a b 29

Knuth-Morris-Pratt Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: i 0 1 2 3 4 5 6 7 8 9 t d a d a c d a d a b p d a d a b d a d a b 30

Knuth-Morris-Pratt Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: Mismatch bei i = 4 i 0 1 2 3 4 5 und 6 7 j 8 = 92: t d a d a c d j a = d b[2-1] a b = 0 p d a d a b d a d a b 31

Knuth-Morris-Pratt Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: i 0 1 2 3 4 5 6 7 8 9 t d a d a c d a d a b p d a d a b d a d a b d a d a b 32

Knuth-Morris-Pratt - Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: i 0 1 2 3 4 Mismatch 5 6 7 8 9 bei i = 4 t d a d a c und d a d j = a 0: b p d a d a b i = 5 d a d a b d a d a b 33

Knuth-Morris-Pratt - Suchalgorithmus kmpsearch(t,p) b = kmppreprocess(p); i = 0; j = 0; while (i < n) do if (p[j] == t[i]) // Match if (j == m-1) return i-m+1; i = i+1; j = j+1; else if (j > 0) j = b[j-1]; else i = i + 1; // Mismatch Laufzeit O(n) j 0 1 2 3 4 p d a d a b b[j] 0 0 1 2 0 Beispiel: i 0 1 2 3 4 5 6 7 8 9 t d a d a c d a d a b p d a d a b d a d a b d a d a b d a d a b 34

Knuth-Morris-Pratt - Laufzeitanalyse Vorlaufalgorithmus hat Laufzeit von O(m). Es werden höchstens 2m -1 Vergleiche durchgeführt. Suchalgorithmus hat Laufzeit von O(n). Es werden höchstens 2n-m+1 Vergleiche durchgeführt. Da m in der Regel viel kleiner als n, ergibt sich eine Gesamtlaufzeit von O(n). Insgesamt werden maximal 2n + m Vergleiche durchgeführt. 35

Aho-Corasick-Trie Aho-Corasick-Trie Idee: mehrere Suchstrings Suchstrings werden in Automaten gespeichert, Kanten akzeptieren Buchstaben, Wenn keine passende Kante mehr existiert, Sprung über failure transition in Zustand, der der größten Übereinstimmung zwischen Text und einem Präfix eines Suchstrings entspricht. 36

Aho-Corasick-Trie - Konstruktion 1. Aufbau eines Präfixbaums, der alle Suchwörter enthält. Markiere Zustände, die Suchwörter akzeptieren. 2. Konstruiere failure transitions : Füge zu jedem Knoten (außer Wurzel) eine failure transition zu dem Knoten hinzu, der längster Suffix des Strings dieses Knotens ist. Beispiel: a, ab, bc, c () (a) (b) (c) (ab) (bc) 37

Aho-Corasick-Trie - Suche von Strings Starte an Wurzel, iteriere über Buchstaben Folge solange failure transitionen, bis ein Folgezustand erreicht wird, der aktuellen Buchstaben als Suffix enthält, wenn möglich. Wechsel zur Wurzel, sonst. Ausgabe: Gib alle Strings von akzeptierenden Zuständen als akzeptierte Suchstrings aus, die von dem aktuellem Knoten aus durch failure transitionen hin zur Wurzel besucht werden. 38

Aho-Corasick-Trie Suche am Beispiel () (a) (b) (c) (ab) (bc) (ca) (bca) Automat akzeptiert Strings a,ab,bc,bca,c,caa (caa) String Zustand Folgezustand Ausgabe abccab () () -> (a) a:1 bccab (a) (a) -> (ab) ab:2 ccab (ab) (ab) -> (b) -> (bc) c:3, bc:3 cab (bc) (bc) -> (c) -> () -> (c) c:4 ab (c) (c) -> (ca) a:5 b (ca) (ca) -> (a) -> (ab) ab:6 39

Weitere String-Matching-Algorithmen Eigenes, umfangreiches Thema. Bioinformatik. Boyer-Moore, Idee: Strings von hinten nach vorn vergleichen. Dann sind durchschnittlich größere Sprünge möglich. Suffix-Automaten. 40

Approximatives String-Matching Suche in y Substrings, die Abstand von höchstens k von x haben. Was ist guter Abstand? Edit-Abstand. Vertippmodell. Rechtschreibmodell. Semantisches Modell. 41

Approximatives String-Matching Suche in y Substrings, die Edit-Abstand von höchstens k von x haben. Dynamische Programmierung (ähnlich Forward- Backward oder Viterbi). Berechnung von C[0 m, 0 n]; C[i,j] = minimale # Fehler beim matchen von x[1 i] mit y[1 j]. C[0, j] = j C[i, 0] = i C[i, j] = O (nm) C[i-1, j-1], wenn x[i] = y[j] 1+min {C[i-1, j], C[i, j-1], C[i-1, j-1]}, sonst 42

Approximatives String-Matching - Beispiel C[0, j] = j C[i, 0] = i C[i, j] = C[i-1, j-1], wenn x[i] = y[j] 1+min {C[i-1, j], C[i, j-1], C[i-1, j-1]}, sonst a b c a b b b a a 0 1 2 3 4 5 6 7 8 9 c 1 1 b 2 a 3 b 4 a 5 c 6 43

Approximatives String-Matching - Beispiel C[0, j] = j C[i, 0] = i C[i, j] = C[i-1, j-1], wenn x[i] = y[j] 1+min {C[i-1, j], C[i, j-1], C[i-1, j-1]}, sonst a b c a b b b a a 0 1 2 3 4 5 6 7 8 9 c 1 1 2 b 2 a 3 b 4 a 5 c 6 44

Approximatives String-Matching - Beispiel C[0, j] = j C[i, 0] = i C[i, j] = C[i-1, j-1], wenn x[i] = y[j] 1+min {C[i-1, j], C[i, j-1], C[i-1, j-1]}, sonst a b c a b b b a a 0 1 2 3 4 5 6 7 8 9 c 1 1 2 2 b 2 a 3 b 4 a 5 c 6 45

Approximatives String-Matching - Beispiel C[0, j] = j C[i, 0] = i C[i, j] = C[i-1, j-1], wenn x[i] = y[j] 1+min {C[i-1, j], C[i, j-1], C[i-1, j-1]}, sonst a b c a b b b a a 0 1 2 3 4 5 6 7 8 9 c 1 1 2 2 3 4 5 6 7 8 b 2 2 1 2 3 3 4 5 6 7 a 3 2 2 2 2 3 4 5 5 6 b 4 3 2 3 3 2 3 4 5 6 a 5 4 3 3 3 3 3 4 4 5 c 6 5 4 3 4 4 4 4 5 5 46

Approximatives String-Matching - Beispiel a b c a b b b a a 0 1 2 3 4 5 6 7 8 9 c 1 1 2 2 3 4 5 6 7 8 = b 2 2 1 2 3 3 4 5 6 7 a 3 2 2 2 2 = 3 4 5 5 6 b 4 3 2 3 3 2 3 4 5 6 a 5 4 3 3 3 3 3 4 4 5 c 6 5 4 3 4 4 4 4 5 5 cbabac -> ababac -> abcabac -> abcabbac -> abcabbbac -> abcabbbaa = = = Löschen Einfügen Substitution Keine Änderung 47

Weitere Algorithmen zur Mustersuche in Strings Endliche Automaten für approximatives String- Matching. Suche nach regulären Ausdrücken: Konstruktion eines endlichen Automaten, der die Anzahl der Fehler beim akzeptieren zählt. 1. Umwandlung in NEA mit O(n) Zuständen. 2. Konvertierung des NEA in DEA mittels n Potenzmengenkonstruktion mit höchstens O( ) Zuständen. Laufzeit für das matchen eines Strings der Länge m mit einem DEA ist O(m). 48

String-Matching mit Index-Strukturen Inverse Indizes: wortbasiert. Für Phrasensuche werden alle Suchbegriffe nachgeschlagen, die Texte aneinandergehängt und in den Texten kann dann nach dem Muster gesucht werden. Zur approximativen String-Suche müssen alle Wörter mit Höchst-Edit-Abstand im Index nachgesehen werden. 49

String-Matching in Suffix-Bäumen und Suffix-Arrays String-Suche mit Suffix-Bäumen und Arrays kein Problem, aber jede Stringposition muss indexiert werden. Speicherbedarf: 1200-2400% der Textsammlung. Aktuelle Themen: Suche in komprimiertem Text, Suche mit komprimierten Indexdateien. 50

Fragen? 51