Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Microsoft stellt Worttrenner und Stemmer für eine Reihe von Sprachen bereit. In diesem Thema wird beschrieben, wie Sie benutzerdefinierte Wörtertrennungen und Wortstammerkennungen für Sprachen und Gebietsschemas implementieren und verwenden, die über die von Microsoft bereitgestellten Gebietsschemas hinausgehen.
Hinweis
Benutzerdefinierte Wörtertrennungen wurden vorübergehend nicht unterstützt. Im Juli 2018 wurde eine Änderung an Windows Server 2019 vorgenommen, die verhinderte, dass DLLs ohne Eine Microsoft-Signatur von SearchIndexer.exegeladen werden. Diese Einschränkung wurde im Januar 2021 aufgehoben.
Dieses Thema ist wie folgt organisiert:
- Registrieren einer Sprachressourcen-DLL
- Registrieren einer Sprache
- Implementierung eines Word Beakers
- Die Implementierung eines Stemmers
- Verwandte Themen
Registrieren einer Sprachressourcen-DLL
Jede Sprachressourcen-DLL muss die folgenden Einstiegspunkte implementieren und exportieren. Die DLL kann in einem beliebigen Ordner registriert werden.
- 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 sprache, die indiziert wird, und diese Einträge steuern die Teile der Indizierungs- und Abfrageprozesse, die sprachspezifisch sind. Diese Registrierungseinträge finden Sie unter dem folgenden Registrierungsschlüssel.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Implementieren eines Word-Beakers
Worttrenner implementieren IWordBreaker. Die IWordBreaker::BreakText-Methode führt alle Textverarbeitungs- und Analysevorgänge durch. Um eine Worttrennungskomponente zu implementieren, müssen Sie über Sprach heuristiken für Ihre Sprache verfügen. Dazu gehören 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 Rauschwörterdatei für Ihr Sprachgebiet aus der Liste der ausgeschlossenen Wörter. Weitere Informationen zu sprachlichen Überlegungen und dazu, wie sich diese Überlegungen auf Implementierungen von Wörtertrennungen auswirken, finden Sie unter "Linguistische und Unicode-Überlegungen".
Der Hauptzweck von IWordBreaker::BreakText besteht darin, Text kontinuierlich aus der TEXT_SOURCE zu verarbeiten, bis entweder der gesamte Text verarbeitet ist oder der Worttrennungsmechanismus auf einen Fehler stößt. Während in dieser Datenverarbeitungsschleife ruft IWordBreaker::BreakText Analyse- und Hilfsmethoden auf, die bestimmte Aufgaben für diesen Prozess ausführen. Beispielsweise könnte das deutsche Wörterbuch zusammengesetzte Wörter behandeln, während das französische Wörterbuch diakritische Zeichen oder Klitika verarbeiten könnte. Die spezifischen Funktionen, die das Wortteilungsprogramm ausführt, und die Strategie, die es bei der Ausführung dieser Aufgaben verwendet, hängen vollständig von den Anforderungen der jeweiligen Sprache ab.
Beim Umbrechen von Text identifizieren Worttrenner 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 wie das ursprüngliche Wort gespeichert, 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" stimmt mit jedem Dokument überein, das "Where" bei Offset n, "is" bei n+1, "Kyles" bei n+2 und "Dokument" bei n+3 enthält. "Wo wird das Dokument von Kyle in der Datenbank abgelegt?" wird wie folgt dargestellt:
| Wobei | auf | Kyle Kyle es |
Dokument | eingereicht | in | das | Datenbankdatenbank |
In diesem Beispiel speichert die Wortzerlegung alternative Formen für "Kyle" ("Kyles") und "Datenbank" ("Daten Bank") im Index. Die Worttrennung generiert und speichert alternative Wörter während des Erstellungsprozesses des Index unter den folgenden Bedingungen:
- Wenn ein alternatives Wort wahrscheinlich als einzelnes Wort in einer Abfrage angezeigt wird
- Wenn ein Stemmer wahrscheinlich nicht vom alternativen Wort das ursprüngliche Wort 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:
- Wo wird das Kyle-Dokument in der Datenbank abgelegt
- Wo befindet sich das Dokument von Kyle in der Datenbank.
- Wo ist Kyle-Dokument in der Datenbank abgelegt
- Wo befindet sich das Dokument von Kyle, das in der Datenbank abgelegt wurde
WordSink und PhraseSink
Wortteiler verwenden die IWordSink und IPhraseSink-Objekt, um alle Wörter und Ausdrücke zu sammeln und zu speichern, die sie aus dem Text extrahieren. Ein Wortteiler speichert Wörter in einer Form, die der ursprünglichen Wortform im Dokument so nahe wie möglich kommt. IPhraseSink speichert Phrasen zum Zeitpunkt der Abfrage. Ausdrücke verbessern die Relevanz von Abfrageergebnissen, da längere Wörterabfolgen seltener sind und eine größere Unterscheidung als kleinere Ausdrücke bieten. Wenn der Indexer während der Abfragezeit einen Ausdruck in der IPhraseSink platziert, erstellt er eine Instanz des Worttrenners, um den Ausdruck in Wörter zu unterteilen. Der Indexer wertet dann den Ausdruck aus, indem überprüft wird, ob die Wörter im Ausdruck nebeneinander im Index vorkommen. Wenn z. B. "ABCD" in der Indexposition x, x+1, x+2 und x+3 auftritt, tritt die Begriffsüberstimmung auf, wenn eine angrenzende 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.
Unterbrechungen
Leerzeichen sind Zwischenräume zwischen Wörtern. Leerzeichen, Interpunktion, Formatierung oder die Natur der Sprache selbst können zu Unterbrechungen führen. Es gibt vier verschiedene Arten von Umbrüchen, die der Indexer verwendet: Ende des Worts (EOW), Ende des Satzes (EOS), Ende des Absatzes (EOP) und Ende des Kapitels (EOC). Der EOW-Umbruch ist der Standardwechsel. Nach jedem Token zeigt jedes Trennzeichen einen unterschiedlichen semantischen Abstand zwischen den Wörtern auf beiden Seiten an. Durch EOW getrennte Wörter weisen die strengste semantische Verknüpfung auf, gefolgt von EOS, EOP und EOC. Mehrere Aufrufe von IWordSink::P utBreak sind kumulativ und entsprechen dem Einfügen von NULL-Wörtern oder Sätzen.
Skalierbarkeit, Leistungsfähigkeit und Sicherheit
Die Art und Weise, wie der Worttrenner auf gleichzeitige Aufrufe reagiert, hängt weitgehend von der Wahl des Threadingmodells ab. Der Indexer ist eine Singlethread-Anwendung. Damit Wörtertrennungen in einer Einzelthreadumgebung funktionieren, müssen Wörtertrennungen mit einem "freien" oder "beides" Threadingmodell geschrieben werden. Worttrenner dürfen sich nicht mit dem COM-Threadingmodell "apartment" registrieren.
Es wird empfohlen, dass Wörtertrennungen globale Zustände vermeiden und Daten in der Instanz für die Worttrennung speichern. Der einzige Inhalt, der in der Word Breaker-Implementierung gespeichert werden soll, ist für die Parameter fQuery und ulMaxTokenSize. Worttrennungsalgorithmen sollten nicht mehr als zwei Mal langsamer sein als der von der englischen Worttrennung festgelegte Maßstab. Die Leistung von Word-Unterbrechungen sollte auch mit einer erhöhten Hardwarefunktion verbessert werden.
Worttrenner für den Indexer werden im Sicherheitskontext des lokalen Systems ausgeführt. Sie sollten geschrieben werden, um Puffer zu verwalten und richtig zu stapeln. Alle Zeichenfolgenkopien müssen explizite Überprüfungen aufweisen, um Pufferüberläufe zu schützen. Sie sollten immer die zugewiesene Größe des Puffers überprüfen und die Größe der Daten anhand der Größe des Puffers testen. Nutzer von Worttrennprogrammen können nicht davon ausgehen, dass der an die IWordBreaker::BreakText-Methode übergebene Text wohlgeformt ist. Weitere Informationen zur Worttrennungs-Problembehandlung finden Sie unter „Problembehandlung für Sprachressourcen und bewährte Methoden“.
Implementieren eines Stemmers
Stemmers implementieren die IStemmer-Schnittstelle. Die IStemmer::GenerateWordForms-Methode generiert eine Liste von flektierten Wortformen für ein bestimmtes Eingabewort. Um eine Stemmerkomponente zu implementieren, müssen Sie über Sprachheuristiken der betreffenden Sprache verfügen. Dazu gehören Informationen zur Morphologie. Möglicherweise benötigen Sie auch eine Liste von Wörtern, die ausgeschlossen oder eingeschlossen werden sollen. Weitere Informationen zu sprachlichen Überlegungen und dazu, wie sich diese Überlegungen auf die Stemmerimplementierung auswirken, finden Sie unter Sprach- und Unicode-Überlegungen.
Es wird empfohlen, dass Stemmer nicht den Genitiv- oder Possessivfall für Wörter generieren. Beispielsweise wird "David" nicht als alternative Form für "David's" generiert. Der Wortbrecher generiert sowohl "David" als auch "David's", wenn er "David's" zerlegt.
Der Stemmer verwendet das IWordFormSink-Objekt, um eine Liste alternativer Wörter zu sammeln. IWordFormSink::PutWord generiert das letzte Wort aus dem Wortstamm. In allen Fällen ist dieses letzte Wort mit dem Eingabewort aus "IStemmer::GenerateWordForms" identisch. Beispielsweise generiert der Wortstamm aufgrund des Worts "schwimmen" die folgenden Wortformen: "schwimmend", "Schwimmer", "schwimmt", "schwamm" und "geschwommen" durch Aufrufe von IWordFormSink::PutAltWord. Der Stemmer generiert "schwimm" durch IWordFormSink::PutWord.
Skalierbarkeit, Leistungsfähigkeit und Sicherheit
Stemmers, wie Wortzerlegungen, müssen ein "freies" Threading-Modell verwenden und sich bei COM registrieren, wobei ihr Threading-Modell auf "frei" oder "beide" festgelegt ist. Windows Search ruft separate Instanzen des Stemmers gleichzeitig aus verschiedenen Threads auf. Stemmers sollten daher minimale Instanzdaten haben.
Die Stammstammgenauigkeit hat erhebliche Auswirkungen auf die Abfragerelevanz. Wenn der Stemmer den Text falsch verarbeitet, können Abfragen unvorhersehbare und ungenaue Ergebnisse liefern. Stemmers müssen Hunderte von Abfragen pro Sekunde verarbeiten, ohne die Abfrageleistung negativ zu beeinträchtigen. Die Leistung des Stemmers sollte sich mit erhöhter Hardwarekapazität verbessern. Informationen zur Problembehandlung von 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 richtig zu stapeln. Alle Zeichenfolgenkopien müssen explizite Überprüfungen aufweisen, um Pufferüberläufe zu schützen. Sie sollten immer die zugewiesene Größe des Puffers überprüfen und die Größe der Daten anhand der Größe des Puffers testen.
Zugehörige Themen