Fakultät für Elektrotechnik und Informatik Institut für Praktische Informatik Fachgebiet Datenbanken und Informationssysteme Duplikateliminierung in Bibliotheksdatenbanken Bachelorarbeit im Studiengang Informatik Lukas Schink 13.07.2015 Prüfer: Prof. Dr. Udo Lipeck Zweitprüfer: Dr. Hans Hermann Brüggemann Betreuer: Prof. Dr. Udo Lipeck Inhaltsverzeichnis 1 Einleitung 1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 Aufgabe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Überblick über die Arbeit . . . . . . . . . . . . . . . . . . . . . . . . . 2 Grundlagen 2.1 Matching . . . . . . . . . . . 2.1.1 Vergleichsfunktionen . 2.1.2 Matching-Funktion . . 2.2 Fusion . . . . . . . . . . . . . 2.3 Blocking/Indexing . . . . . . 2.3.1 Standard Blocking . . 2.3.2 Sorted Neighbourhood 2.3.3 q-Gram-Indexing . . . . . . . . . . . . . . . . . . . 3 Zustandsanalyse 3.1 Aufbau der Schriftendatenbank . 3.1.1 Tabelle SCHRIFT . . . . . . 3.1.2 Tabelle FLIT . . . . . . . . 3.1.3 Tabelle ABSCHLUSSARBEIT 3.1.4 Tabelle LITERATURINDEX . 3.1.5 Tabelle ANSCHAFFUNG . . . 3.1.6 Tabelle ABTEILUNG . . . . 3.1.7 Tabelle SCHRIFTTYP . . . . 3.2 Datenbestand . . . . . . . . . . . 3.2.1 Duplikatbeispiele . . . . . 3.2.2 Statistiken . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Entwurf 4.1 Anforderungen . . . . . . . . . . . . . 4.2 Auswahl der Datenbanktabellen . . . . 4.3 Matching-Prozedur . . . . . . . . . . . 4.3.1 Matching-Ansatz . . . . . . . . 4.3.2 Edit-Distanz . . . . . . . . . . . 4.3.3 Betrachtung der Objekt-Ebene . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 2 3 . . . . . . . . 5 5 5 7 11 11 12 12 14 . . . . . . . . . . . 17 17 18 18 19 19 20 20 21 22 22 24 . . . . . . 25 25 26 27 27 28 28 III Inhaltsverzeichnis 4.4 4.5 Datenbankschema . Webschnittstelle . . 4.5.1 Match-Tool 4.5.2 Fusions-Tool . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Implementierung 5.1 Datenbankschema . . . . . . . . . . . . 5.2 PL/SQL: Matching-Prozedur . . . . . 5.2.1 Aufbau . . . . . . . . . . . . . . 5.2.2 Iteration über Spalten . . . . . 5.2.3 Spaltenvergleiche . . . . . . . . 5.2.4 Laufzeit und Optimierungen . . 5.3 PHP-Webschnittstelle . . . . . . . . . . 5.3.1 Anbindung der Datenbank . . . 5.3.2 Login . . . . . . . . . . . . . . . 5.3.3 Einstellen der Gewichte . . . . 5.3.4 Starten der Matching-Prozedur 5.3.5 Ergebnisübersicht . . . . . . . . 5.3.6 Fusionsansicht . . . . . . . . . . 5.3.7 Auflösen der Relationen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Handbuch 6.1 Installation/Vorbereitung . . . . . . . . . . . . . 6.1.1 Anlegen des Views . . . . . . . . . . . . 6.1.2 Das Kontrollschema anlegen . . . . . . . 6.1.3 Matching-Prozedur . . . . . . . . . . . . 6.1.4 PHP-Skripte . . . . . . . . . . . . . . . . 6.2 Benutzung . . . . . . . . . . . . . . . . . . . . . 6.2.1 Einen neuen Matching-Durchlauf anlegen 6.2.2 Gewichte einstellen . . . . . . . . . . . . 6.2.3 Einen Matching-Durchlauf starten . . . . 6.2.4 Ergebnisse ansehen . . . . . . . . . . . . 6.2.5 Fusions-Übersicht . . . . . . . . . . . . . 6.2.6 Ein Paar fusionieren . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 31 32 32 . . . . . . . . . . . . . . 35 35 37 37 38 39 40 41 41 42 42 43 44 44 45 . . . . . . . . . . . . 47 47 47 47 47 47 48 48 49 49 50 51 51 7 Reflexion 53 7.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 7.2 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Abbildungsverzeichnis 55 Tabellenverzeichnis 57 Literaturverzeichnis 59 IV 1 Einleitung 1.1 Motivation Im Bibliothekswesen werden Duplikate als „Dubletten“ bezeichnet, wobei damit zwei unterschiedliche Bedeutungen verknüpft sind. Zum Einen werden real existierende physische Kopien von Werken als Dubletten bezeichnet. Diese sind in der Regel gewollt und wurden gezielt angeschafft, um bei großer Nachfrage nach bestimmten Werken mehrere Exemplare verleihen zu können. Die andere Bedeutung bezieht sich auf mehrfach vorhandene Datensätze innerhalb des Bibliothekskatalogs, die aber das selbe Werk beschreiben. Dies entspricht dem Duplikatbegriff, der in dieser Arbeit behandelt wird. Solche Duplikate entstehen typischerweise durch Fehleingaben beim Erfassen von Werken, wenn zuvor nicht geprüft wird, ob es bereits einen passenden Eintrag gibt, oder wenn mehrere Datenbestände zusammengeführt werden. Beide Fälle treten allgemein nicht nur bei Bibliotheksdatenbanken auf, sondern beispielsweise auch bei Kundendatenbanken in Unternehmen. Die daraus resultierenden Probleme sind ähnlich. Abgesehen von unnötig verbrauchtem Speicherplatz, ist die Pflege eines Duplikate enthaltenden Datenbestandes schwierig, da die Änderung eines Datensatzes möglicherweise Inkonsistenzen zu den bestehenden Duplikaten verursacht. Im Falle einer Bibliotheksdatenbank verhindern derartige Inkonsistenzen schlimmstenfalls eine effiziente Literaturrecherche: Bei der Suche nach einem Buch können beispielsweise mehrere Einträge vorhanden sein. Diese suggerieren, dass sich ein Buch in unterschiedlichen Abteilungen befindet, obwohl es real nur in einer Abteilung vorkommt. Weil die Änderung der Abteilung nur bei einem Eintrag erfasst wurde, das Duplikat aber noch auf dem alten Stand geblieben ist, sucht dann der Benutzer vergeblich in der falschen Abteilung. Wenn solche Duplikate entstanden sind, müssen diese folglich erkannt und aufgelöst werden, um die Benutzbarkeit zu gewährleisten. Aufgrund der Größe von Bibliotheksdatenbanken und der Inkonsistenzen zwischen den Duplikaten ist eine Bereinigung jedoch oftmals schwierig. Unter Bezeichnungen wie „data matching“, „Record-Linkage“, „data deduplication“, „duplicate detection“ oder „matching“ ist dieses Problem Gegenstand aktueller Forschung und auch dieser Arbeit. 1 1 Einleitung 1.2 Aufgabe Das Fachgebiet Datenbanken und Informationssysteme betreibt seit 25 Jahren eine Datenbank zur Erfassung des internen Literaturbestands, der hauptsächlich aus Forschungsliteratur, Abschlussarbeiten, und Lehrbüchern besteht. Eine Umstrukturierung und Integration verschiedener Datenbanken im Jahr 2005 hatte zur Folge, dass einige Schriftstücke mehrfach in der Datenbank erfasst wurden, manche mit teilweise abweichenden Angaben. Zudem sind im Laufe der Zeit zusätzliche Duplikate durch Eingabefehler entstanden. Deswegen ist das Ziel dieser Arbeit, eine Anwendung zu entwickeln, die das Auffinden und Zusammenführen dieser Mehrfachbeschreibungen innerhalb der Datenbank unterstützt. Im Laufe der Arbeit wurde deutlich, dass das Aufstellen geeigneter Kriterien zum Identifizieren tatsächlicher Duplikate fundiertes Domänenwissen erfordert. Daher wurde die Zielvorgabe um das Auffinden lediglich ähnlicher Einträge erweitert. So sollen nun auch Beziehungen, die keine echten Duplikate darstellen, wie z. B. Vorversionen von Dokumenten, erfasst werden, bevor diese durch einen Benutzer überprüft und endgültig entschieden werden. Durch Analyse der Datenbank sollen außerdem geeignete Kriterien ermittelt werden, um die Ähnlichkeit zweier Einträge zu bestimmen. Der Fokus liegt hierbei in der Implementierung eines Matching-Algorithmus zum Erkennen von ähnlichen Einträgen anhand der Kombination aller relevanten Attribute. Hierbei sollen Vergleichsoperationen innerhalb der Attribut-Ebene auf Wertegleichheit und einfache Ähnlichkeitsfunktionen beschränkt werden, da die Darstellung der Werte in den Einträgen bereits in einem separaten Projekt vereinheitlicht wird. Damit nach dem Matching eine Fusion der Datensätze durchgeführt werden kann, müssen die gefundenen Einträge vom Anwender entsprechend ihrer Beziehung zueinander, zum Beispiel als Duplikat, gekennzeichnet werden können. Dabei ist zu berücksichtigen, dass die Einträge nicht notwendigerweise in allen Attributen übereinstimmen. Daher ist zu empfehlen, spezielle Vorschriften zu erarbeiten, die festlegen, wie diese zusammenzuführen sind. Bei der Datenbank handelt es sich um eine Oracle-Datenbank der Version 12c. Operationen auf der Datenbank sind in SQL oder, wenn es sich um Prozeduren bzw. Funktionen handelt, in PL/SQL zu entwickeln. Der Anwendungsprototyp soll als Webapplikation mit PHP und JavaScript implementiert werden. Dies ermöglicht eine einfache Integration in das bereits bestehende Administrationssystem der Fachgebietsverwaltung. Aufbauend auf Ergebnissen dieser Arbeit kann anschließend systematisch Erfahrung über die Zusammenhänge der Daten gesammelt werden. 2 1.3 Überblick über die Arbeit 1.3 Überblick über die Arbeit Nach dem einleitenden ersten Kapitel werden in Kapitel 2 die zugrunde liegenden Verfahren und Algorithmen zu Matching und Fusion von Datenbanken beschrieben. Dazu zählen Funktionen zum Vergleich von Attributwerten, Methoden zum Klassifizieren der Datenbankeinträge in Ähnlichkeitsklassen und schließlich Blocking bzw. Indexing, um die Zahl der nötigen Vergleiche zu reduzieren. Kapitel 3 behandelt den Aufbau der Datenbank mit einer Beschreibung der ausschlaggebenden Tabellen. Im zweiten Abschnitt dieses Kapitels wird ein Überblick über typische Duplikate und statistische Daten bezüglich des Inhalts der Datenbank gegeben. Der Entwurf der in dieser Arbeit entwickelten Anwendung wird in Kapitel 4 erläutert. Hierzu werden zunächst die Anforderungen an die Anwendung beschrieben, bevor eine Auswahl der in Kapitel 3 beschriebenen Tabellen für das Matching erfolgt. Den Erläuterungen des gewählten Matching-Verfahrens folgend wird ein Datenbankschema entworfen, in dem die für den Betrieb der Anwendung benötigten Daten gespeichert werden können. Auch die Konzeption der Webschnittstelle, gegliedert in Match-Tool und Fusions-Tool wird hier dargestellt. Die konkrete Umsetzung wird in Kapitel 5 erläutert. Hierbei wird auf die Besonderheiten des verwendeten Datenbankschemas eingegangen sowie die Funktionsweise der Matching-Prozedur geschildert. Dabei wird auch auf die implementierten Optimierungen zur Verringerung der Laufzeit eingegangen. Nachfolgend wird aufgezeigt wie einzelne Aspekte der Webschnittstelle, darunter die asynchrone Ausführung der Matching-Prozedur im Hintergrund und das Eintragen der Spaltengewichtungen in die Datenbank, realisiert wurden. Eine Anleitung zur Benutzung der einzelnen Funktionen der Anwendung befindet sich in Kapitel 6. Zuletzt wird in Kapitel 7 ein Fazit gezogen, weiterhin werden Ansätze zur Erweiterung des Funktionsumfangs der entwickelten Anwendung gegeben. 3 2 Grundlagen Die Algorithmen und Verfahren, die zur Lösung der gegebenen Problemstellung verwendet werden können, umfassen Vergleichsfunktionen, Matching-Verfahren, die Fusion von Einträgen sowie Blocking- und Indexing-Algorithmen zur Reduktion der zu vergleichenden Paare. Ihre Eigenschaften und Funktionsweisen sind Gegenstand dieses Kapitels. 2.1 Matching Der Prozess des Auffindens von Duplikaten wird Matching genannt. Für jedes Feld der zu vergleichenden Einträge in der Datenbank, Records genannt, benötigt man zunächst eine für den Datentyp und den Inhalt passende Vergleichsfunktion, die die jeweiligen Werte aus den beiden Records vergleicht. So entsteht für jedes Record-Paar ein Vektor, der die Ähnlichkeitswerte für die einzelnen Attributwerte beinhaltet. Die Auswertung erfolgt mit Hilfe der eigentlichen Matching-Funktion, bei der dieser Ähnlichkeitsvektor im einfachsten Fall bei Übereinstimmung als „Match“ und bei Abweichungen als „Non-Match“ eingeteilt wird. Eine feinere Unterteilung, die auch ähnliche Ergebnisse als „Potential Match“ berücksichtigt, ermöglicht dem Benutzer, nicht eindeutige Fälle im Zuge einer Revision zu bewerten, so dass dieser entscheiden kann, ob es sich um ein Duplikat handelt oder nicht [Chr12b]. 2.1.1 Vergleichsfunktionen Eine Vergleichsfunktion arbeitet auf Attribut-Ebene. Durch sie wird ein Ähnlichkeitsvektor mit n Einträgen erstellt, wobei n die Anzahl der Attribute der zu vergleichenden Records ist. Hierbei beschreiben die einzelnen Felder des Vektors den Grad der Ähnlichkeit zwischen den verglichenen Attributwerten durch Werte im Intervall [0,1]. Sind die Attributwerte identisch, folgt daraus eine Ähnlichkeit von 1. Umgekehrt bedeutet ein Wert von 0, dass die Attributwerte gänzlich verschieden sind. Gleichheit Eine grundlegende Vergleichsfunktion ist die Überprüfung auf Gleichheit der Werte. Für die meisten Datentypen ist eine solche Funktion bereits im Datenbanksystem vordefiniert. Sie erlaubt keine graduellen Ähnlichkeiten, sondern liefert einen booleschen 5 2 Grundlagen Wert, der angibt ob die beiden Werte x1 und x2 exakt gleich sind, oder nicht. sim(x1 ,x2 ) = 1, falls x1 = x2 0, falls x1 = 6 x2 (2.1) Dadurch eignet sich die Funktion nur eingeschränkt für den Vergleich von StringWerten, da bereits ein kleiner Tippfehler zu einer Abweichung führt, so dass die Werte nicht als gleich bzw. ähnlich erkannt werden können. Edit-Distanz Die Edit-Distanz ist eine Vergleichsfunktion für String-Werte. Sollen beispielsweise die Strings s1 und s2 verglichen werden, wird eine Matrix aufgestellt, deren Zellen d[i, j] die Edit-Distanz der ersten i Buchstaben von s1 und der ersten j Buchstaben von s2 angeben. Der Eintrag in d[|s1 |, |s2 |] gibt dann die Edit-Distanz für die gesamte Länge beider Strings an, wobei | · | die Länge eines Strings angibt. Die Werte der Matrix sind, unter der Annahme gleicher Kosten für alle Operationen, rekursiv definiert als d[i − 1, j] + 1, Buchstabe löschen d[i, j] = min d[i, j − 1] + 1, Buchstabe einfügen d[i − 1, j − 1] + 1, Buchstabe ersetzen (2.2) falls s1 [i] 6= s2 [j] ist. Für s1 [i] = s2 [j] gilt d[i, j] = d[i − 1, j − 1]. Mit der Edit-Distanz dist(s1 , s2 ) = d[|s1 |, |s2 |) für s1 und s2 kann nach folgender Formel ein Ähnlichkeitswert berechnet werden [Chr12b]: sim(s1 ,s2 ) = 1 − dist(s1 , s2 ) max(|s1 |, |s2 |) (2.3) In Tabelle 2.1 ist die Edit-Distanzmatrix für die Strings s1 =„nicht“ und s2 =„nciht“ dargestellt. Dieses Beispiel ist ein typischer Schreibfehler, bei dem zwei Buchstaben innerhalb des Wortes vertauscht wurden. Daraus ergibt sich die Edit-Distanz dist(s1 , s2 ) = 2. Der Ähnlichkeitswert ergibt sich aus Gleichung 2.3: sim(s1 ,s2 ) = 1 − = 0,6 6 2 max(5, 5) (2.4) 2.1 Matching 0 n 1 c 2 i 3 h 4 t 5 n 1 0 1 2 3 4 i 2 1 1 1 2 3 c 3 2 1 2 2 3 h t 4 5 3 4 2 3 2 3 2 3 3 2 Tabelle 2.1: Edit-Distanz Matrix für die Zeichenketten „nicht“ und „nciht“ Unten rechts steht hervorgehoben die Edit-Distanz: 2 2.1.2 Matching-Funktion Die Matching-Funktion arbeitet im Gegensatz zur Vergleichsfunktion nicht mehr auf Attribut-Ebene, sondern nutzt die attributsbezogenen Ähnlichkeitswerte aus dem mit Vergleichsfunktionen (siehe 2.1.1) erstellten Ähnlichkeitsvektor, um zu ermitteln, wie ähnlich sich die beiden Records sind. Einfache Summierung Ein grundlegender Ansatz für solch eine Funktion ist, eine Summe aus den einzelnen Ähnlichkeitswerten des Ähnlichkeitsvektors zu bilden. Durch die anschließende Division durch n wird das Ergebnis auf einen Bereich zwischen 0 und 1 normiert. Die MatchingFunktion match() ist demnach wie folgt definiert: match :[0,1]n → R, n ∈ N n P v 7→ vi (2.5) i=1 n Mit Hilfe von Grenzwerten wird angegeben, ab welchem Wert das Paar als „Match“, „Non-Match“ oder „Potential Match“ klassifiziert wird. Dazu werden tl , als untere Grenze des „Potential Match“-Bereichs, und tu , als obere Grenze, benötigt. Für die Matching-Funktion und einen Ähnlichkeitsvektor vsim ergibt sich somit folgender Zusammenhang [Chr12b] match(vsim ) ≥ tu ⇒ Match tl < match(vsim ) < tu ⇒ Potential Match match(vsim ) ≤ tl ⇒ Non-Match (2.6) Durch die Normierung auf das Intervall [0,1] ergibt sich außerdem 0 ≤ tl ≤ tu ≤ 1. Diese Grenzwerte müssen sehr sorgfältig gewählt werden, weil sie einen großen Einfluss 7 2 Grundlagen auf die Qualität des gesamten Matchings haben. Wird beispielsweise tl zu niedrig gewählt, werden viele Paare fälschlicherweise als „Potential Match“ erkannt, was einen größeren nachträglichen Aufwand in der manuellen Revision zur Folge hat. Äquivalent verhält es sich mit einem zu hohen Wert für tu . Bei dieser Methode werden alle Attribute gleichberechtigt behandelt. Oftmals sind allerdings einzelne Attribute relevanter als andere, was so nicht berücksichtigt werden kann. Gewichtete Summierung Mit Hilfe von Gewichten kann festgelegt werden, dass bestimmte Attribute präzisere Auskunft darüber geben, ob es sich um ein Duplikat handelt. Im Falle einer Kundendatenbank könnte man beispielsweise dem Attribut „Kontonummer“ ein hohes Gewicht zuweisen, da anzunehmen ist, dass es sich bei gleicher Kontonummer auch um die gleiche Person handelt. Zusätzlich zum Ähnlichkeitsvektor wird also noch ein Gewichtungsvektor w = (w1 ,w2 , . . . ,wn ) ∈ Rn definiert. Die modifizierte Matching-Funktion lautet dann: match :[0,1]n × Rn → R, n ∈ N n P v,w 7→ wi · vi i=1 n P (2.7) wi i=1 Dadurch kann der Einfluss, den einzelne Attribute auf die Einordnung haben, sehr fein eingestellt werden. Abhängigkeiten zwischen den Attributen können aber nicht berücksichtigt werden. Ist also die Kombination mehrerer Attribute geeignet, um Duplikate zu erkennen (beispielweise Name, Vorname und Geburtsdatum von Kunden), gibt es mit diesem Ansatz keine Möglichkeit dies darzustellen. Eine hohe Gewichtung dieser Attribute würde hier den Einfluss der einzelnen Felder erhöhen, so dass Kunden, die zwar gleiche Vornamen und Geburtsdaten, aber gänzlich verschiedene Nachnamen haben, ebenfalls als ähnlich erkannt werden. Wahrscheinlichkeitsbasierte Einordnung Die Klassen „Match“ und „Non-Match“ werden als Mengen M und U bezeichnet. Das Record-Paar wird beschrieben durch den Ähnlichkeitsvektor v, welcher durch bedingte Wahrscheinlichkeiten diesen Mengen zugeordnet wird: v∈ 8 M, falls U, sonst p(M |v) ≥ p(U |v) (2.8) 2.1 Matching Gleichung 2.8 sagt aus, dass ein Ähnlichkeitsvektor v in M ist, falls die Wahrscheinlichkeit, dass dieser in M liegt, größer ist als die Wahrscheinlichkeit, dass er in U liegt, unter der Bedingung, dass der Vektor v vorliegt [EIV07]. So wird die Wahrscheinlichkeit des Auftretens der entsprechenden Ausprägung von v berücksichtigt. Durch Anwendung des Satzes von Bayes lassen sich diese Wahrscheinlichkeiten wie folgt umformen: p(M |v) ≥ p(U |v) ⇐⇒ p(v|M ) · p(M ) p(v|U ) · p(U ) ≥ p(v) p(v) ⇐⇒ p(v|U ) · p(U ) p(v|M ) ≥ p(v) p(v) · p(M ) ⇐⇒ p(v|M ) · p(v) p(U ) ≥ p(v|U ) · p(v) p(M ) ⇐⇒ p(v|M ) p(U ) ≥ p(v|U ) p(M ) Satz v. Bayes (2.9) Damit lässt sich die Gleichung 2.8 umformulieren: v∈ M, falls R= p(v|M ) p(v|U ) ≥ p(U ) p(M ) U, sonst (2.10) Das Verhältnis R= p(v|M ) p(v|U ) (2.11) kann gemäß Christen [Chr12b] nun für eine Einteilung, ähnlich der gewichteten Summierung, durch die Grenzwerte tu und tl folgendermaßen genutzt werden: R ≥ tu ⇒ v → Match tl < R < tu ⇒ v → Potential Match R ≤ tl ⇒ v → Non-Match (2.12) Die Berechnung der Wahrscheinlichkeiten in Gleichung 2.11 gestaltet sich in der Praxis jedoch oftmals schwierig. Zur Vereinfachung nehmen wir an, dass die einzelnen Ähnlichkeitswerte in v unabhängig von einander sind, also dass p(vi |M ) unabhängig 9 2 Grundlagen von p(vj |M ) ist, falls i 6= j ist. Für p(v|U ) gilt dies analog. Dadurch können die Wahrscheinlichkeiten nun wie folgt berechnet werden: p(v|M ) = p(v|U ) = n Y i=1 n Y p(vi |M ) (2.13) p(vi |U ) (2.14) i=1 Die Werte für p(vi |M ) und p(vi |U ) können mit Hilfe von Trainingsdaten, oder auf der Basis von Domänenwissen bestimmt werden. Regelbasierter Ansatz Das Aufstellen von Regeln in Form aussagenlogischer Formeln ermöglicht Bedingungen über mehrere Attribute zu definieren. Jede Regel besteht aus einem Prädikat P und einer Einordnung C, so dass P ⇒C (2.15) gilt. C ist hierbei entweder „Match“ oder „Non-Match“. Das Prädikat ist eine Formel in konjunktiver Normalform mit den Termen ti,j mit i,j ∈ [1,n] [Chr12b]. P = (t1,1 ∨ t1,2 ∨ . . . t1,n ) ∧ . . . ∧ (tn,1 ∨ tn,2 ∨ . . . ∨ tn,n ) (2.16) Jeder Term entspricht einer Bedingung, die für die Einordnung nach C erfüllt sein muss und die sich hierbei immer auf die Werte des Ähnlichkeitsvektors bezieht. Auf diese Weise können für jedes einzelne Attribut Grenzwerte festgelegt werden, ab welchem Maß an Ähnlichkeit diese als „Match“ bzw. als „Non-Match“ gelten. So können auch Abhängigkeiten zwischen den Attributen berücksichtigt werden. Eine kombinierte Betrachtung der Ähnlichkeiten in bestimmten Attributen erlaubt oftmals eine genauere Aussage darüber, ob es sich um Duplikate handelt oder nicht. Wird beispielsweise eine Datenbank mit Kundendaten betrachtet, ist bei Einträgen eine große Ähnlichkeit in Name, Vorname und Geburtsdatum ein starkes Indiz, dass es sich um ein Duplikat handelt. Umgekehrt ist ein Duplikat bei einer niedrigen Ähnlichkeit dieser Attribute nahezu ausgeschlossen. Dies könnte man mit folgenden Regeln ausdrücken: (v[name] ≥ 0.9) ∧ (v[vorname] ≥ 0.9) ∧ (v[geburtsdatum] ≥ 0.9) ⇒ „Match“ (v[name] ≤ 0.2) ∨ (v[vorname] ≤ 0.2) ∨ (v[geburtsdatum] ≤ 0.2) ⇒ „Non-Match“ (2.17) Im Idealfall trifft auf jedes Record-Paar eine Regel zu. Alle Paare, die nicht durch eine Regel klassifiziert werden, müssen als „Potential Match“ behandelt werden, da keine klare Einordnung möglich ist. 10 2.2 Fusion 2.2 Fusion Nachdem Duplikate identifiziert wurden, müssen sie vereinigt, also fusioniert, werden. Das bedeutet, dass die Attributwerte der Records r1 und r2 zu einem fusionierten Record r1,2 zusammengeführt werden. Stimmen die Attributwerte überein, ist eine Fusion einfach, denn die Attributwerte können übernommen werden. Unterscheiden sich r1 und r2 jedoch in einigen Attributwerten liegt ein Konflikt vor. Dies tritt insbesondere bei der Verwendung gradueller Vergleichsfunktionen auf, da diese auch ähnliche Werte zulassen. Eine allgemeine Vorgehensweise im Konfliktfall ist aufgrund der individuellen Semantik der jeweiligen Attributwerte schwer festzulegen. Daher muss hier auf Domänenwissen zurückgegriffen werden, um Regeln zu definieren, wie die Werte tatsächlich zusammenzufügen sind. Zur Veranschaulichung sei ein Record-Paar gegeben, das korrekt als Duplikat erkannt wurde, dessen Einträge sich allerdings in dem Feld „URL“, in dem eine Internetadresse gespeichert wird, unterscheiden: r1 URL http://www.dbs.uni-hannover.de r2 https://www.dbs.uni-hannover.de Bei diesem Konflikt muss der Algorithmus nun entscheiden, welche Variante der URL in das neue Record r1,2 übernommen werden soll. Man könnte festlegen, dass in einem solchen Fall immer der Wert des ersten Records, also r1 , Priorität hat. Dies würde aber die Gefahr erhöhen, falsche Werte zu übernehmen, da die Reihenfolge der Records nicht eindeutig ist. Wird nun in dem Beispiel festgelegt, dass das HTTPS-Protokoll zu bevorzugen ist, wird folglich der Wert aus r2 übernommen. Derartige Regeln müssen für jedes einzelne Attribut festgelegt werden, wobei insbesondere der Umgang mit NULL-Werten Berücksichtigung finden muss. Hat einer der beiden Records einen NULL-Wert in einem Attribut, in dem der andere einen Wert hat, ist es oftmals sinnvoll, den vorhandenen Wert zu übernehmen. Dies ist jedoch nur möglich, sofern dem Fehlen eines Wertes in der Datenbank keine Bedeutung zukommt. 2.3 Blocking/Indexing Der Vergleich einzelner Paare ist in der Regel der zeitaufwändigste Schritt beim Matching. In typischen Anwendungsszenarien ist die Anzahl der tatsächlich ähnlichen Einträge gering im Vergleich zu ihrer Gesamtzahl. Das führt dazu, dass der überwiegende Teil der Vergleiche nicht in Matches resultiert. Es wird versucht diese unnötigen Vergleiche einzusparen, indem man vor dem eigentlichen Matching ein Indexing oder Blocking der Records durchführt. Es handelt sich hierbei um eine Vorabfilterung der Datenbank, um das Matching nur mit potentiell ähnlichen Paaren durchzuführen, statt alle Paare zu vergleichen, was auch diejenigen einschließen würde, die gänzlich 11 2 Grundlagen verschieden sind. 2.3.1 Standard Blocking Grundlage für dieses bewährte Verfahren ist ein Blocking Key, also eine Formel nach der für jeden Eintrag ein Block-Wert berechnet wird. Alle Einträge mit dem gleichen Wert gehören zu dem selben Block, wobei jeder Eintrag nur zu genau einem Block gehört. Innerhalb dieser Blöcke befinden sich jetzt Einträge, die gemäß der Definition des Blocking Keys potentiell ähnlich sind. Im anschließenden Matching werden dann nur jeweils die Paare innerhalb eines Blocks miteinander verglichen. Blöcke mit nur einem Eintrag werden ignoriert. Der kritische Punkt bei diesem Verfahren ist das Aufstellen eines geeigneten Blocking Keys. Hierbei können unterschiedliche Codierungen (z. B. phonetische Codierungen von Namen [Chr12b]) angewendet und mehrere Attribute kombiniert werden. Dabei muss zwischen einem Blocking Key, der viele kleinere Blöcke erzeugt und einem Blocking Key, der wenige große Blöcke, erzeugt abgewogen werden. Sind die Blöcke zu groß, ist der Gewinn durch das Blocking gering, da wiederum viele Paare miteinander verglichen werden. Sind die Blöcke hingegen zu klein, steigt die Wahrscheinlichkeit, dass echte Duplikate beim Matching nicht berücksichtigt werden. 2.3.2 Sorted Neighbourhood Ein anderer Ansatz benutzt keine disjunkte Einteilung in Blöcke, sondern eine Sortierung der Grundmenge gemäß eines Sorting Keys. In dieser sortierten Liste befinden sich im Idealfall ähnliche Einträge nah bei einander. Mit einem Sliding Window, dessen Größe vorher definiert wurde, wird diese Liste schrittweise durchlaufen und alle Einträge innerhalb des Windows paarweise miteinander verglichen. Bereits verglichene Paare werden dabei nicht nochmals verglichen. Die Anzahl der so erzeugten Paare ergibt sich aus der Anzahl der Records n und der Größe des Sliding Windows w, wobei es insgesamt p=n−w+1 (2.18) mögliche Positionen für das Sliding Window gibt. Für die erste Position werden w·(w−1) 2 Paare generiert und für alle weiteren Positionen ergeben sich w − 1 neue Paare. Alle anderen Kombinationen sind bereits in vorherigen Window-Positionen erzeugt worden. 12 2.3 Blocking/Indexing Die Anzahl c der erzeugten Kandidatenpaare ist dann nach Christen ([Chr12a]): w · (w − 1) + (w − 1) · (n − w) 2 w · (w − 1) + 2 · (w − 1) · (n − w) = 2 2wn − w2 − 2n = 2 w2 = wn − n − 2 w = (w − 1)(n − ) 2 c= (2.19) In Tabelle 2.2 sind beispielhafte Daten dargestellt. Der gewählte Sorting Key ist hier die Spalte „Name“, wobei die Namen in Kleinbuchstaben konvertiert werden. ID 1 2 3 4 5 6 Name schmidt schmied schmitt schmidt schmitts schmidt Vorname Fritz Paul Gertrud Ursula Johann Elfriede Neue Position 1 2 3 4 5 6 ID 6 1 4 2 3 5 Name schmidt schmidt schmidt schmied schmitt schmitts Vorname Elfriede Fritz Ursula Paul Gertrud Johann Tabelle 2.2: Beispieldaten für den Sorted Neighbourhood Algorithmus Links sortiert nach dem Schlüssel (ID), Rechts sortiert nach Namen Die sortierte Tabelle rechts wird mit dem Sliding Window der Größe w = 3 durchlaufen, woraus sich dann die Paare in Tabelle 2.3 ergeben. Daraus ergeben sich gemäß Gleichung 2.18 vier verschiedene Positionen für das Sliding Window. In der ersten Position werden drei Paare erzeugt, in allen darauf folgenden nur noch zwei Paare, weil jeweils eines bereits in der vorherigen Position vorkommt. Insgesamt werden neun Paare generiert. Window Position 1-3 2-4 3-5 4-6 Paare (6, 1), (1, 4), (4, 2), (2, 3), (6, (1, (4, (2, 4), 2), 3), 5), (1, (4, (2, (3, 4) 2) 3) 5) Tabelle 2.3: Alle erzeugten Paare bei einem Sliding-Window-Durchlauf mit w = 3 Die Paare, die bereits bei der vorherigen Window-Position erzeugt wurden, sind durchgestrichen. 13 2 Grundlagen Bei der Erstellung des Sorting Keys ist zu beachten, dass bei einer Sortierung nach den dabei berechneten Werten den ersten Stellen eine höhere Bedeutung zukommt, da zuerst nach diesen sortiert wird. Benutzt man beispielsweise Nachnamen als Sorting Key, würden zwei Einträge zur gleichen Person, die einmal als „Pohl“ und einmal fälschlicherweise als „Wohl“ erfasst wurde, aller Vorasussicht nach nicht bei einander liegen und daher auch nicht als Duplikat erkannt. Die Größe des Sliding Windows hat ebenfalls Einfluss auf die Qualität und die Anzahl der erzeugten Paare. Abhängig vom Sorting Key kann es eine lange Reihe ähnlicher Einträge geben, die miteinander verglichen werden müssten. Ist das Window allerdings zu klein, wird jeweils nur ein Teil dieser ähnlichen Einträge verglichen, so dass einige Duplikate möglicherweise nicht identifiziert werden. Ist das Window zu groß, werden mehr Paare verglichen und das Matching nimmt mehr Zeit in Anspruch. 2.3.3 q-Gram-Indexing Beim q-Gram-Indexing werden die Blocking-Werte in Listen, bestehend aus den TeilStrings der Länge q, umgewandelt. Diese Teil-Strings werden q-Grams genannt. Beispielsweise wird der Nachname „wohl“ aus für q = 2 in [wo, oh, hl] zerlegt. Aus dieser Liste wird ein Indexschlüssel erzeugt, indem die einzelnen q-Grams zu einem String konkateniert werden. Für das obige Beispiel ergibt sich so der String „woohhl“. Weitere Index-Strings werden aus den Teillisten der q-Gram Liste erzeugt, bis eine minimale Länge l mit l = max(1,bk · tc) (2.20) erreicht wurde. Dabei ist k die Anzahl der ursprünglichen q-Grams und t ein festzulegender Grenzwert mit t ≤ 1. Für jede dieser Kombinationen wird auf gleiche Weise ein String erzeugt, so dass jedem Record eine Menge von Index-Strings zugeordnet wird. Die Anzahl s der Listen und damit die Anzahl der Index-Strings, die für ein Record gebildet werden, hängt von der Länge des Blocking-Wertes und der minimalen Länge der Sublisten ab: s= k X i=l k i ! (2.21) Der Binomialkoeffizient gibt hier die Anzahl der möglichen q-Gram Kombinationen an, für den Fall dass für k q-Grams Listen der Länge i gebildet werden sollen. Ein Beispiel für die Namen „wohl“ und „pohl“ ist in Tabelle 2.4 zu sehen. Aus t = 0,7 ergibt sich in dem Beispiel eine minimale Länge der Teillisten von l = b3 · 0,7c = 2. Da beide Wörter die gleiche Länge haben, ergibt sich daraus für beide die Anzahl der Listen s = 3 + 1 = 4. 14 2.3 Blocking/Indexing Name wohl pohl 2-Gram Listen [wo, oh, hl] [oh, hl] [wo, hl] [wo, oh] [po, oh, hl] [oh, hl] [po, hl] [po, oh] Index-String woohhl ohhl wohl wooh poohhl ohhl pohl pooh Tabelle 2.4: 2-Gram Listen für die Namen „Wohl“ und „Pohl“ mit t = 0,7 Beide haben den hervorgehobenen Index-String „ohhl“ gemeinsam. Beim Matching werden dann alle Records mit einander verglichen, die einen übereinstimmenden Index-String haben. In dem Beispiel haben beide Records den Index-String „ohhl“, so dass sie miteinander verglichen werden würden. 15 3 Zustandsanalyse Dieses Kapitel befasst sich hauptsächlich mit der Datenbank, die Gegenstand dieser Arbeit ist. Es wird zunächst der Aufbau des Datenbankschemas und der zugehörigen Tabellen erläutert, bevor auf den Inhalt der Datenbank mit konkreten Beispielen und Statistiken eingegangen wird. 3.1 Aufbau der Schriftendatenbank abteilung SCHLAGWORT person ABTEILUNG schlagwort MITARBEITER PERSON gehört zu aus autor Betreuer SCHRIFTTYP hat SCHRIFT Erstpruefer schrift Zweitpruefer schrifttyp FLIT LITERATURINDEX ABSCHLUSSARBEIT astatus ASTATUS hat ANSCHAFFUNG Abbildung 3.1: ER-Diagramm des Datenbankaufbaus Die Attribute wurden, bis auf die Primärschlüssel, zur besseren Übersichtlichkeit nicht dargestellt. Die Struktur des Datenbankschemas wurde im Wesentlichen von Mewe [Mew05] entworfen. Der Entwurf sieht neben der Erfassung von Schriften noch weitere Bestandteile 17 3 Zustandsanalyse der Fachgebietsverwaltung vor. Allerdings wurde die Schriftenverwaltung in ein eigenes Schema ausgegliedert und so von dem Rest der Datenbank (z. B. vom Lehrveranstaltungskatalog) entkoppelt. Die für das Matching relevanten Tabellen des aktuellen Schemas sind nachfolgend erläutert und der Zusammenhang zwischen diesen Tabellen wird durch das Entity-Relationship-Diagramm in Abbildung 3.1 veranschaulicht, welches durch ReEngineering der Tabellenschemata entstanden ist. 3.1.1 Tabelle SCHRIFT SCHRIFT (schrift, autor , titel NOT NULL , schrifttyp NOT NULL →SCHRIFTTYP , schrifttyp_erg , abteilung→ABTEILUNG , anm1 , anm2 , url1 , url2 , url3 , doknr , erfdatum ) In dieser Tabelle werden die gemeinsamen Daten aller in der Datenbank erfassten Dokumente gespeichert (siehe Abbildung 3.1). Dies beinhaltet zunächst eine eindeutige ID im Attribut schrift, das auch Primärschlüssel ist. Es werden titel und autor gespeichert sowie das Datum, an dem das Dokument erfasst wurde (erfdatum). abteilung ist eine Fremdschlüsselbeziehung zur Tabelle ABTEILUNG, mit der angegeben wird, zu welcher Abteilung das Dokument gehört. Eine weitere Fremdschlüsselbeziehung ist das Feld schrifttyp, welches auf die Tabelle SCHRIFTTYP verweist und so jedem Dokument genau einen Schrifttyp zuordnet. Zu diesem Schrifttyp kann noch eine Ergänzung (schrifttyp_erg) angegeben werden. Weiterhin gibt es zwei Felder für Anmerkungen (anm1, anm2) und drei für Weblinks (url1, url2, url3). 3.1.2 Tabelle FLIT FLIT (schrift→SCHRIFT , erscheinungsjahr , referenz , vorversion , seite , band , ausgabennr , zeitschrreihe , signatur , anzahl NOT NULL , standort , cr , deskriptoren , vzweck , hrsg , sprache , auflage , ort , instorg , verlag , isbn , literaturkuerzel ) In dieser Tabelle wird Forschungsliteratur erfasst. Das Attribut schrift ist sowohl Fremd- als auch Primärschlüssel, so dass die Tabelle eine Teilmenge der Tabelle SCHRIFT bildet. Bis auf die Anzahl der Exemplare (anzahl) sind alle anderen Attribute optional, da es sich bei den Einträgen um unterschiedliche Medien handelt und daher nicht immer alle Felder benötigt werden. Ist für die Schrift eine ISBN bekannt, kann diese im Feld isbn eingetragen werden. In der Spalte ort wird, falls vorhanden, der Sitz des Verlags (verlag) gespeichert und, falls das Dokument von einer anderen Organisation (instorg), wie z. B. einer Universität, veröffentlicht wurde, der Sitz dieser Organisation. Ist der Autor auch der Herausgeber, wird dies in der Spalte hrsg mit Wert „1“ vermerkt. Die Sprache, in der 18 3.1 Aufbau der Schriftendatenbank die Schrift verfasst wurde, kann als Länderkürzel (z. B. „deu“ für Deutschland) in der Spalte sprache registriert werden. In welchem Jahr das Schriftstück erschienen ist, wird in erscheinungsjahr dokumentiert. Für Bücher kann auch die Auflage (auflage) und gegebenenfalls die Nummer des Bandes (band) bei mehrbändigen Werken vermerkt werden. In zeitschrreihe kann der Name einer Zeitschrift oder Reihe angegeben werden und in ausgabennr die Heft- oder Ausgabennummer innerhalb der Zeitschriftenreihe. Für Schriften, die Auszüge aus einem ebenfalls erfassten Dokument sind, kann die dazugehörige Schrift-ID in referenz angegeben werden. Auch die Seitenzahl (seite), auf der das verzeichnete Dokument beginnt, kann gespeichert werden. Ist eine Vorversion der Schrift erfasst, kann diese in vorversion referenziert werden. Über eine Klassifikation gemäß „ACM Computing Classification System“ kann in der Spalte cr eine fachliche Zuordnung angegeben werden sowie zusätzliche Deskriptoren in der Spalte deskriptoren. literaturkuerzel stellt eine interne Bezeichnung dar, die innerhalb des Fachgebiets zur Referenzierung der Schriften benutzt wird. An welchem Ort sich das Dokument innerhalb des Fachgebiets befindet, wird in standort angegeben. Informationen zum Verwendungszweck werden in vzweck vermerkt. 3.1.3 Tabelle ABSCHLUSSARBEIT ABSCHLUSSARBEIT (schrift→SCHRIFT , erstpruefer→MITARBEITER , zweitpruefer→MITARBEITER , betreuer→MITARBEITER , key NOT abgabedatum ) NULL , Hier werden die spezifischen Attribute zu Abschlussarbeiten erfasst, die im gegebenen Fachgebiet geschrieben wurden. Jede Abschlussarbeit ist auch eine Schrift, weshalb der Primärschlüssel eine Fremdschlüsselbeziehung auf das Attribut schrift der Tabelle SCHRIFT ist. Es können ein erstpruefer und ein zweitpruefer, sowie ein betreuer angegeben werden. Dies sind jeweils Fremdschlüssel auf die Tabelle MITARBEITER, in der Mitarbeiter des Fachgebiets gespeichert werden. key gibt an, ob die Abschlussarbeit auf der Internetseite des Fachgebiets zugriffsbeschränkt werden soll. 3.1.4 Tabelle LITERATURINDEX LITERATURINDEX (schrift→SCHRIFT , abstract , bemerkung , url1_pubflag , url2_pubflag , url3_pubflag ) Publikationen des Fachgebiets werden in dieser Tabelle, die ebenfalls eine Teilmenge von SCHRIFT ist, gekennzeichnet. Es können außerdem der Abstract (abstract) der Publikation und eine zusätzliche Bemerkung (bemerkung) gespeichert werden. Über die drei Flags url1_pubflag, url2_pubflag, url3_pubflag kann festgelegt werden, welche der drei URLs aktiviert sind. 19 3 Zustandsanalyse astatus 0 1 2 3 4 5 9 10 status kein Status inventarisiert bestellen vormerken verzeichnen nicht bestellen vorhanden, nicht inventarisieren Leihgabe Tabelle 3.1: Codierung des Anschaffungsstatus 3.1.5 Tabelle ANSCHAFFUNG ANSCHAFFUNG (schrift →FLIT , astatus NOT NULL →ASTATUS , lieferant , ansicht , inventarnr , preis , waehrung , interessent , warenkorb ) Hier sind ausschließlich Schriften aus FLIT gespeichert. Im Feld astatus wird der Anschaffungsstatus codiert (siehe Tabelle 3.1). Interessant ist hier die Integritätsbedingung, die als Check-Klausel in der Datenbank umgesetzt ist: ( astatus = ’1 ’ and inventarnr is not null ) or ( astatus <> ’1 ’ and astatus <> ’10 ’ and inventarnr is null ) or ( astatus = ’10 ’) Dadurch wird sichergestellt, dass jede Schrift, die als inventarisiert gilt, auch eine Inventarnummer hat. Es ist davon auszugehen, dass Schriften, die eine Inventarnummer haben, garantiert im Fachgebiet zu finden sind. Deshalb ist bei der Fusion zweier Einträge ein Eintrag mit Inventarnummer dominierend. 3.1.6 Tabelle ABTEILUNG ABTEILUNG (abteilung, name , institut , uni , gueltig_von , gueltig_bis ) Der Inhalt dieser Tabelle wird für das Matching nicht benötigt. Allerdings muss im Rahmen dieser Arbeit auf die Abteilungen 3 und 5 eingeschränkt werden, da die Schriften der anderen Abteilungen nur noch aus historischen Gründen verzeichnet sind und heute nicht mehr genutzt werden. 20 3.1 Aufbau der Schriftendatenbank 3.1.7 Tabelle SCHRIFTTYP SCHRIFTTYP (schrifttyp, typ ) In dieser Tabelle werden die Schrifttypen codiert. Jede Schrift hat einen schrifttyp, der als Fremdschlüssel auf eine ID der Einträge (schrifttyp) der Tabelle SCHRIFTTYP verweist. In typ ist jeweils eine Textbezeichnung angegeben. Die Zuordnung der Typen zu den IDs, also dem Inhalt dieser Tabelle, ist in Tabelle 3.2 dargestellt. schrifttyp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Typ Studienarbeit Diplomarbeit Bachelorarbeit Masterarbeit Dissertation Habilitation article book booklet cd inbook incoll indok inproc manual master misc phd proc report unpubl Tabelle 3.2: Inhalt der Tabelle SCHRIFTTYP 21 3 Zustandsanalyse 3.2 Datenbestand 3.2.1 Duplikatbeispiele Schrift-ID Titel Tabellen 95 Implementierung einer SQLErweiterung für temporale Datenbanken ABSCHLUSSARBEIT/nicht in FLIT Wenige zusätzliche Daten 5934 Implementierung einer SQLErweiterung für temporale Datenbanken FLIT und ANSCHAFFUNG/ nicht in ABSCHLUSSARBEIT Viele zusätzliche Daten Tabelle 3.3: Beispiel eines Duplikats einer Abschlussarbeit Es gibt Schriften, die einmal als Abschlussarbeit und ein weiteres Mal als Forschungsliteratur erfasst sind. Ein Beispiel für diesen Fall ist in Tabelle 3.3 dargestellt. Diese getrennte Erfassung ist nicht nötig und auch nicht gewollt, da diese Arbeit mit einer einzigen Schrift-ID sowohl als Forschungsliteratur, als auch als Abschlussarbeit eingetragen werden könnte. Da es nur 191 Abschlussarbeiten gibt (siehe Tabelle 3.6), ist die erwartete Anzahl der Duplikate dieser Art, im Vergleich zur gesamten Anzahl der Schriften, gering. Die Existenz dieser Art von Duplikaten war bereits im Vorfeld bekannt; sie sind vermutlich durch einen fehlerhaften Datenimport entstanden. Im Laufe der Bearbeitung sind weitere größere Gruppen von Duplikaten aufgefallen, wobei hauptsächlich in FLIT erfasste Bücher betroffen sind. Wenn bei diesen der Anschaffungsstatus bekannt ist, wird er in der Tabelle ANSCHAFFUNG vermerkt. Allerdings existiert nicht zu jedem Eintrag in Forschungsliteratur ein solcher Eintrag, was aber so gewollt ist. Nun gibt es jedoch Bücher, die einmal nur als Forschungsliteratur und noch einmal als Forschungsliteratur mit Anschaffung erfasst sind, wobei typischerweise die Anschaffung inventarisiert worden ist. Hierzu gibt es zwei Beispiele (Tabelle 3.4 und Tabelle 3.5). Bei dem ersten Beispiel fällt auf, dass das Erfassungsdatum identisch ist. Dies legt nahe, dass der Fehler bei einem Datenimport entstanden ist, im Zuge dessen die Daten kopiert wurden. Beim zweiten Fall wurde der inventarisierte Eintrag etwa zwei Jahre später angelegt, daher ist hier von einem Erfassungsfehler auszugehen. Vermutlich wurde beim Inventarisieren des Buches nicht nachgesehen, ob dieses Buch bereits in der Datenbank erfasst ist. 22 3.2 Datenbestand Schrift-ID Titel Autor Tabellen Status Erfassungsdatum ISBN Verlag 9497 The Art of Computer Programming - Vol.III: Sorting and Searching (Second Edition) Knuth, Donald E. FLIT/nicht in ANSCHAFFUNG N/A 04-JAN-99 0-201-89685-0 Addison-Wesley 12105 The Art of Computer Programming - Vol.III: Sorting and Searching (Second Edition) Knuth, Donald E. FLIT und ANSCHAFFUNG Inventarisiert 04-JAN-99 0-201-89685-0 Addison-Wesley Tabelle 3.4: Beispiel eines Duplikats eines Lehrbuchs Beide Einträge haben das gleiche Erfassungsdatum. Schrift-ID Titel Autor Typ Status Erfassungsdatum Verlag 3648 Object-Oriented Databases Hughes, John G. FLIT/nicht in ANSCHAFFUNG N/A 14-SEP-92 Prentice-Hall 12115 Object-Oriented Databases Hughes, John G. FLIT und ANSCHAFFUNG Inventarisiert 29-JUL-94 Prentice-Hall Tabelle 3.5: Beispiel eines Duplikats eines Lehrbuchs Das inventarisierte Exemplar wurde etwa 2 Jahre später erfasst. 23 3 Zustandsanalyse 3.2.2 Statistiken In Tabelle 3.6 sind einige Kardinalitäten dargestellt, die die Beziehungen zwischen den Datenbanktabellen verdeutlichen. Es sind, nach der Einschränkung auf die relevanten Abteilungen, insgesamt 15.302 Schriften zu betrachten. Im folgenden wird immer von dieser Einschränkung ausgegangen. Von diesen Schriften haben 15.236 einen zugehörigen Eintrag in FLIT, das heißt umgekehrt es gibt nur 66 Schriften, die keinen solchen Eintrag haben. Die Anzahl der Abschlussarbeiten, die auch in der Tabelle ABSCHLUSSARBEIT erfasst sind, beträgt 191. Unter der Annahme, dass jede dieser Arbeiten als Duplikat in der Form von Tabelle 3.3 vorkommt, gäbe es also 191 Duplikate dieser Art. Von den Duplikatarten, wie sie in Tabelle 3.4 und Tabelle 3.5 dargestellt sind, bei denen eine Schrift in FLIT einmal mit einem Eintrag in ANSCHAFFUNG und einmal ohne erfasst wurde, kann es maximal 9.595 geben. Größe Anzahl Einträge in SCHRIFT mit abteilung in (3,5) 15302 Verschiedene titel in SCHRIFT 13957 SCHRIFT join FLIT 15236 SCHRIFT join ABSCHLUSSARBEIT 191 SCHRIFT join ANSCHAFFUNG 5641 Einträge in FLIT ohne Eintrag in ANSCHAFFUNG 9595 Tabelle 3.6: Tabellengrößen 24 4 Entwurf Die an die Anwendung gestellten Anforderungen sowie die Konzepte mit denen diese umgesetzt werden sollen, sind nachfolgend dargestellt. Dies beinhaltet die Auswahl der relevanten Daten für das Matching, die dabei angewendeten Verfahren sowie den Aufbau der Webschnittstelle und der für den Betrieb der Anwendung angelegten Datenbanktabellen. 4.1 Anforderungen Im Zuge der Bearbeitung haben sich in Gesprächen mit dem Betreuer folgende Anforderungen an die Anwendung ergeben: • Die Webschnittstelle soll mit PHP implementiert werden, da dies eine einfache Einbindung in bestehende, ebenfalls mit PHP entwickelte, Verwaltungsschnittstellen des Fachgebiets ermöglicht. • Für Attribute mit String-Datentyp wird die Edit-Distanz zum Vergleich benutzt, um Schreibfehler bei der Erfassung zu tolerieren. Hierfür steht bereits eine Funktion in der Oracle-Datenbank zur Verfügung (siehe Unterabschnitt 4.3.2). • Um eine flexible Kontrolle über das Matching-Ergebnis zu ermöglichen, müssen die Auswahl der beim Matching zu berücksichtigenden Spalten und die Gewichte dieser Spalten in der Webschnittstelle anpassbar sein. • Die Einstellungen und das dazugehörige Resultat sollen gespeichert werden, um eine spätere Analyse und Referenzierung der Ergebnisse zu ermöglichen. Daher muss es eine Möglichkeit zum Einrichten mehrerer Matching-Durchläufe geben. • Damit die Anwendung sinnvoll nutzbar ist, muss das Matching auf dem Datenbankserver in akzeptabler Zeit (maximal einige Stunden) laufen. • Eine eindeutige Erkennung der Ähnlichkeitsbeziehung zweier ähnlicher Records ist, auf automatische Weise, innerhalb der Anwendung nicht umsetzbar (vgl. Abschnitt 1.2). Stattdessen soll die Einordnung dieser Beziehungen durch den Benutzer geschehen, wofür in der Weboberfläche Funktionen zur Verfügung gestellt werden müssen. 25 4 Entwurf • Zur endgültigen Auflösung der Duplikate soll ermöglicht werden die beteiligten Einträge zu einem einzigen Eintrag zu fusionieren und in die Originaldatenbank einzufügen. • Zur Vereinfachung der Benutzerinteraktion wird, auf Basis der festgestellten Ähnlichkeitsbeziehung, ein Vorschlag für die Fusion der Einträge gemacht. 4.2 Auswahl der Datenbanktabellen Von den in Abschnitt 3.1 beschriebenen Tabellen wird nur ein Teil in der Anwendung verwendet. Die Verwendung bzw. nicht Verwendung ist nachfolgend erläutert: SCHRIFT muss verwendet werden, da dies die grundlegende Tabelle ist, in der alle Schriften erfasst sind. Hier sind vor allem titel und autor zu berücksichtigen, weil diese zu den bibliographischen Kerndaten der Dokumente gehören und somit bei deren Übereinstimmung eine hohe Ähnlichkeit der Dokumente zu erwarten ist. Für autor ist allerdings die nicht normierte Darstellung der Werte zu beachten (siehe Abschnitt 5.2.3). Die abteilung wird auf die Nummern 3 und 5 beschränkt. FLIT wird in das Matching einbezogen, weil die hier gespeicherten bibliographischen Daten zum Auffinden von Ähnlichkeiten benötigt werden. Für fast jede Schrift sind hier entsprechende Daten hinterlegt. Zur Identifikation von Ähnlichkeiten können aus dieser Tabelle insbesondere die Spalten erscheinungsjahr, isbn, instorg, verlag sowie zeitschrreihe beitragen. ABSCHLUSSARBEIT ist notwendig, um Abschlussarbeiten identifizieren zu können. Hierbei werden die Einträge dieser Tabelle vor allem benötigt, damit der Benutzer solche Duplikate wie in Tabelle 3.3 dargestellt erkennen kann. ANSCHAFFUNG wird genutzt um die Information über den Anschaffungsstatus in das Matching und die Fusion einfließen zu lassen. Insbesondere das Erkennen von bereits inventarisierten Schriften (astatus = 1 oder inventarnummer vorhanden) wird so ermöglicht. AUTOR ist nicht geeignet, da hier nur vermerkt ist, welche Mitarbeiter des Fachgebiets Autor einer Schrift sind. Diese Tabelle wird aber derzeit ohnehin nicht mehr gepflegt. SCHLAGWORT ist wegen des inkonsistenten Inhalts ebenfalls nicht für das Matching geeignet. Nach einer Bereinigung könnte diese Tabelle aber später für das Matching hilfreich sein. SCHRIFTTYP wird nicht zur Unterscheidung der Schriften nach ihrem Typ verwendet. So können Einträge unterschieden werden, die ansonsten eine hohe Ähnlichkeit 26 4.3 Matching-Prozedur aufweisen, wie z. B. die zu einer Abschlussarbeit gehörende CD (schrifttyp = 10). LITERATURINDEX ist für das Auffinden ähnlicher Schriften nur wenig geeignet, da die Spalten abstract und bemerkung lange Texte enthalten, die bei einer Mehrfacherfassung anfällig für Eingabefehler sind, wodurch sie nicht mehr übereinstimmen. Das Anwenden der Edit-Distanz auf derart lange Zeichenketten würde den gesamten Prozess verlangsamen. 4.3 Matching-Prozedur Die Berechnung der Ähnlichkeiten aller Paare wird mit einer Stored Procedure in PL/SQL innerhalb der Datenbank durchgeführt. 4.3.1 Matching-Ansatz Als grundlegender Ansatz soll ein Matching anhand von gewichteten Summen (siehe Abschnitt 2.1.2) angewendet werden. Dadurch ist eine feine Steuerung des Einflusses der einzelnen Attribute möglich. Zudem ist die Bedeutung der Gewichte einem späteren Benutzer leicht verständlich zu machen. Ein auf Wahrscheinlichkeiten basierender Ansatz (siehe Abschnitt 2.1.2) würde nämlich zur Festlegung der Auftrittswahrscheinlichkeiten bestimmter Werte ausgeprägtes Domänenwissen oder geeignete Trainingsdaten erfordern. Solche Trainingsdaten liegen allerdings nicht vor und zur Erlangung der nötigen Erfahrung mit den Daten wäre eine deutlich tiefere Analyse der vorliegenden Datenbank erforderlich. Grundsätzlich handelt es sich beim Matching um ein Problem quadratischer Komplexität. Für die Anzahl n der Einträge in SCHRIFT (n = 15301) müssten so folglich 153012 = 234.120.601 Paare miteinander verglichen werden. Die Reihenfolge der einzelnen Elemente der Paare ist aber irrelevant, sodass symmetrisch vertauschte Paare nur einmal miteinander verglichen werden müssen. Außerdem können auch Vergleiche der Records mit sich selbst ausgeschlossen werden. Daraus ergibt sich, dass der jeweils i-te Eintrag mit n−i anderen Einträgen verglichen werden muss. Für die Gesamtzahl x der Vergleiche erhält man: x= n X (n − i) i=1 2 =n − n X i (4.1) i=1 1 = n(n − 1) 2 Somit werden noch 117.052.650 Paarvergleiche benötigt. 27 4 Entwurf Die Anzahl der betrachteten Paare lässt sich stark einschränken, indem ein Indexing angewendet wird. Hierfür wird für den Titel die Annahme getroffen, dass sich die ersten sechs Zeichen der Titel bei ähnlichen Einträgen nicht unterscheiden. So muss jeder Eintrag nur noch mit denen verglichen werden, deren Titelanfang übereinstimmt. Auf diese Weise werden Vergleiche, die mit großer Wahrscheinlichkeit ein nicht sehr ähnliches Paar betrachten, ausgeschlossen. Mit dieser Einschränkung werden noch 336.509 Paarvergleiche durchgeführt. Dies ist jedoch eine sehr grobe Annahme, durch die Records mit Eingabefehlern (wie z. B. Leerzeichen am Anfang des Titels oder zwei vertauschten Zeichen) nicht mehr in den Vergleich mit einbezogen werden. 4.3.2 Edit-Distanz Für String-Werte soll als Vergleichsfunktion die Edit-Distanz benutzt werden. Dafür wird auf die bereits im Datenbanksystem vorhandene Funktion EDIT_DISTANCE_SIMILARITY aus dem Paket UTL_MATCH zurückgegriffen. So kann Implementierungs- und Testaufwand eingespart werden. Der Aufruf dieser Funktion bei allen Spalten mit einem String-Datentyp steigert allerdings die Laufzeit des Matchings, im Vergleich zum Prüfen auf exakte Gleichheit, erheblich. Dies ließe sich über die Auswahl der Spalten für das Matching steuern, was zur Folge hätte, dass die Laufzeit abhängig von den gewählten Spalten stark schwankt. Zusätzlich könnte sich ein Einschränken auf wenige Spalten negativ auf die Qualität des Matchings auswirken. Daher wird als Kompromiss die Edit-Distanz nur auf den Titel der Schriften angewendet, bei allen anderen Spalten wird lediglich auf Gleichheit geprüft. So können viele String-Werte berücksichtigt werden ohne den ganzen Prozess zu verlangsamen. 4.3.3 Betrachtung der Objekt-Ebene Wie in Abschnitt 3.1 beschrieben, besteht die Bibliotheksdatenbank aus mehreren Tabellen, die miteinander in Beziehung stehen. Insbesondere sind die Teilmengenbeziehungen zwischen SCHRIFT, ABSCHLUSSARBEIT, ANSCHAFFUNG, und FLIT zu beachten. Die für das Matching benötigten Informationen sind über diese Tabellen verteilt. Um den Zugang zu diesen Informationen zu erleichtern, wird eine Sicht definiert, in der diese Tabellen, ausgehend von SCHRIFT, per Outer Join zusammengefügt werden. Diese Sicht wird im folgenden als Ursprungssicht bezeichnet, da sie die ursprünglichen Werte enthält. 28 4.4 Datenbankschema 4.4 Datenbankschema Zur Speicherung und Verwaltung mehrerer Matching-Durchläufe wird ein Datenbankschema benötigt. Hier sollen die Matching-Durchläufe zusammen mit einer Bezeichnung gespeichert werden sowie für jeden Durchlauf die ausgewählten Spalten und ihre Gewichte. Außerdem sollen die Ähnlichkeitsvektoren, der Gesamtähnlichkeitswert der Paare und ihre Klassifizierung als „Match“ oder „Non-Match“ in der Datenbank abgelegt werden. Aus diesen Anforderungen ist das ER-Diagramm für den DB-Entwurf in Abbildung 4.1 entstanden. runnr name match column_name schrift1 COMPVEC von CTRLMATCH gehört zu MATCH_WEIGHTS schrift2 weight sim ... Abbildung 4.1: ER-Entwurf für das Datenbankschema der Anwendung Die Attribute für die einzelnen Ähnlichkeitswerte der Spalten wurden im Entity COMPVEC ausgelassen. Dies entspricht folgendem Relationenschema: CTRLMATCH (runnr, name NULL ) MATCH_WEIGHTS (runnr →CTRLMATCH , column_name, weight ) COMPVEC (runnr →CTRLMATCH , schrift1, schrift2, sim , match , ...) CTRLMATCH wird genutzt, um mehrere Matching-Durchläufe zu speichern. Das Attribut runnr stellt hierbei eine laufende ID dar. Zusätzlich kann noch ein name zur besseren Unterscheidbarkeit gespeichert werden. Die Relation COMPVEC enthält einen Ähnlichkeitsvektor pro Schrift-Paar. In schrift1 und schrift2 werden die beiden Schrift-IDs des Record-Paares gespeichert. Zusammen mit der runnr wird auf diese Weise der Ähnlichkeitsvektor eines Paares in einem Matching-Durchlauf identifiziert. Neben den jeweiligen Schrift-IDs sind zusätzlich noch der errechnete Gesamtähnlichkeistwert (sim) und die Klassifizierung des Paares (match) erfasst, die durch den Benutzer im Match-Tool (Unterabschnitt 4.5.1) festgelegt wird. Zusätzlich gibt es hier alle Spalten, die auch in der Ursprungssicht (Unterabschnitt 4.3.3) vorkommen. Diese stammen aus den Originaldaten. Gegenüber einem Entwurf mit wenigen Spalten, in dem für jeden Ähnlichkeitswert eine neue Zeile eingefügt wird, hat dieser Entwurf den Vorteil, dass die Anzahl der benötigten Insert-Operationen geringer ist. Auf diese Weise wird nur eine Insert-Operation pro Paar benötigt und nicht ein Insert pro Spalte bei jedem Paar. Bei Anfragen in der Anwendung werden 29 4 Entwurf in der Regel sämtliche Ähnlichkeitswerte benötigt, so dass zudem das Auslesen und Bearbeiten einer langen Zeile hier effizienter ist, als die Verwendung mehrerer Zeilen. Aufgrund der großen Anzahl der Spalten werden diese in dem ER-Diagramm und dem Relationenschema zur besseren Übersichtlichkeit nicht explizit dargestellt. Die zu vergleichenden Spalten werden mit dem ihnen zugeordneten Gewicht (weight) in MATCH_WEIGHTS verzeichnet. 30 4.5 Webschnittstelle 4.5 Webschnittstelle php index.php login.php logout.php common dbconn.php utils.php fusions-tool matches.php merge.php match-tool insert_match.php manage.php pair_details.php result.php start.php view_result.php weights.php Abbildung 4.2: Dateistruktur der Webschnittstelle Die PHP-Webschnittstelle besteht aus dem Match-Tool und dem Fusions-Tool sowie einer allgemein genutzten Startseite mit Login-Funktion und gemeinsam benutzten Funktionen (im Ordner common). Eine Übersicht über die Dateien und Ordner gibt die Abbildung 4.2. Die einzelnen Handlungsschritte im Ablauf des gesamten Prozesses sind in Abbildung 4.3 dargestellt. Nach dem Login sind auf der Startseite (index.php) Links zu den Startseiten des Match-Tools und des Fusions-Tools. Das Match-Tool stellt die Einstellungs- und Verwaltungsmöglichkeiten für den Matching-Prozess bereit. Des Weiteren können in der Webschnittstelle die Ergebnisse des Matchings angesehen und die Klassifikation der Paare festgelegt werden. Das Fusions-Tools ermöglicht das Betrachten der bereits klassifizierten Paare sowie deren Zusammenführung. 31 4 Entwurf Matching−Durchlauf anlegen Spalten und Gewichte auswählen Matching starten Ergebnis ansehen Paare klassifizieren Paare fusionieren Abbildung 4.3: Genereller Ablauf des Prozesses Im Ordner common befinden sich gemeinsam genutzte Funktionen der PHP-Skripte, wie z. B. das Herstellen der Datenbankverbindung. 4.5.1 Match-Tool Einen Überblick über die Matching-Durchläufe gibt die Seite manage.php. Zu jedem Durchlauf gibt es die Möglichkeit, zur Einstellung der Gewichte oder zur Ergebnisansicht zu gelangen. Auch das Ausführen der Matching-Prozedur kann hier angestoßen werden, wobei sichergestellt wird, dass zu einem Zeitpunkt immer nur eine Instanz dieser Prozedur läuft. Das Einstellen der Gewichte wird auf der Seite weights.php vorgenommen. Hier werden alle möglichen Spalten für das Matching angezeigt, die dann vom Benutzer ausgewählt und mit Gewichten versehen werden können. Das Starten des Matchings erfolgt anschließend wieder aus der Übersichtsseite (manage.php) heraus. Liegt ein Matching-Ergebnis für den entsprechenden Durchlauf vor, kann dieses über einen Link von der Übersichtsseite betrachtet werden. Auf der Seite view_results.php können dafür zunächst die anzuzeigenden Spalten und die Anzahl der zu betrachtenden Paare ausgewählt werden. Anschließend werden in results.php die gefundenen Paare entsprechend der Einstellungen angezeigt. In der Ergebnisübersicht ist es nun möglich, die Paare als „Duplikat“ oder „NonMatch“ zu klassifizieren. Diese Einteilung wird dann in der Datenbank vermerkt. Falls der Benutzer zur Einschätzung mehr als die in der Übersicht angezeigten Daten benötigt, kann für jedes Paar auch eine Detailansicht (pair_details.php) aufgerufen werden, in der alle vorhandenen Daten und gegebenenfalls ihre Ähnlichkeitswerte zu dem Paar angezeigt werden. 4.5.2 Fusions-Tool Auf der Startseite (matches.php) des Fusions-Tools werden die zuvor im Match-Tool klassifizierten Paare angezeigt. In einer Detailansicht (merge.php) der Paare können die Werte der einzelnen Spalten zusammengeführt werden, so dass ein neuer Eintrag 32 4.5 Webschnittstelle für die Datenbank entsteht. Abhängig von der Ähnlichkeitsklasse des Paares wird hier ein Vorschlag zur Fusionierung gemacht. Im Falle von Duplikaten werden alle übereinstimmenden Werte übernommen. Spalten, in denen ein Record einen Wert hat und der andere nicht, werden mit dem existierenden Wert belegt. Liegt ein Datenkonflikt vor, also verschiedene Werte für die gleiche Spalte bei beiden Records, werden im Vorschlag die Werte des Records eingetragen, der Priorität hat. Dies ist der Fall, wenn einer der beteiligten Einträge inventarisiert ist (astatus = 1 oder vorhandenen Inventarnummer), weil davon auszugehen ist, dass die Daten in inventarisierten Einträgen überwiegend korrekt sind. Sind keiner oder beide inventarisiert, bekommt derjenige Priorität, der die meisten Daten, also am wenigsten NULL-Werte, hat. Dieser Vorschlag sollte dann vom Benutzer noch einmal auf Richtigkeit geprüft werden. Anschließend werden die Daten in die Datenbank geschrieben, indem die Tupel, die zu dem priorisierten Eintrag gehören in den jeweiligen Datenbanktabellen aktualisiert werden; die Tupel des nicht priorisierten werden gelöscht. Dabei werden Abhängigkeiten und Referenzen der anderen, für das Matching selbst nicht relevanten, Tabellen berücksichtigt. So dürfen z. B. Schriften, auf die aus der Autor-Tabelle heraus verwiesen wird, nicht gelöscht werden, ohne dass der Verweis entsprechend angepasst wird. Für die Fälle, in denen beide Einträge behalten werden sollen (z. B. Vorversionen), werden die ursprünglichen Records angepasst, indem beispielsweise der Verweis auf die Vorversion gesetzt wird. 33 5 Implementierung Nachdem im vorigen Kapitel der Entwurf beschrieben wurde, werden hier Aspekte der konkreten Umsetzung dargestellt. Nach einer Beschreibung der Besonderheiten des gewählten Datenbankmodells wird die Funktionsweise des implementierten MatchingAlgorithmus erläutert. Hierbei wird insbesondere auf die Laufzeit und Maßnahmen zu ihrer Reduzierung eingegangen. Anschließend werden Details zur Implementierung der Webschnittstelle geschildert. 5.1 Datenbankschema Zur Speicherung und Verwaltung mehrerer Matching-Durchläufe und ihrer Einstellungen wurde ein Tabellenschema angelegt. Von dem ursprünglichen Entwurf in Abschnitt 4.4 wurde, zugunsten einer erhöhten Ausführungsgeschwindigkeit der MatchingProzedur sowie einer einfacheren Verwaltung der Tabellen, abgewichen. Statt einer einzigen Ergebnistabelle COMPVEC wird eine eigene Ergebnistabelle für jeden Durchlauf verwendet. Daraus ergibt sich das folgende Schema: CTRLMATCH (runnr, name NULL , runflag ) MATCH_WEIGHTS (runnr →CTRLMATCH ,column_name, weight ) COMPVECS_ < runnr >( schrift1 , schrift2 , sim ,...) MATCHSTATE (schrift1,schrift2, match ) Quelltext 5.1: DB-Schema des Matching-Tools In CTRLMATCH wird für jeden Durchlauf ein neuer Eintrag mit einer ID (runnr) und einem optionalen Namen (name) angelegt. Die Spalte runflag wird genutzt, um zu kennzeichnen, dass die Matching-Prozedur für den entsprechenden Durchlauf momentan ausgeführt wird (siehe auch Unterabschnitt 5.3.4). Die Tabelle MATCH_WEIGHTS enthält zu jedem Lauf nur das Gewicht der ausgewählten Spalten im Matching. Dazu besteht jeder Eintrag der Tabelle aus der runnr und dem jeweiligen Spaltennamen (column_name), die zusammen den Primärschlüssel bilden, sowie dem gesetzten Gewicht(weight). Alle Spalten, die bei dem jeweiligen Lauf nicht berücksichtigt werden sollen, haben hier entsprechend keinen Eintrag. Wie im Entwurf festgelegt, werden zusätzlich die beiden IDs der Schriften (schrift1 und schrift2), sowie der Gesamtähnlichkeitswert, der sich aus der gewichteten Summe ergibt, gespeichert. 35 5 Implementierung SCHRIFT1 SCHRIFT2 SIM AUTOR TITEL SCHRIFTTYP URL1 URL2 ERFDATUM URL3 ISBN VERLAG INSTORG ORT SPRACHE HRSG DESKRIPTOREN STANDORT ZEITSCHRREIHE AUSGABENNR BAND SEITE ERSCHEINUNGSJAHR ERSTPRUEFER ZWEITPRUEFER BETREUER ABGABEDATUM INVENTARNR NUMBER (8) NUMBER (8) NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER NUMBER Quelltext 5.2: Beispielausprägung einer COMPVECS Tabelle Die Ergebnisse der Matching-Prozedur werden nicht, wie zuvor geplant, in einer einzigen Tabelle gespeichert, sondern in je einer separaten COMPVECS_<runnr>-Tabelle festgehalten. Diese werden dynamisch zur Laufzeit erstellt, wobei <runnr> ein Platzhalter für die ID des jeweiligen Durchlaufs ist. So wird für jeden Lauf eine eigene Ergebnistabelle angelegt (COMPVECS_1, COMPVECS_2 usw.), die für die Ähnlichkeitswerte nur die zuvor für das Matching ausgewählten Spalten enthält (Beispielausprägung in Quelltext 5.2). Neben der dynamischen Spaltenwahl ist ein weiterer Grund für diese Abweichung, dass ein Primärschlüssel auf der Tabelle den gesamten Matching-Prozess verlangsamen würde. Bei einer derartigen Umsetzung hätten bei jeder Insert-Operation die Indexe aktualisiert und die Schlüssel auf Verletzung des Unique-Constraints überprüft werden müssen. 36 5.2 PL/SQL: Matching-Prozedur Das Speichern der Klassifizierung durch den Benutzer wurde daher in eine separate Tabelle MATCHSTATE verschoben, weil diese global für alle Durchläufe gelten muss. Ansonsten könnten für das selbe Paar widersprüchliche Bewertungen eingetragen werden. Der Inhalt dieser Tabelle ist maßgeblich für die Fusion, da nur die hier verzeichneten Paare, die nicht als „Non-Match“ klassifiziert wurden, für eine Fusion in Frage kommen. 5.2 PL/SQL: Matching-Prozedur 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: procedure match(threshold, runID) simSum ← 0 for each rec1 in SCHRIFT loop for each rec2 in SCHRIFT where schrift > rec1.schrift loop for each column in MATCH_WEIGHTS where runnr = runID loop simValue ← calcSimilarity(rec1[column],rec2[column]) simSum ← column.weight · simValue end simSum ← simSum / sum(column.weights) if simSum ≥ threshold then insert values into COMPVECS_<runID> end if end end end procedure Algorithmus 5.1: Struktur der Matching-Prozedur 5.2.1 Aufbau Der Ablauf der Prozedur ist als Pseudocode in Algorithmus 5.1 dargestellt. Der Kern der Prozedur besteht aus zwei ineinander geschachtelten Cursor-Loops. Der äußere Cursor (Zeile 3) iteriert über alle Zeilen in der Ursprungssicht, aufsteigend nach der Datenbank-ID sortiert. Der innere Cursor (Zeile 4) iteriert nur über diejenigen Einträge, deren ID größer ist, als die ID des äußeren Eintrags. Dadurch wird ausgenutzt, dass die Reihenfolge der Paare nicht relevant ist, also die symmetrisch vertauschten Paare nicht verglichen werden müssen. Innerhalb der inneren Schleife wird nun über die zu vergleichenden Spalten iteriert (Zeile 5). Für jede Spalte wird der Wert des ersten (äußeren) Eintrags mit dem Wert des inneren verglichen und das Ergebnis als Ähnlichkeitswert gespeichert (Zeile 6). Aus diesen Ähnlichkeitswerten wird eine gewichtete Summe berechnet, die mithilfe der 37 5 Implementierung Summe aller Gewichte normiert wird. Diese gewichtete Summe wird zusammen mit den einzelnen Ähnlichkeitswerten der Spalten in einen Insert-String geschrieben, der die entsprechenden Werte mit dynamischem SQL in die entsprechende Ergebnistabelle einfügt. Über einen als Parameter an die Prozedur übergebenen Schwellenwert kann eingestellt werden, wie hoch die Gesamtähnlichkeit des Paares sein muss, damit die Werte in die Ergebnistabelle geschrieben werden (Zeile 10). 5.2.2 Iteration über Spalten Das Iterieren über die Spalten einer Zeile ist in PL/SQL nicht ohne Weiteres möglich. Daher werden zu Beginn die zu vergleichenden Spaltennamen mit den dazugehörigen Gewichten in eine Nested-Table Collection gespeichert. Über diese Collection kann nun iteriert werden. /* Typ - und V a r i a b l e n d e k l a r a t i o n */ TYPE weights_t IS TABLE OF match_weights % ROWTYPE ; columnNames weights_t ; /* Abfragen und Speichern der zum Durchlauf ( runID ) geh ö renden Zeilen aus match_weights */ SELECT * BULK COLLECT INTO columnNames FROM match_weights WHERE runnr = runID ; Quelltext 5.3: Speicherung der Spaltennamen und Gewichte in einem Nested-Table Allerdings ist ein dynamischer Zugriff auf die einzelnen Spalten der Record-Variablen der Cursor nicht möglich. Mit Hilfe eines selbstdefinierten SQL-Typs, der wiederum eine aus VARCHAR2 bestehende Nested-Table ist, lässt sich dieses Problem umgehen. Mit einer Anfrage, die ein Objekt dieses neuen Typs liefert, werden die benötigten Spaltenwerte des Eintrags in der Ursprungssicht implizit zu VARCHAR2 konvertiert und in diesem Nested-Table gespeichert. Nun kann auf die einzelnen Spaltenwerte über Angabe eines numerischen Indexes zugegriffen werden. CREATE TYPE bib_row IS TABLE OF VARCHAR2 (4000) ; Quelltext 5.4: Definition des globalen SQL-Typs 38 5.2 PL/SQL: Matching-Prozedur 5.2.3 Spaltenvergleiche Generell wird für jede Spalte auf einfache Gleichheit geprüft. Das heißt, die Werte haben bei exakter Übereinstimmung eine Ähnlichkeit von 100%, ansonsten haben sie 0% Ähnlichkeit. Ausnahmen hiervon bilden die Spalten titel, autor, und jede Spalte, in der beide Einträge des Paares keinen Wert, also NULL, haben. titel Um leichte Abweichungen im Titel der Schriften zu tolerieren, wird hier zum Vergleich die Edit-Distanz benutzt. Diese wird mittels der von Oracle im Paket UTL_MATCH zur Verfügung gestellten Funktion EDIT_DISTANCE_SIMILARITY berechnet. Sie gibt einen Wert zwischen 0 und 100 zurück, der die Ähnlichkeit zweier Zeichenketten in Prozent beschreibt. Da die Nutzung dieser Funktion einen höheren Rechenaufwand darstellt als ein exakter Vergleich, wird diese nur beim Titel benutzt. autor Wie in Unterabschnitt 3.1.1 beschrieben, enthält die Spalte autor eine Liste mit den Autoren der jeweiligen Schrift. Für diese Auflistung wird allerdings in der Datenbank kein einheitliches Format verwendet, so dass bei manchen Einträgen die Autoren mit einem Schrägstrich getrennt sind, bei anderen aber mit einem Komma. Auch die Schreibweise der Vornamen ist nicht normiert; einige liegen in abgekürzter Form vor. Daher sind die in dieser Spalte enthaltenen Daten nur schwer vergleichbar. Die Autorenangabe ist aber ein wichtiger Hinweis auf Duplikate. Bei fehlender Übereinstimmung kann es sich schließlich nicht um ein Duplikat handeln. Aus diesem Grunde wird zumindest der Nachname des ersten Autors in den Vergleich mit einbezogen. Als Vergleichsfunktion wird hier eine einfache Gleichheit geprüft. Dies ist möglich, da festgelegt wurde, dass der Nachname des ersten Autors am Anfang des Strings steht, gefolgt von einem Komma. Alles was nach diesem Komma steht, ist nicht sinnvoll vergleichbar. NULL-Werte Wenn beide Werte einer Spalte NULL sind, wird diese Spalte ignoriert. Die Spalte trägt mit einem Wert von 0 zur Ähnlichkeitssumme bei und das definierte Gewicht dieser Spalte wird von der Summe aller Gewichte subtrahiert. Auf diese Weise wird die Spalte weder als gleich noch als ungleich bewertet, sie wird komplett in der Berechnung ignoriert. Dies ist nötig, da eine Bewertung als Übereinstimmung dazu führt, dass Paare, die wenige gleiche Werte, aber viele NULL-Werte haben, als ähnlich gelten. Andersherum führt eine Bewertung von NULL als verschieden dazu, dass ursprünglich ähnliche 39 5 Implementierung Schriften einen niedrigen Ähnlichkeitswert bekommen, weil sie viele NULL-Werte enthalten. Beide Fälle führen zu einer geringeren Matching-Qualität und so zu einem größeren Aufwand bei der anschließenden Bearbeitung durch den Benutzer. 5.2.4 Laufzeit und Optimierungen Die ursprüngliche Implementierung benötigte bereits für den Vergleich von 10.000 Paaren 14:40 Minuten. Das entspricht 88ms pro Paar. Für die insgesamt erforderlichen 117.052.650 Vergleiche ergäbe das hochgerechnet eine Laufzeit von etwa 17 Wochen. Die tatsächliche Laufzeit wäre noch höher: Aufgrund einer Anfrage an die Ergebnistabelle ist die Bearbeitungszeit eines Paares abhängig von der Anzahl der bisher verglichenen Paare. Der Algorithmus wurde folglich langsamer, je mehr Paare verglichen wurden. Durch die nachfolgend erläuterten Optimierungen konnte die Laufzeit auf etwa 150µs pro Paar reduziert werden. Damit kann ein vollständiger Durchlauf über alle Einträge der Datenbank in etwa fünf Stunden durchgeführt werden. Werden nur die Einträge mit gleichen Titelanfängen verglichen, reduziert sich die Laufzeit auf wenige Minuten (siehe auch „Titel-Indexing“ auf Seite 41). Ausschluss symmetrisch vertauschter Paare In der ersten Implementierung wurde das Ausschließen der symmetrisch gleichen Kombinationen über eine Unteranfrage an die Ergebnistabelle realisiert. Dadurch wurde die Laufzeit linear in Abhängigkeit zur Größe der Ergebnistabelle erhöht. Das Ausschließen kann auch durch die Bedingung realisiert werden, dass die ID (schrift) des zweiten Eintrags größer sein muss, als die des ersten. Auf diese Weise konnte die Unteranfrage eingespart und die Laufzeit auf konstante Größen beschränkt werden. Materialized View und Index Die Umwandlung des Views in ein Materialized View, also eine physische Repräsentation des Anfrageergebnisses in Form einer Tabelle, brachte einen großen Performance-Gewinn mit sich. Auf diese Weise muss die Anfrage für die Ursprungssicht nicht mehrmals innerhalb der Prozedur ausgeführt werden, sondern nur einmal beim Anlegen der Sicht. Die Laufzeit konnte noch einmal stark reduziert werden, indem auf diesem Materialized View ein Index für die Spalte schrift angelegt wurde. Dadurch wird zum Einen das Überprüfen der oben genannten Bedingung für schrift beschleunigt und zum Anderen das Auslesen der jeweiligen Tupel aus dem View erleichtert. Bearbeitung der Spalten Das Zwischenspeichern der Records in Collections ermöglicht den Vergleich der einzelnen Spalten ohne für jede Spalte zwei weitere Anfragen pro Paar stellen zu müssen. 40 5.3 PHP-Webschnittstelle Außerdem wurde ursprünglich, nach dem Vergleich der Werte einer Spalte, ein Update auf der Ergebnistabelle ausgeführt, um den soeben errechneten Wert einzutragen. Dadurch entsteht viel Overhead beim Wechsel zwischen der SQL- und der PL/SQLEngine [Ros+11]. Dieser wurde minimiert, indem mittels dynamischem SQL ein Insert pro Paar erzeugt wird. Auch wenn das Ausführen der Insert-Operationen noch immer langsam ist, hat die Einführung eines Schwellenwertes für die Gesamtähnlichkeit eines Paares, ab der das Insert ausgeführt wird, die Laufzeit von 1ms pro Paar auf 100–180µs reduziert. Die Anzahl der Inserts und damit die Laufzeit der Prozedur sind abhängig von diesem Schwellenwert und den gewählten Gewichten. Je mehr Paare von ihrem Ähnlichkeitswert her über der Schwelle liegen, desto mehr Inserts werden ausgeführt und desto größer ist die Gesamtlaufzeit. Die Beschränkung der Anwendung der Edit-Distanz auf die Titel hat ebenfalls einen positiven Effekt auf die Laufzeit, da diese Berechnung mit Blick auf die Häufigkeit, mit der sie ausgeführt werden müsste, viel Zeit in Anspruch nimmt. Titel-Indexing Wie in Unterabschnitt 4.3.1 beschrieben, wird die Annahme getroffen, dass ähnliche Einträge einen gleichen Titelanfang haben. Hierfür werden zu dem Eintrag aus der äußeren Schleife nur die Einträge in der inneren Schleife ausgewählt, deren Titel mit den gleichen sechs Buchstaben beginnt. Der Titel des äußeren Eintrags ist in einer Record-Variable rec gespeichert. Für den inneren Cursor ergibt sich so für den Titel folgende Bedingung in SQL: WHERE substr ( titel ,1 ,6) = rec . titel Um eine effiziente Überprüfung zu ermöglichen, wurde auf dem Materialized View ein funktionsbasierter Index für die Spalte titel angelegt. CREATE INDEX titel_indx ON bib_all ( substr ( titel ,1 ,6) ) Quelltext 5.5: Befehl zum Anlegen des Index auf den Titelanfang So erhöht sich zwar die durchschnittliche Laufzeit pro Paar, aber durch die stark reduzierte Menge der Paare endet die Prozedur nach 1–2 Minuten. 5.3 PHP-Webschnittstelle 5.3.1 Anbindung der Datenbank In dem PHP-Skript dbconn.php befindet sich eine Klasse DBConn, in der die Verbindung zum Datenbankserver, mittels der PHP-Erweiterung „PHP Data Objects“ (PDO), hergestellt wird. Sie erbt von der Standard-PDO-Klasse und hat zusätzlich die Funktion: 41 5 Implementierung executeQuery ( $query , $param = NULL , $method = PDO :: FETCH_ASSOC ) Diese Funktion führt die Anfrage, die im ersten Parameter $query übergeben wird, als Prepared Statement aus. Die Belegung der in $query benutzten Bind-Variablen muss als assoziatives Array in $param angegeben werden. Da auch Anfragen ohne Bind-Variablen ausgeführt werden können, ist $param optional und hat NULL als Default-Wert. Die Art, wie die von der Anfrage zurückgegebenen Zeilen in PHP-Objekten dargestellt werden sollen, kann mit dem Parameter $method eingestellt werden. Dieser ist standardmäßig auf PDO::FETCH_ASSOC eingestellt, was zu einer Rückgabe der Zeilen als assoziatives Array führt. Mit der Verwendung dieser Funktion wird die Ausführung der Datenbankanfragen als Prepared Statement innerhalb der Anwendung vereinheitlicht und somit vereinfacht. Dadurch sinkt die Gefahr einer SQL-Injection, beispielsweise über Parameter aus den HTTP-Requests. Zusätzlich enthält dbconn.php die Funktion getConnection(), die, unter Verwendung der beim Login in der Session gespeicherten DB-Zugangsdaten, eine Verbindung zur Datenbank aufbaut und ein Objekt vom Typ DBConn zurückgibt. Die Adresse der Datenbank ist in der Variablen $dbname ebenfalls vordefiniert. 5.3.2 Login Mit der in utils.php enthaltenen Funktion check_login() wird zu Beginn jedes PHPSkripts geprüft, ob der Benutzername in der Session hinterlegt ist. Ist er dies nicht, wird der Benutzer auf die Login-Seite (login.php) weitergeleitet. Hier befinden sich Eingabefelder für Benutzername und Passwort zur Datenbank. Die Eingaben werden zwecks Authentifizierung mit des Nutzers mit der Datenbank abgeglichen. War die Prüfung erfolgreich, werden Benutzername und Passwort in der PHP-Session abgelegt, so dass sie im weiteren Verlauf zum Herstellen der DB-Verbindung zur Verfügung stehen. Schlägt der Login fehl, wird die Session beendet und die Login-Seite erscheint erneut. 5.3.3 Einstellen der Gewichte Die Liste der für das Matching auswählbaren Spalten des Views wird in weights.php mit einer Anfrage an das Data Dictionary generiert. Sofern vorhanden, werden die bereits gespeicherten Gewichte direkt in die Input-Felder eingetragen. Zum Speichern der Gewichte wird ein MERGE INTO Statement verwendet (siehe Quelltext 5.6). Bei :runnnr, :col und :weight handelt es sich um Bind-Variablen, die erst bei der Ausführung des Prepared Statements gesetzt werden. Somit ist es nicht erforderlich zu unterscheiden, ob bereits existierende Gewichte geändert oder neue Gewichte eingetragen werden müssen, da dies im MERGE Statement 42 5.3 PHP-Webschnittstelle behandelt wird. MERGE INTO match_weights w USING ( select : runnr runnr , : col column_name , : weight weight from dual ) v ON ( w . runnr = v . runnr and w . column_name = v . column_name ) WHEN MATCHED THEN UPDATE SET weight = v . weight WHEN NOT MATCHED THEN INSERT VALUES ( v . runnr , v . column_name , v . weight ) Quelltext 5.6: MERGE INTO Statement zum Speichern der Gewichte 5.3.4 Starten der Matching-Prozedur Das Starten der Datenbank-Matching-Prozedur aus PHP heraus gestaltet sich schwierig, da innerhalb der Session auf das Ergebnis der Prozedur gewartet werden würde. Das bedeutet, dass die Session erhalten bleiben muss, bis die Prozedur beendet ist. Dies kann im Rahmen einer Webanwendung nicht gewährleistet werden, da es bei zu langen Wartezeiten zu einem Timeout der Session kommt. Ein weiteres Problem ergibt sich, wenn durch das Schließen des Browserfensters auf Client-Seite ein Abbruch der Session bewirkt wird, was die Anfrage an die Datenbank ebenfalls beenden würde. Daher wird ein separates Skript mittels des PHP Command Line Interface (PHP Cli) in einem neuen Prozess ausgeführt. Ein auf herkömmliche Weise gestarteter Prozess wäre wieder ein Subprozess, den der Webserver — im Falle von zu vielen laufenden Prozessen — jederzeit beenden kann. Deshalb wird eine neue Instanz des PHP-Interpreters gestartet, die das Aufrufskript der Prozedur ausführt. Der Aufruf hierfür lautet: exec ( ’ nohup / usr / bin / php -f start . php [ param ] > / dev / null & ’) Als Parameter benötigt das Skript sowohl die Login-Daten des Benutzers, als auch die runnr des Matching-Durchlaufs. Der Benutzername, das Passwort, und die ID des Matching-Durchlaufs werden in ein Array gespeichert, das mittels der serialize()Funktion als String an start.php übergeben wird. Innerhalb des Skripts kann das Array dann mit unserialize() wieder rekonstruiert werden. Eine direkte Übergabe dieses Strings innerhalb des Aufrufs würde ein Sicherheitsrisiko darstellen, weil so über den Inhalt der Parameter beliebiger Shell-Code auf dem Server ausgeführt werden könnte. Daher wird der Parameter-String zuvor mit Base64 codiert, so dass die Ausführung von eingefügtem Shell-Code verhindert wird. So müssen auch die in der serialisierten Darstellung des Arrays enthaltenen Sonderzeichen nicht maskiert werden. 43 5 Implementierung Vor dem Starten der Matching-Prozedur wird noch ein Flag für das jeweilige Matching gesetzt, das kennzeichnet, dass dieser Prozess noch läuft. 5.3.5 Ergebnisübersicht Die Anzahl der angezeigten Paare in der Ergebnisübersicht (result.php) kann auf der vorherigen Seite (view_result.php) festgelegt werden. Dadurch kann der Benutzer selbst bestimmen, wie viele Einträge er angezeigt bekommen möchte und ist in der Lage Ladezeit der Seite anzupassen. Insbesondere wenn viele zusätzliche Spalten direkt in der Übersicht angezeigt werden sollen, kann es zu Verzögerungen kommen. Neben der Übertragungszeit der Seite sind diese auch von der Leistung und der Speicherauslastung des Client-Rechners abhängig. Das Klassifizieren der Paare in „Matches“ und „Non-Matches“ kann über die entsprechenden Schaltflächen vorgenommen werden. Hierbei wird ein AJAX-Request an insert_match.php gesendet und das jeweilige Paar aus der Ergebnisliste entfernt. 5.3.6 Fusionsansicht In der Fusionsansicht (merge.php) wird ein als Duplikat gekennzeichnetes Record-Paar dargestellt. Es werden alle Spalten aus der Ursprungssicht mit den dazugehörigen Werten angezeigt. Die Unterschiede zwischen den beiden Records werden über eine farbliche Kodierung verdeutlicht. Hierbei werden die von der Ampel bekannten Farben Rot, Gelb und Grün benutzt, um die Aufmerksamkeit des Benutzers gezielt auf die Werte zu lenken, die einen Konflikt darstellen. Die rot eingefärbten Zeilen sind die wahrscheinlichste Quelle für die Übernahme falscher Daten. Dies sind die Fälle, bei denen beide Werte vorhanden sind und sich unterscheiden. Hier wird für den Vorschlag der Wert des Records genommen, der inventarisiert ist oder am wenigsten NULL-Werte hat, was nicht immer die beste Lösung hervorbringt. Weniger problematisch sind einzelne NULL-Werte. Wenn für eine bestimmte Spalte einer der beiden Records einen Wert hat, der andere jedoch keinen, wird der existierende Wert in den Vorschlag übernommen. Dies führt auf keinen Fall zu einem Informationsverlust, dennoch könnten dadurch Inkonsistenzen erzeugt werden, wenn beispielsweise der eine Eintrag eine Angabe für instorg hat und der andere eine für verlag. Daher werden diese Zeilen gelb hinterlegt. Übereinstimmende Werte sind unproblematisch, daher bekommen sie die Farbe Grün, um darzustellen, dass hier kein Datenkonflikt vorliegt. Zwei NULL-Werte werden in diesem Sinne auch als Übereinstimmung interpretiert. Der aus diesen Daten zusammengefügte Vorschlag wird auf der rechten Seite dargestellt. Die einzelnen Felder können bearbeitet werden, um gegebenenfalls aufgetretene Fehler zu korrigieren. 44 5.3 PHP-Webschnittstelle 5.3.7 Auflösen der Relationen Nachdem in der Fusionsansicht der Vorschlag zur Fusion akzeptiert wurde, muss festgestellt werden, welche Änderungen an den Tabellen vorgenommen werden müssen. Zunächst wird für das nicht priorisierte Record geprüft, welche Tabellen darauf Verweisen. Die zu prüfenden Tabellen sind SCHLAGWORT und AUTOR, da dies die einzigen Tabellen mit Fremdschlüsseln auf schrift sind, die nicht eine Teilmenge von SCHRIFT darstellen. Diese Fremdschlüssel werden geändert, so dass sie auf die priorisierte Schrift zeigen. Nun können die Einträge der nicht priorisierten Schrift in ANSCHAFFUNG, FLIT, ABSCHLUSSARBEIT, LITERATURINDEX und schließlich in SCHRIFT entfernt werden. Für das priorisierte Record werden jetzt die neuen Daten in die Tabellen geschrieben. Hierfür werden MERGE INTO Statements verwendet, um den bestehenden Eintrag in den Tabellen zu aktualisieren, oder falls dieser nicht vorhanden ist, einen neuen einzufügen. Bevor die Änderungen jedoch final in die Datenbank geschrieben werden, bekommt der Benutzer diese in der Weboberfläche angezeigt. So können sie vorher noch überprüft werden und der Vorgang kann notfalls abgebrochen werden. 45 6 Handbuch 6.1 Installation/Vorbereitung 6.1.1 Anlegen des Views Als Basis für das Matching wird ein Materialized View benötigt, das die Daten enthält über die das Matching durchgeführt werden soll. Hier wurden die Tabellen SCHRIFT, ABSCHLUSSARBEIT, FLIT, und ANSCHAFFUNG per OUTER JOIN über die ID zusammengefügt. Hier wurde das View bib_all genannt, was so auch in der Matching-Prozedur verwendet wird. Sollte ein anderer Name für das View benutzt werden, muss die Prozedur entsprechend angepasst werden. Außerdem muss ein Index auf der Spalte schrift angelegt werden. Ein weiterer Index wird für die Spalte titel benötigt. Dieser darf aber nur die ersten sechs Zeichen betrachten. Ein Statement zum Anlegen dieses Index ist in Quelltext 5.5 auf Seite 41 zu finden. 6.1.2 Das Kontrollschema anlegen Die benötigten Kontrolltabellen (siehe Abschnitt 5.1) können durch Ausführen des SQL-Scripts install_schema.sql angelegt werden. 6.1.3 Matching-Prozedur Die Matching-Prozedur ist in der Datei match.sql zu finden. Um die Prozedur zu kompilieren ist vorher allerdings noch das Anlegen des SQL-Typs, wie in Quelltext 5.4 auf Seite 38 gezeigt, notwendig. 6.1.4 PHP-Skripte Die PHP-Skripte befinden sich in dem Ordner php. Dieser Ordner muss auf den Webserver kopiert werden, wobei er auch umbenannt werden kann. Die darin enthaltene Ordnerstruktur sollte allerdings so beibehalten werden. Falls die Ordner an abweichende Orte kopiert oder umbenannt werden, müssten die Pfade innerhalb der Dateien entsprechend angepasst werden. 47 6 Handbuch Abbildung 6.1: Übersicht über das Matching-Ergebnis 6.2 Benutzung Nach dem Aufruf der Startseite muss zuerst ein Login mit den jeweiligen Daten des Datenbank-Benutzeraccounts durchgeführt werden. 6.2.1 Einen neuen Matching-Durchlauf anlegen Bevor Einstellungen für das Matching vorgenommen werden können, muss zunächst ein neuer Matching-Durchlauf angelegt werden. Dies ist in der Übersichtsseite (manage.php) des Match-Tools möglich, indem in der letzten Zeile der Tabelle auf „Neues Matching anlegen“ gedrückt wird. Optional kann vorher noch in das Textfeld links daneben ein Name für das Matching eingetragen werden. Abbildung 6.2: Die Übersichtsseite des Matching-Tools 48 6.2 Benutzung 6.2.2 Gewichte einstellen Über die Schaltfläche „Gewichte einstellen“ können die Spalten, die beim Matching berücksichtigt werden sollen, ausgewählt werden. Zudem kann deren Gewichtung durch Eingabe beliebiger ganzer Zahlen eingestellt werden. Die Gewichte werden beim Matching dann durch Division mit ihrer Summe in Verhältnisse umgerechnet. Beträgt also die Summe aller Gewichte 120, bestimmt eine Spalte mit Gewicht 60 zu 50% den Gesamtähnlichkeitswert jedes Paares. 6.2.3 Einen Matching-Durchlauf starten Die Schaltfläche „Matching Starten“ bewirkt, dass die Matching-Prozedur für den jeweiligen Durchlauf aufgerufen wird. Entsprechend der gewählten Einstellungen kann einige Zeit vergehen, bis ein Ergebnis vorliegt. Solange die Prozedur läuft, ist es nicht möglich, sie ein weiteres Mal zu starten; auch nicht für einen anderen Durchlauf. Abbildung 6.3: Einstellen der Gewichte 49 6 Handbuch Abbildung 6.4: Auswahl der Spalten für die Ergebnisübersicht 6.2.4 Ergebnisse ansehen Der Button „Ergebnis ansehen“ führt zunächst zu einer Auswahl, welche Spalten in der Ergebnisübersicht angezeigt werden sollen. So können die Spalten ausgewählt werden, die für einen ersten Eindruck interessant sind. Über das Eingabefeld „Anzahl“ wird eingestellt, wie viele Paare in der Übersicht auf der nächsten Seite dargestellt werden sollen. Ein hoher Wert kann hier zu langen Ladezeiten führen. In der Übersicht über das Ergebnis auf der nächsten Seite wird die zuvor festgelegte Anzahl an verglichenen Paaren angezeigt. Die Liste ist absteigend nach dem Ähnlichkeitswert (Spalte „sim“) sortiert. Abhängig von den zuvor ausgewählten Spalten werden die Werte der einzelnen Einträge für die Spalten ebenfalls angezeigt. Die Detailansicht eines einzelnen Paares ist mit der Schaltfläche „Details“ erreichbar. Hier werden alle vorhandenen Werte jeweils paarweise dargestellt. In der letzten 50 6.2 Benutzung Abbildung 6.5: Detailvergleich eines Paares Spalte steht, sofern das entsprechende Attribut in das Matching einbezogen wurde, der errechnete Ähnlichkeitswert für dieses Attribut. Attribute, die exakt übereinstimmen, werden grün hinterlegt. 6.2.5 Fusions-Übersicht Über die Startseite erreicht man die Übersichtsseite des Fusions-Tools über den Link „Fusions-Tool“. Hier werden die zuvor klassifizierten Paare angezeigt, die nicht als „Non-Match“ identifiziert wurden. Die jeweilige Ähnlichkeitsklasse steht oben links und ist grün hinterlegt. Für jedes Paar werden Autor und Titel beider Datensätze angezeigt. Der Button „fusionieren“ führt zur Fusionsansicht des Paares. 6.2.6 Ein Paar fusionieren In der Fusionsansicht werden auf der linken Seite die Werte der beiden Einträge angezeigt. Auf der rechten Seite ist der Vorschlag für einen fusionierten Record dargestellt. Dabei werden die Zeilen nach folgenden Kriterien farbig hinterlegt: • In rot hinterlegten Zeilen unterscheiden sich die Werte. Hier sollte der vorgeschlagene Wert noch einmal genau überprüft werden. • Bei gelb hinterlegten Zeilen hat einer der beiden Einträge keinen Wert, der andere hat jedoch einen. In diesem Fall wird der vorhandene Wert im Vorschlag übernommen. 51 6 Handbuch • Grün sind Zeilen mit übereinstimmenden Werten hinterlegt. Dies gilt auch, wenn beide Einträge NULL sind. Die Werte im Vorschlag können gegebenenfalls angepasst bzw. korrigiert werden. Ein Klick auf „Übernehmen“ führt zu einer Bestätigungsseite, auf der noch einmal die durchzuführenden Änderungen, z. B. welche Verweise angepasst werden, aufgelistet sind. Erst nach einer weiteren Bestätigung werden diese final in die Datenbank geschrieben. 52 7 Reflexion 7.1 Zusammenfassung Um Ähnlichkeiten zwischen Einträgen in der gegebenen Bibliotheksdatenbank zu finden, wurden zunächst gängige Matching-Verfahren zusammengetragen und ihre Funktionsweise erläutert. Nach einer Analyse der Datenbank wurden zunächst die Tabellen und Spalten der Datenbank ausgewählt, die für die Identifizierung geeignet sind. Ausgehend von der Auswahl konnte ein passender Matching-Algorithmus konzipiert werden, der basierend auf gewichteten Summen (Abschnitt 2.1.2) errechnet, wie ähnlich sich zwei Einträge in der Datenbank sind. Durch die quadratische Komplexität des Matching-Problems mussten Optimierungen vorgenommen werden, um die Laufzeit des Algorithmus auf praktikable Größen zu beschränkten. Hierbei hat sich gezeigt, dass der häufige Wechsel zwischen der PL/SQLEngine und der SQL-Engine die Ausführung des Algorithmus stark verlangsamt. Deshalb wurde die Anzahl der nötigen Wechsel, beispielsweise durch Zusammenfassen mehrerer Update-Operationen zu einem Insert, minimiert. Zusätzlich konnte durch ein Indexing nach den Titelanfängen der Schriften die Laufzeit erneut stark reduziert werden, da nun nicht mehr alle Schriften mit einander verglichen werden. Dies hat allerdings zur Folge, dass einige Ähnlichkeiten möglicherweise nicht mehr erkannt werden. Aufbauend auf dem Matching-Algorithmus wurde eine Weboberfläche zur Verwaltung und Konfiguration mehrerer Matching-Durchläufe entwickelt, die es ermöglicht, die zunächst nur als ähnlich erkannten Paare durch einen Benutzer näher zu klassifizieren. Für die so identifizierten Duplikate wurde eine Schnittstelle geschaffen, um diese Mehrfachbeschreibung unter Berücksichtigung der Fremdschlüsselbeziehungen anderer Tabellen zu einem einzigen Eintrag in der Datenbank zu fusionieren. 7.2 Fazit und Ausblick Mit der entwickelten Anwendung ist es möglich, die Datenbank näher zu untersuchen und die Beziehungen zwischen Einträgen aufzuzeigen, so dass tatsächliche Duplikate eliminiert werden können. Der Algorithmus zum Auffinden ähnlicher Einträge läuft mit der zuvor beschriebenen Einschränkung auf übereinstimmende Titelanfänge in akzeptabler Zeit. Sollen alle möglichen Paarkombinationen betrachtet werden, muss mit einer Laufzeit von etwa fünf Stunden gerechnet werden. Daher wird empfohlen, zunächst 53 7 Reflexion mit der Einschränkung zu arbeiten und die so gefundenen Duplikate zu beseitigen. Anschließend kann der Algorithmus ohne die Einschränkung auf alle verbleibenden Paare angewendet werden, um die zuvor nicht erkannten Ähnlichkeiten zu finden. Durch die im ersten Durchlauf reduzierte Zahl der Einträge wird der Algorithmus dann auch weniger Zeit benötigen. Insgesamt wird bei der entwickelten Anwendung noch stark auf die Interaktion mit einem Benutzer gesetzt, um die ähnlichen Paare zu klassifizieren und zu fusionieren. Hierbei kann aber Erfahrung bezüglich des Datenbestands aufgebaut werden, um die Anwendung später zu erweitern, so dass eine automatische Duplikateliminierung durchgeführt werden kann. So könnten beispielsweise Trainingsdaten für einen selbstlernenden Algorithmus gewonnen werden. Die Weboberfläche der entwickelten Anwendung hat einen eher prototypischen Charakter, weshalb für eine produktive Benutzung Maßnahmen zur Verbesserung der Usability ergriffen werden sollten. Um das Ziel eines konsistenten Datenbestandes in dieser Datenbank zu erreichen und für die Zukunft zu gewährleisten, ist eine Eliminierung der vorhandenen Duplikate allein nicht ausreichend. So stellt beispielsweise die Erfassung der Autoren auch in Zukunft eine Quelle für Inkonsistenzen dar, weil innerhalb eines Attributs mehrere Autoren angegeben werden — wodurch die Bedingung atomarer Attributwerte und somit die erste Normalform verletzt werden. Außerdem ist die Darstellung der Namen selbst ebenfalls nicht einheitlich, so dass eine gesonderte „Autor“-Tabelle sinnvoll wäre. Eine solche Tabelle existiert zwar, allerdings ist hier nur die Erfassung von Autoren vorgesehen, die in Beziehung mit dem Institut stehen. Des Weiteren wird diese Tabelle nicht mehr durchgängig gepflegt: Der neueste Eintrag stammt aus dem Jahr 2007. Ferner sollten auch die Eingabemasken zur Erfassung der Dokumente hinsichtlich ihrer Benutzerfreundlichkeit überprüft werden, da die Vermutung besteht, dass einige der Duplikate auf Eingabefehler zurückzuführen sind, die durch eine für den Benutzer unklare Funktionsweise der Masken entstanden sind. Somit stellt das Ergebnis dieser Arbeit die Grundlage zur Verfügung, um die Qualität des Datenbestandes der Bibliotheksdatenbank in zukünftigen Projekten weiter zu verbessern. 54 Abbildungsverzeichnis 3.1 ER-Diagramm des Datenbankaufbaus . . . . . . . . . . . . . . . . . . . 17 4.1 4.2 4.3 ER-Entwurf für das Datenbankschema der Anwendung . . . . . . . . . 29 Dateistruktur der Webschnittstelle . . . . . . . . . . . . . . . . . . . . 31 Genereller Ablauf des Prozesses . . . . . . . . . . . . . . . . . . . . . . 32 6.1 6.2 6.3 6.4 6.5 Übersicht über das Matching-Ergebnis . . . . Die Übersichtsseite des Matching-Tools . . . . Einstellen der Gewichte . . . . . . . . . . . . . Auswahl der Spalten für die Ergebnisübersicht Detailvergleich eines Paares . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 48 49 50 51 55 Tabellenverzeichnis 2.1 2.2 2.3 2.4 Edit-Distanz Matrix für die Zeichenketten „nicht“ und „nciht“ . Beispieldaten für den Sorted Neighbourhood Algorithmus . . . . Alle erzeugten Paare bei einem Sliding-Window-Durchlauf mit w 2-Gram Listen für die Namen „Wohl“ und „Pohl“ mit t = 0,7 . . . . . . . . =3 . . . . 7 . 13 . 13 . 15 3.1 3.2 3.3 3.4 3.5 3.6 Codierung des Anschaffungsstatus . . . . . . . Inhalt der Tabelle SCHRIFTTYP . . . . . . . Beispiel eines Duplikats einer Abschlussarbeit Beispiel eines Duplikats eines Lehrbuchs . . . Beispiel eines Duplikats eines Lehrbuchs . . . Tabellengrößen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 21 22 23 23 24 57 Literaturverzeichnis [Chr12a] Peter Christen. „A Survey of Indexing Techniques for Scalable Record Linkage and Deduplication“. In: IEEE Transactions on Knowledge and Data Engineering 24.9 (Sep. 2012), S. 1537–1555. issn: 1041-4347. doi: 10.1109/TKDE.2011.127. [Chr12b] Peter Christen. Data Matching - Concepts and Techniques for Record Linkage, Entity Resolution, and Duplicate Detection. Data-centric systems and applications. Springer, 2012. isbn: 978-3-642-31163-5. [EIV07] A.K. Elmagarmid, P.G. Ipeirotis und V.S. Verykios. „Duplicate Record Detection: A Survey“. In: IEEE Transactions on Knowledge and Data Engineering 19.1 (Jan. 2007). issn: 1041-4347. doi: 10.1109/TKDE.2007. 250581. [Mew05] Ulf Mewe. „Re-Design des Datenbankanwendungssystems für ein Hochschulinstitut“. Bachelorarbeit. Leibniz Universität Hannover, 2005. [Ros+11] M. Rosenblum u. a. Expert PL/SQL Practices: for Oracle Developers and DBAs. Apress, 2011. isbn: 978-1-4302-3485-2. 59 Erklärung Hiermit versichere ich, dass ich die vorliegende Arbeit und die zugehörige Implementierung selbstständig verfasst und dabei nur die angegebeben Quellen und Hilfsmittel verwendet habe. Hannover, 13.07.2015 Lukas Schink 61