Freigeben über


Implementieren eines Word Breaker und Stemmer

Microsoft bietet Worttrennungen und Stemmere für eine Reihe von Sprachen. In diesem Thema wird beschrieben, wie Sie benutzerdefinierte Worttrennungen und Stemmere für Sprachen und Gebietsschemas implementieren und verwenden, die über die von Microsoft bereitgestellten hinausgehen.

Hinweis

Benutzerdefinierte Worttrennungen wurden vorübergehend nicht unterstützt. Im Juli 2018 wurde eine Änderung an Windows Server 2019 vorgenommen, die verhinderte, dass DLLs ohne Microsoft-Signatur von SearchIndexer.exe geladen werden. Diese Einschränkung wurde im Januar 2021 aufgehoben.

Dieses Thema ist wie folgt organisiert:

Registrieren einer Sprachressourcen-DLL

Jede Sprachressourcen-DLL muss die folgenden Einstiegspunkte implementieren und exportieren. Die DLL kann registriert werden, um sich in einem beliebigen Ordner zu befinden.

  • DllMain ist der Standardeinstiegspunkt für DLL.
  • DllRegisterServer registriert die DLL in der Registrierung, z. B. regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
  • DllCanUnloadNow ermöglicht Clients das Aufrufen dieses Einstiegspunkts über das Component Object Model (COM), um zu bestimmen, ob das Entladen der Sprachressourcen-DLL möglich ist.
  • DllUnRegisterServer entfernt die DLL aus der Registrierung.

Registrieren einer Sprache

Die Registrierung enthält sprachspezifische Einträge für die zu indizierende Sprache, und diese Einträge steuern die sprachspezifischen Teile der Indizierungs- und Abfrageprozesse. Diese Registrierungseinträge finden Sie unter dem folgenden Registrierungsschlüssel.

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         ContentIndex
            Control
               Language
                  

Implementieren eines Word Bechers

Word Breaker implementieren IWordBreaker. Die IWordBreaker::BreakText-Methode führt die gesamte Textverarbeitung und -analyse durch. Um eine Worttrennungskomponente zu implementieren, benötigen Sie Sprachheuristiken für Ihre Sprache. Dies umfasst Informationen zur Syntax und Morphologie. Möglicherweise benötigen Sie auch eine Liste von Wörtern, die ausgeschlossen oder eingeschlossen werden sollen. Sie erstellen die Datei mit Rauschwörtern für Ihr Sprachgebietsschema aus der Liste der ausgeschlossenen Wörter. Weitere Informationen zu linguistischen Überlegungen und wie sich diese Überlegungen auf Implementierungen von Worttrennungen auswirken, finden Sie unter Überlegungen zu Linguistik und Unicode.

Der Standard Zweck von IWordBreaker::BreakText besteht darin, Text kontinuierlich von der TEXT_SOURCE zu verarbeiten, bis der gesamte Text verarbeitet ist oder bis der Worttrenner auf einen Fehler stößt. In dieser Datenverarbeitungsschleife ruft IWordBreaker::BreakText Analyse- und Hilfsprogrammmethoden auf, die bestimmte Aufgaben für diesen Prozess ausführen. Beispielsweise kann die deutsche Worttrennung zusammengesetzte Wörter verarbeiten, während die französische Worttrennung diakritische OderClitics verarbeiten kann. Die spezifischen Funktionen, die die Worttrennung ausführt, und die Strategie, die er bei der Ausführung dieser Aufgaben verwendet, hängen vollständig von den Anforderungen für diese Sprache ab.

Beim Brechen von Text identifizieren Worttrennungen "alternative" Formen für Wörter, die möglicherweise mehrere Darstellungen aufweisen. Zwischen den generierten Wörtern wird keine semantische Beziehung impliziert. Tatsächlich darf das ursprüngliche Wort nicht in die Liste der Alternativen aufgenommen werden. Die alternativen Formulare werden an derselben Position im Index gespeichert wie das ursprüngliche Wort, um anzugeben, dass sie identisch sind.

Wenn ein Dokument im Index enthalten ist, wird jedem Wort ein ganzzahliger Wert zugewiesen, der den Offset oder den Abstand des Worts vom Anfang eines Dokuments darstellt. Der relative Abstand zwischen Wörtern in einer Abfrage wird mit den Offsets verglichen, die im Volltextindex gespeichert sind. Die Abfrage "Where is Kyle's document" entspricht jedem Dokument mit "Where" am Offset n, "is" bei n+1, "Kyle's" bei n+2 und "document" mit n+3. "Wo wird das Dokument von Kyle in der Datenbank abgelegt?" wird wie folgt dargestellt:

               
Hierbei gilt: stimmt Kyle Kyle's
Dokument Abgelegt in the Datenbankdatenbank

 

In diesem Beispiel speichert die Worttrennung alternative Formulare für "Kyle" ("Kyle") und "database" ("Datenbank") im Index. Die Worttrennung generiert und speichert alternative Wörter während des Indexerstellungsprozesses unter den folgenden Bedingungen:

  • Wenn ein alternatives Wort wahrscheinlich als einzelnes Wort in einer Abfrage angezeigt wird
  • Wenn ein Stemmer wahrscheinlich nicht das ursprüngliche Wort von der Alternative ableiten kann

Das Generieren alternativer Wortformen erhöht die Anzahl der Möglichkeiten, wie Abfragen einen Satz darstellen und übereinstimmen, wie in den folgenden Variationen gezeigt:

  1. Wo wird das Kyle-Dokument in der Datenbank abgelegt?
  2. Wo ist Kyles Dokument in der Datenbank abgelegt?
  3. Wo wird das Kyle-Dokument in der Datenbank abgelegt?
  4. Wo ist Kyles Dokument in der Datenbank abgelegt?

WordSink und PhraseSink

Word Trennzeichen verwenden die IWordSink- und IPhraseSink-Objekte, um alle Wörter und Ausdrücke zu sammeln und zu speichern, die sie aus Text extrahieren. Eine Worttrennung speichert Wörter in einer Form, die dem ursprünglichen Wortformular im Dokument so nah wie möglich ist. IPhraseSink speichert Ausdrücke zur Abfragezeit. Ausdrücke verbessern die Relevanz von Abfrageergebnissen, da längere Wortfolgen seltener sind und eine größere Unterscheidung bieten als kleinere Ausdrücke. Wenn der Indexer einen Ausdruck zur Abfragezeit im IPhraseSink platziert, erstellt er eine instance der Worttrennung, um den Ausdruck in Wörter zu unterteilen. Der Indexer wertet dann den Ausdruck aus, indem er überprüft, ob die Wörter im Ausdruck im Index nebeneinander vorkommen. Wenn beispielsweise "ABCD" im Index an den Positionen x, x+1, x+2 und x+3 auftritt, tritt die Ausdrucksübereinstimmung auf, wenn eine benachbarte Teilzeichenfolge von "ABCD" in einer Abfrage übermittelt wird. Diese Strategie ist effektiv für zeichenbasierte Worttrennungen, die Ausdrücke und lange Wörter während der Indexerstellung aufteilen und Ausdrücke während der Abfragezeit generieren.

Zeilenumbrüche

Brüche sind die Leerzeichen zwischen Wörtern. Leerzeichen, Interpunktion, Formatierung oder nur die Art der Sprache selbst können zu Unterbrechungen führen. Es gibt vier verschiedene Typen von Umbrüchen, die der Indexer verwendet: Wortende (EOW), Ende des Satzes (EOS), Ende des Absatzes (EOP) und Ende des Kapitels (EOC). Der EOW-Umbruch ist der Standard-Umbruch. Nach jedem Token gibt jeder Umbruch einen anderen semantischen Abstand zwischen den Wörtern auf beiden Seiten an. Wörter, die durch EOW getrennt sind, weisen die engste semantische Verknüpfung auf, gefolgt von EOS, EOP und EOC. Mehrere Aufrufe von IWordSink::P utBreak sind kumulativ und analog zum Einfügen von NULL-Wörtern oder Sätzen.

Skalierbarkeit, Leistung und Sicherheit

Die Art und Weise, wie die Worttrennung auf gleichzeitige Aufrufe reagiert, wird weitgehend durch Die Wahl des Threadingmodells bestimmt. Der Indexer ist eine Singlethreadanwendung. Damit Worttrennungen in einer Singlethreadumgebung funktionieren, müssen Worttrennungen mithilfe eines "freien" oder "beides"-Threadingmodells geschrieben werden. Word-Trennzeichen dürfen sich nicht mithilfe des Threadingmodells "apartment" bei COM registrieren.

Es wird empfohlen, dass Worttrennungen globale Zustände vermeiden und Daten im instance für die Worttrennung speichern. Die einzigen Inhalte, die in der Word-Breakerimplementierung gespeichert werden sollten, sind die Parameter fQuery und ulMaxTokenSize. Word Breaker sollten nicht mehr als zwei Mal langsamer sein als der von der englischen Worttrennung festgelegte Benchmark. Word Die Leistung des Breakers sollte sich auch mit erhöhten Hardwarefunktionen verbessern.

Word Breaker für den Indexer, der im Sicherheitskontext des lokalen Systems ausgeführt wird. Sie sollten geschrieben werden, um Puffer zu verwalten und ordnungsgemäß zu stapeln. Alle Zeichenfolgenkopien müssen explizite Überprüfungen aufweisen, um Pufferüberläufe zu verhindern. Sie sollten immer die zugeordnete Größe des Puffers überprüfen und die Größe der Daten anhand der Größe des Puffers testen. Word Breaker können nicht davon ausgehen, dass der an die IWordBreaker::BreakText-Methode übergebene Text wohlgeformt ist. Weitere Informationen zur Problembehandlung bei Worttrennungen finden Sie unter Problembehandlung für Sprachressourcen und bewährte Methoden.

Implementieren eines Stemmer-Typs

Stemmers implementieren die IStemmer-Schnittstelle . Die IStemmer::GenerateWordForms-Methode generiert für ein bestimmtes Eingabewort eine Liste mit eingelenkten Wortformularen. Um eine Stemmerkomponente zu implementieren, müssen Sie über Sprachheuristiken für Ihre Sprache verfügen. Dies umfasst Informationen zur Morphologie. Möglicherweise benötigen Sie auch eine Liste von Wörtern, die ausgeschlossen oder eingeschlossen werden sollen. Weitere Informationen zu linguistischen Überlegungen und wie sich diese Überlegungen auf Stemmerimplementierungen auswirken, finden Sie unter Überlegungen zu Linguistik und Unicode.

Es wird empfohlen, dass Stemmer den Genitiv- oder Possessivfall für Wörter nicht generieren sollten. Beispielsweise wird "David" nicht als alternative Form für "Davids" generiert. Der Worttrenner generiert sowohl "David" als auch "Davids", wenn er "Davids" analysiert.

Der Stemmer verwendet das IWordFormSink-Objekt , um die Liste der alternativen Wörter zu sammeln. IWordFormSink::P utWord generiert das letzte Wort aus dem Stemmer. In allen Fällen ist dieses letzte Wort mit dem Eingabewort von IStemmer::GenerateWordForms identisch. In Bezug auf das Wort "schwimmen" generiert der Stemmer beispielsweise die folgenden Wortformen: "schwimmen", "swimmer", "swimmer", "swims", "swam" und "swum" durch Aufrufe von IWordFormSink::P utAltWord. Der Stemmer generiert "schwimmen" durch IWordFormSink::P utWord.

Skalierbarkeit, Leistung und Sicherheit

Stemmer müssen wie Worttrennungen ein "freies" Threadingmodell verwenden und sich bei COM registrieren, wobei ihr Threadingmodell auf "frei" oder "beides" festgelegt ist. Windows Search ruft gleichzeitig separate Instanzen des Stemmers aus verschiedenen Threads auf. Stemmers sollten daher über minimale instance Daten verfügen.

Die Genauigkeit von Stemmer hat einen erheblichen Einfluss auf die Abfragerlevanz. Wenn der Stemmer den Text falsch einstammt, können Abfragen unvorhersehbare und ungenaue Ergebnisse zurückgeben. Stemmers müssen Hunderte von Abfragen pro Sekunde verarbeiten, ohne sich negativ auf die Abfrageleistung zu auswirken. Die Leistung von Stemmer sollte mit erhöhter Hardwarefunktion verbessert werden. Informationen zur Problembehandlung bei Stemmeren finden Sie unter Problembehandlung für Sprachressourcen und bewährte Methoden.

Stemmers für Windows Search werden im Lokalen Sicherheitskontext ausgeführt. Sie sollten geschrieben werden, um Puffer zu verwalten und ordnungsgemäß zu stapeln. Alle Zeichenfolgenkopien müssen explizite Überprüfungen aufweisen, um Pufferüberläufe zu verhindern. Sie sollten immer die zugeordnete Größe des Puffers überprüfen und die Größe der Daten anhand der Größe des Puffers testen.

Erweitern von Sprachressourcen

Grundlegendes zu Sprachressourcenkomponenten

Überlegungen zu Linguistik und Unicode

Problembehandlung für Sprachressourcen und bewährte Methoden