FTS im MS SQL-Server (3. Teil): Thesauri und Synonyme

21. November 2013

Vom Philosophen Ludwig Wittgenstein stammt folgendes Zitat: "Die Grenzen meiner Sprache bedeuten die Grenzen meiner Welt". Während einzelne Bilder und Grafiken häufig eindeutige Sachverhalte beschreiben – daher vermutlich auch das berühmte Sprichwort „Ein Bild sagt mehr als 1000 Worte“ – können je nach Kontext unterschiedliche Worte ähnliche oder gar die gleiche Bedeutungen haben. Im letzteren Fall wird dann konkret von Synonymen gesprochen.

Mein erster Beitrag Flexionen-Abfragen mit FTS und MS SQL-Server zeigte, wie die Volltextsuche für Abfragen von Wortbeugungen bzw. Flexionen eingesetzt werden kann. In meinem zweiten Artikel konnten die wichtigsten Komponenten, die für die Volltextsuche innerhalb des SQL-Servers benötigt werden, sowohl vorgestellt als auch deren Zusammenspiel untereinander näher beschrieben werden.

In diesem dritten und letzten Blog-Beitrag dieser kleinen Serie wird nun auf das Thesauri-Konzept innerhalb der Volltextsuche des MS SQL-Server eingegangen. Mit Hilfe von Thesauri bzw. Thesauren – beide Plural-Formen sind laut aktueller deutscher Rechtschreibung gültig – können Begrifflichkeiten organisiert werden, zwischen denen eine bestimmte Beziehung besteht oder die einen ähnlichen Bedeutungsumfang besitzen.

Motivation – Suchmaschinen

Ein klassisches Anwendungsbeispiel für die Verwendung ähnlicher Begriffe oder Synonyme in der IT sind Suchmaschinen wie Bing oder Google. Ein Benutzer, welcher im Internet nach dem Begriff "Schreibutensilien" recherchiert, wird sich meisten auch freuen, wenn ihm Artikel aus der Rubrik "Büromaterial" als Suchergebnis zurückgeliefert werden. Wird in einem konkreten Fall beispielsweise ein ”Heftgerät” gesucht, so werden sicherlich auch Produkte mit der synonymischen aber auch umgangssprachlicheren Bezeichnung "Tacker" akzeptiert. Vielleicht wird neben einem Heftgerät gleich noch ein neuer "Locher" benötigt, der sofort bestellt werden kann, und wäre es dann nicht optimal, wenn all diese "Schreibwaren” – schon wieder ein Synonym Smiley – strukturiert und übersichtlich auf einer Seite angeboten würden?

Eine Stärke moderner Suchmaschinen – egal welcher Anbieter nun präferiert wird – besteht darin, die eingegeben Suchbegriffe nicht nur als lose Worte oder Textbausteine zu interpretieren, sondern diese in den semantischen Kontext des Suchers einzugliedern. Die folgende Abbildung zeigt mögliche Suchergebnisse der von Microsoft entwickelten Suchmaschine Bing für die beiden Begriffe "schreibwaren" und "heftgerät" (in diesem Beispiel bewusst klein geschrieben) und stellt somit eine sicherlich gute Lösung für das eben beschriebene Szenario dar:

image

Verwaltung von Thesaurus-Wörterbüchern

Zur Verwaltung ähnlicher oder verwandter Wörter für die Volltextsuche innerhalb des SQL-Servers bedarf es Thesaurus-Wörterbücher, welche die einzelnen Begrifflichkeiten in eine bestimmte Relation setzen und miteinander verknüpfen. Diese Thesaurus-Wörterbücher werden nach der Installation des SQL-Servers standardmäßig als einfache XML-Dateien im MSSQLFTData-Verzeichnis abgelegt[1].

Jede Sprache besitzt dabei ihr eigenes Thesaurus-Wörterbuch, welches durch einen eindeutigen Dateinamen gekennzeichnet ist. So lautet der Name für das englischsprachige Wörterbuch "tseng.xml", während für einen Thesaurus in deutscher Sprache die Datei "tsdeu.xml" zum Einsatz kommt. Neben den sprachspezifischen Wörterbüchern gibt es zusätzlich noch eine XML-Datei, welche für alle Sprachen gültig ist. Diese besitzt den Dateinamen "tsglobal.xml" [1].

Sowohl der Speicherort als auch die Dateinamen der Thesaurus-Datei können individuell verändert werden. Hierzu sind allerdings einige Konfigurationen notwendig, u.a. auch das Anpassen einiger Registrierungsschlüssel[1].

Die folgende Abbildung zeigt Ausschnitte des MSSQLFTData-Verzeichnisses, bei dem noch keine Änderungen bezüglich der Standardkonfiguration vorgenommen wurden, mit einigen Thesaurus-Wörterbüchern, insbesondere dem für die deutsche Sprache:

image
 

Aufbau von Thesaurus-Wörterbüchern

Eine Thesaurus-Datei, in welcher verwandte Begriffe oder Synonyme verwaltet werden, besitzt allgemein folgende XML-Struktur [1]:

   1: <XML ID="Microsoft Search Thesaurus">

   2:     <thesaurus xmlns="x-schema:tsSchema.xml">

   3:         <diacritics_sensitive>0/1</diacritics_sensitive>

   4:         <expansion>

   5:             <sub>Term1</sub>

   6:             <sub>Term2</sub>

   7:             <sub>...</sub>

   8:         </expansion>

   9:         <replacement>

  10:             <pat>Pattern</pat>

  11:             <sub>substitution1</sub>

  12:             <sub>substitution2</sub> 

  13:             <sub>...</sub>

  14:         </replacement>

  15:     </thesaurus>

  16: </XML>

Besonderer Bedeutung kommen hierbei drei Bereichen zu[1]:

  • Diakritische Zeichen:
Durch das <diacritics_sensitive>-Element wird festgelegt, wie diakritische Zeichen bzw. Wörter mit Akzenten innerhalb der Volltextsuche behandelt werden. Sollen beispielsweise die beiden Worte "café" und "cafe" nicht unterschieden werden, so muss “0” als Wert in dieses XML-Element eingefügt werden. Entsprechend muss, sofern die beiden Worte unterschiedlich behandelt werden sollen, der Wert “1” als Konfigurationseinstellung hinterlegt werden.

  • Erweiterungen:

Mit Hilfe von Erweiterungen, repräsentiert durch die <expansion>-Elemente, werden verwandte Begriffe und Synonyme zu einer Gruppe zusammen gefasst. Des Weiteren müssen alle Begriffe einer solchen Gruppe jeweils von einem <sub>-Elemente umgeben in das Thesaurus-Wörterbuch eingebettet werden, damit diese von der Volltextsuche gefunden werden können.
  • Ersetzungen:

Eine Ersetzung ist zunächst in ein <replacement>-Elemente eingeschlossen. Innerhalb dieses Elements können Begriffe, vom <pat>-Element umgeben, durch andere Textmuster, welche wiederum in ein  <sub>-Elemente eingebettet sein müssen, ausgetauscht werden. Im Gegensatz zu Erweiterungen werden durch die Volltextsuche bei Ersetzungen die substituierten Begriffe nicht mit zurück geliefert.

 

Modifizieren und Verwenden von Thesauri-Wörterbüchern

Im Folgenden wird anhand eines kleinen Beispielsszenarios schrittweise erläutert, wie Thesaurus-Wörterbücher angepasst und für die Volltextsuche zur Verfügung gestellt werden können. Des Weiteren wird noch gezeigt, wie mit Hilfe von SQL-Statements Synonyme abgefragt und gefunden werden können.
1.) Thesaurus-Datei anpassen

Im ersten Schritt gilt es zu überlegen, welche Begriffe zu einzelnen Gruppen von Synonymen zusammengefasst werden sollen. Entsprechend muss das Thesaurus-Wörterbuch bzw. die XML-Datei editiert werden.

Sollen beispielsweise, am Szenario aus Abschnitt “Motivation – Suchmaschinen” dieses Artikels orientiert, die Begriffe “Bürobedarf” und “Schreibutensilien” einer ersten Thesaurus-Gruppe zugeordnet werden und “Tacker”, “Hefter” und “Heftgerät” eine zweite Gruppe bilden, so könnte ein entsprechendes Thesaurus-Wörterbuch dem folgenden XML-Segment entsprechen:

   1: <XML ID="Microsoft Search Thesaurus">

   2:     <thesaurus xmlns="x-schema:tsSchema.xml">

   3:         <diacritics_sensitive>1</diacritics_sensitive>

   4:         <!-- 1. Gruppe-->

   5:         <expansion>

   6:             <sub>Bürobedarf</sub>

   7:             <sub>Schreibutensilien</sub>

   8:         </expansion>

   9:         <!-- 2. Gruppe-->

  10:         <expansion>

  11:             <sub>Tacker</sub>

  12:             <sub>Hefter</sub>

  13:             <sub>Heftgerät</sub>

  14:         </expansion>

  15:     </thesaurus>

  16: </XML>

2.) Thesaurus-Datei laden
Im zweiten Schritt muss die modifiziert Thesaurus-Datei in die SQL-Server-Instanz geladen werden. Dies erfolgt mit Hilfe der System-Prozedur sys.sp_fulltext_load_thesaurus_file. Als Parameter werden hier sowohl der LCID (=Language Code Identifier), d.h. der Ländercode für die gewünschte Sprachregion, als auch ein Kennzeichen für eventuell gewünschtes Überschreiben bereits bestehender Thesauri erwartet.

Der folgende Code-Ausschnitt zeigt das Laden der deutschsprachigen Thesaurus-Datei (LCID=1031) mit Überschreiben-Option (@loadOnlyIfNotLoaded = 0):

   1: EXEC sys.sp_fulltext_load_thesaurus_file 1031, @loadOnlyIfNotLoaded = 0;

3.) Thesaurus-Tabelle mit Begriffen anlegen

Als nächstes muss in der Datenbank, in welcher die Volltextsuche verwendet werden soll, eine Tabelle mit den entsprechenden Begriffen angelegt werden. Die Tabellen-Spalten, die für die Volltextsuche verwendet werden sollen, müssen dabei einem Volltext-Index zugewiesen werden. Wie dies erfolgen kann, wurde bereits in meinem zweiten Artikel detailliert erläutert. Insbesondere gilt es hier die speziellen Datentypen zu berücksichtigen, für die die Volltextsuche des SQL-Server zum Einsatz kommen können. Auch dies ist in meinem vorherigen Artikel dargelegt worden.

Die folgende Abbildung soll als Anschauungsbeispiel dienen. Hier wird der Design-Modus einer einfachen Datenbank-Tabelle (Name: “TblProduct”) gezeigt, welche eine Spalte vom Datentyp Integer (Name: “Id”) und eine Spalte des varchar-Datentyps (Name: “ProductDescription”) besitzt. In den Spalten-Eigenschaften kann "im “Full-text Specification”-Abschnitt überprüft werden, ob eine Datenbank-Spalte (hier die ProductDescription-Spalte) für die Volltextsuche benutzt werden kann:

 
image
 
4.) Thesauri-Begriffe einfügen
Nachdem die Thesauri-Tabelle erzeugt und konfiguriert worden ist, müssen als nächstes die Begriffe, die von der Volltextsuche eventuell gefunden werden sollen, in die Tabelle eingetragen werden. Für die  Begriffe “Büromaterial”, “Schreibutensilien”; “"Tacker”, “Heftgerät” und “Hefter”, welche auch im Beispiel-Thesaurus-Wörterbuch angegeben sind, kann dies durch folgendes INSERT-Statement erfolgen:
   1: INSERT INTO TblProduct(Id, ProductDescription)

   2: (

   3:     SELECT (1, 'Bürobedarf') UNION ALL

   4:     SELECT (2, 'Schreibutensilien') UNION ALL

   5:     SELECT (3, 'Tacker') UNION ALL

   6:     SELECT (4, 'Hefter')UNION ALL     

   7:     SELECT (5, 'Heftgerät')

   8: );

Mit einem einfachen “SELECT *”-Befehl sollte abschließend überprüft werden, ob die Begriffe wirklich in die Tabelle eingefügt worden sind. Im positiven Fall würde ein Abfragefrageergebnis wie folgt aussehen: 
image
5.) Abfragen von Thesauri bzw. Synonymen

Im letzten Schritt gilt es nun zu überprüfen, ob die verwandten Begriffe und Synonyme auch wirklich mit Hilfe von SQL-Statements gefunden werden können. Die allgemeine Abfrage-Form für sämtliche folgende SQL-Anweisungen orientieren sich ausschließlich am folgenden Muster [2]:

   1: SELECT * FROM @TabellenOrView -- Tabelle oder View, die abgefragt werden sollen

   2: WHERE CONTAINS(@FTSColumns, -- @FTSColumns: Spalten mit für Volltextsuche 

   3: N'FORMSOF (THESAURUS, ' + @SearchTerm + ')') -- @SearchTerm: Suchbegriff

 
Soll entsprechend des Beispiel-Thesaurus-Wörterbuchs neben “Schreibutensilien” gleichzeitig auch “Büromaterial, beide Begriffe sind laut Konfiguration zu einer Gruppe zusammengefasst, gefunden werden, so kann dies durch folgendes Abfragestatement realisiert werden:  
   1: SELECT * FROM TblProduct

   2: WHERE CONTAINS(ProductDescription, N'FORMSOF (THESAURUS, Schreibutensilien)');    

Sämtliche Synonyme der ersten Gruppe werden durch folgendes Abfrageergebnis repräsentiert:
image
Um “Heftgerät”-Synonyme als Abfrageergebnis der Volltextsuche zu erhalten, was der zweiten Synonyme-Gruppe innerhalb der konfigurierten Thesaurus-Datei entspricht, muss folgender SQL-Befehl abgesetzt werden:
   1: SELECT * FROM TblProduct

   2: WHERE CONTAINS(ProductDescription, N'FORMSOF (THESAURUS, Heftgerät)');    

Als Ergebnis werden von der Datenbank folgende Einträge zurückgeliefert:
image

Zusammenfassung und Fazit

Im Rahmen dieses Beitrags wurde gezeigt, wie mit Hilfe von Thesauri innerhalb des SQL-Servers Ontologien erstellt und Begrifflichkeiten unter einem bestimmten Verwendungskontext in einem kontrollierten Vokabular verwaltet werden können. Des Weiteren wurde dargelegt, wie durch relativ einfache SQL-Statements – ähnlich wie bei modernen Suchmaschinen – erfolgreiche Abfragen nach Synonymen oder verwandten Begrifflichkeiten abgesetzt werden können.

Mit entsprechenden Programmierkenntnissen, einer eigenen Webseite sowie etwas Budget für Speicher- und Rechenkapazitäten ist es somit schon möglich, eine individuelle Suchmaschine zu entwickeln. Sie muss sich ja nicht gleich an der erfolgreichen Unternehmensgeschichte von Google orientieren Zwinkerndes Smiley.

Quellen

  1. Konfigurieren und Verwalten von Thesaurusdateien für die Volltextsuche (Letzter Zugriff: 04.11.2013)
  2. CONTAINS (Transact-SQL) (Letzter Zugriff: 04.11.2013)