dsci-txt Studienarbeit SS 2023#

In der Veranstaltung dsci-txt haben wir im wesentlichen gelernt, aus einer Menge von Texten eine Textähnlichkeits-Matrix zu berechnen, basierend auf der Cosinus-Ähnlichkeit in einem einem Bag of Words. “Upstream” haben wir dazu die Texte gesäubert, mit RegEx nach Mustern gesucht, in Tokens zerlegt, Stoppwörter entfernt, die Häufigkeit von Wörtern gezählt, manuell eine Variante von tf-idf berechnet; auch mit n-Grammen auf Zeichen-Ebene.

Im Studienprojekt wollen wir mit diese uns gut bekannte Methoden auf einen uns bereits bekannten Datensatz “Musterdatensatz” anwenden – nun allerdings in einem integrierten praktischen Szenario.

Datensatz, Grundlage:

Ziel:

  • Ähnlichkeit von Datensätzen suchen, auf Grundlage der Spalten dct:title und dct:description.

Neu gegenüber den bisherigen Vorgehensweisen in der Veranstaltung:

  • Inhaltserschließung durch “taggen” einzelner Wörter durch Entity-Erkennung, s.u.

  • Getaggte Wörter sollen erst einmal nicht zur Ähnlichkeit herangezogen werden, sondern zur gezielteren Selektion, Filterung etc. verwendet werden.

Praxiskontext#

Gegeben: der “Musterdatensatz” als CSV-Datei. Unser Auftraggeber will eine Website bauen, auf der man im Musterdatensatz „gezielt suchen“ kann. Unser Teil-Auftrag für uns als Textmining-Spezialisten bezieht sich ausschließlich auf die zwei Spalten dct:title und dct:description. (Wir verwenden die Spalte dct:identifier als Schlüssel.)

Unter „gezielt suchen“ versteht der Auftraggeber folgendes:

  • Suche nach Jahr und/oder Datum

  • Suche nach einem Gebiet in weitestem Sinn, mit Gebiets-Typen wie z.B. Ort, Stadt, Gemeinde, Bezirk, Stadtbezirk, Ortsgemeinde, OG, Verbandsgemeinde, Stadtteil, Ortsteil etc.

    • z.B. “Stadt Leipzig”, “Bezirk Elmsbüttel”, “OG Ettringen”

Offensichtlich missversteht der Auftraggeber das Wort „suchen“: Tatsächlich will er nicht jedes mal neu in der Datei auf die Suche gehen, sondern er will, dass wir für ausgewählte „gezielte“ Suchen vorab einen Index erstellen, die Dokumente indizieren.

Eine Teilaufgabe für uns besteht insbesondere darin, für Gebiete eine Tabelle zu erstellen mit den Spalten dct:identifier, Ortstyp, Ort. (klar: das ist eine n:m:o – Relation).

Die anderen Suchen sollen so funktionieren:

  • Der Kunde gibt einen dct:identifier vor

  • Das System gibt eine gerankte Liste der n ähnlichsten Dokumente vor.

Wenn wir mit einem BOW arbeiten, macht es wenig Sinn, Tokens wie Jahr oder Datum in die Ähnlichkeit mit einzubeziehen. Ähnliches gilt für Orte. In unserer Ähnlichkeits-Suche sind Items wie Jahr, Datum, Ort, die wir ja über die Indizierung schon abdecken können, also nicht mehr enthalten.

Entity-Erkennung#

Aufgabe:

  • tagge strukturell klar definierten Elemente, z.B. Jahr, Datum

  • tagge Orte in weitestem Sinn

  • tagge Named Entities, die wir z.B. in in einem dict haben

Lösung für beides: Notebook regex: IBAN oder ISBN?. Theorie z.B. Regulären Ausdruck in NEA umwandeln - Automaten und Formale Sprachen

taggen#

Wie “taggen” wir? Wir erzeugen einen neuen String:

  • ohne Leerzeichen

  • mit vorangestelltem Hashtag

  • alle Leerzeichen im getaggten String sind_durch_Unterstrich_ersetzt.

z.B. so:

  • in den Jahren 2017 bis …

    • in den Jahren #Jahr_2017 bis …

  • Zeitraum vom 31.12.2002 bis 06.06.2015

    • Zeitraum vom #Datum_31.12.2002 bis #Datum_06.06.2015

  • Die einzelnen Stadtteile der Stadt Korschenbroich sind …

    • Die einzelnen Stadtteile der Stadt #Stadt_Korschenbroich sind …

Was so auffällt#

dct:identifier:

  • Es sind Daten enthalten, die da nicht hingehören (reparabel?), und die manchmal offensichtlich falsch sind (irreparabel).

dct:title und dct:description:

  • Manche Inhalte sind in eine XML-typische Struktur <![CDATA[ ... ]]> eingeschlossen.

  • Manche Inhalte sind Dateinamen von Bildern: Ist das interessant?

  • Die Beschreibungen sind von stark unterschiedlicher Länge.

  • Es scheint unklar zu sein, worin semantisch der Unterschied zwischen dct:title und dct:description besteht.

Strategie:#

  • Texte säubern

  • Jahr, Datum, Ort mit regex taggen

  • dann Indizes erstellen:

    • Index 1, Text-Tag-Index: In welchem Text kommen welche getaggten Wörter vor?

    • Index 2, Tag-Text-Index: Welcher Tag kommt in welchem Text vor?

    • Notebook: Index umdrehen

  • Bag of Words erstellen, in dem die getaggten Wörter nicht mehr enthalten sind (denn die sind jetzt ja indexiert)

  • ggf. Bag of Words in einen Bag of n-Grams auf Zeichenebene überführen

  • Ähnlichkeitssuche jetzt nur noch auf diesem restlichen Bag ohne die indexierten Items

Universitätsstadt Rostock

Idee Weiterentwicklung#

Wir indizieren oben ja Gebiete, anhand von regex-Patterns wie “Stadt Leipzig”, “Ortsteil Auloh” usw. Als Ergebnis erhalten wir eine Liste von Namen von Gebieten. Mit dieser Liste von Gebieten können wir weiteres Wissen generieren:

  • Wir können daraus automatisch wieder eine regex bauen, mit der sich in einem zweiten Durchgang auch Gebiete identifizieren lassen, die nicht mit “Stadt”, “Ortsteil” etc. angegeben sind, und auch diese taggen.

  • Mit unserem Pattern “Stadt” finden wir die “Stadt Rostock”, nicht aber die “Universitätsstadt Rostock” oder “Kommune Rostock”. Mit obiger Liste von Gebieten können wir weitere Gebietstypen (die “linken Nachbarn” einer Stadt heraussuchen) und daraus manuell unsere Liste von Gebietstypen erweitern.