Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Firma Microsoft udostępnia analizatory wyrazów i stemmery dla wielu języków. W tym temacie opisano, jak zaimplementować i używać niestandardowych dzielników wyrazów oraz stemmerów dla języków i ustawień regionalnych spoza tych udostępnianych przez firmę Microsoft.
Notatka
Niestandardowe moduły podziału wyrazów były tymczasowo nieobsługiwane. W lipcu 2018 r. wprowadzono zmiany w systemie Windows Server 2019, które uniemożliwiły ładowanie bibliotek DLL bez podpisu firmy Microsoft przez SearchIndexer.exe. To ograniczenie zostało zniesione w styczniu 2021 r.
Ten temat jest zorganizowany w następujący sposób:
- Rejestrowanie biblioteki DLL zasobów języka
- Rejestrowanie języka
- Implementacja programu Word Beaker
- Implementowanie stemmera
- Tematy pokrewne
Rejestrowanie biblioteki DLL zasobu języka
Każda zasobowa biblioteka DLL języka musi implementować i eksportować następujące punkty wejścia. Bibliotekę DLL można zarejestrować w dowolnym folderze.
- DllMain to standardowy punkt wejścia do biblioteki DLL.
- DllRegisterServer rejestruje bibliotekę DLL w rejestrze, taką jak
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll - Biblioteka DllCanUnloadNow umożliwia klientom wywoływanie tego punktu wejścia za pośrednictwem modelu obiektów składników (COM) w celu określenia, czy można zwolnić bibliotekę DLL zasobu języka.
- DllUnRegisterServer usuwa bibliotekę DLL z rejestru.
Rejestrowanie języka
Rejestr zawiera wpisy specyficzne dla języka dla indeksowanego języka, a wpisy te kontrolują części procesów indeksowania i zapytań specyficznych dla języka. Te wpisy rejestru można znaleźć w następującym kluczu rejestru.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Implementowanie wyodrębniacza w programie Word
Łamacze słów implementują IWordBreaker. Metoda IWordBreaker::BreakText wykonuje wszystkie operacje przetwarzania i analizowania tekstu. Aby zaimplementować składnik wyłącznika wyrazów, musisz mieć heurystyki językowe dla danego języka. Obejmuje to informacje o składni i morfologii. Może być również potrzebna lista wyrazów do wykluczenia lub uwzględnienia. Tworzysz plik wyrazów szumu dla lokalizacji językowej na podstawie listy wykluczonych wyrazów. Aby uzyskać więcej informacji na temat zagadnień językowych i sposobu, w jaki te zagadnienia wpływają na narzędzia dzielenia wyrazów, zobacz Lingwistyka i Zagadnienia dotyczące Unicode.
Głównym celem IWordBreaker::BreakText jest przetwarzanie tekstu w sposób ciągły z TEXT_SOURCE do momentu przetworzenia całego tekstu lub do momentu, gdy wyłącznik wyrazów napotka błąd. W tej pętli przetwarzania danych IWordBreaker::BreakText wywołuje metody analizujące i pomocnicze, które wykonują określone zadania w tym procesie. Na przykład niemiecki wyłącznik wyrazów może obsługiwać wyrazy złożone, podczas gdy francuski wyłącznik wyrazów może przetwarzać znaki diakrytyczne lub clitics. Określone funkcje wykonywane przez moduł dzielenia wyrazów i strategia używana w wykonywaniu tych zadań zależą całkowicie od wymagań tego języka.
Podczas dzielenia tekstu, narzędzia dzielące tekst identyfikują "alternatywne" formy wyrazów, które mogą mieć wiele reprezentacji. Między wygenerowanymi wyrazami nie jest implikowana żadna relacja semantyczna. W rzeczywistości oryginalne słowo może nie być uwzględnione na liście alternatyw. Alternatywne formularze są zapisywane w tym samym położeniu w indeksie co oryginalne słowo, aby wskazać, że są identyczne.
Gdy dokument jest uwzględniony w indeksie, każde słowo ma przypisaną wartość całkowitą reprezentującą przesunięcie lub odległość słowa od początku dokumentu. Względna odległość między wyrazami w zapytaniu jest porównywana z przesunięciami przechowywanymi w indeksie pełnotekstowym. Zapytanie "Gdzie jest dokument Kyle'a" pasuje do dowolnego dokumentu, w którym "Gdzie" znajduje się na przesunięciu n, "jest" na n+1, "Kyle'a" na n+2, a "dokument" na n+3. "Gdzie znajduje się dokument Kyle'a złożony w bazie danych?" jest reprezentowany jako:
| Gdzie | jest | Kyle Kyle's |
dokument | Złożono | w | ten | baza danych baza danych |
W tym przykładzie, narzędzie dzielnika wyrazów przechowuje alternatywne formy dla "Kyle" ("Kyle's") i "database" ("baza danych") w indeksie. Łamacz słów generuje i przechowuje wyrazy alternatywne podczas procesu tworzenia indeksu w następujących warunkach:
- Jeśli alternatywny wyraz może pojawić się jako pojedyncze słowo w zapytaniu
- Jeśli jest mało prawdopodobne, że stemmer wywodzi oryginalne słowo z alternatywy
Generowanie alternatywnych formularzy wyrazów zwiększa liczbę sposobów reprezentowania i dopasowania zapytania do zdania, jak pokazano w następujących odmianach:
- Gdzie znajduje się dokument Kyle złożony w bazie danych
- Gdzie znajduje się dokument Kyle'a złożony w bazie danych
- Gdzie znajduje się dokument Kyle złożony w bazie danych
- Gdzie znajduje się dokument Kyle'a złożony w bazie danych
WordSink i PhraseSink
Moduły łamiące wyrazy używają IWordSink i IPhraseSink do zbierania i przechowywania wszystkich wyrazów i fraz wyodrębnianych z tekstu. Analizator morfologiczny przechowuje wyrazy w formie, która jest możliwie najbliższa oryginalnej formie wyrazu w dokumencie. IPhraseSink przechowuje frazy w czasie zapytania. Frazy zwiększają istotność wyników zapytania, ponieważ dłuższe sekwencje wyrazów są rzadsze i zapewniają większe rozróżnienie niż mniejsze frazy. Gdy indeksator umieszcza frazę w IPhraseSink w czasie zapytania, tworzy instancję łamacza słów, aby podzielić frazę na wyrazy. Indeksator następnie oblicza frazę, sprawdzając, czy wyrazy w frazie występują sąsiadująco ze sobą w indeksie. Jeśli na przykład "ABCD" występuje w indeksie na pozycjach x, x+1, x+2, a x+3, dopasowanie frazy nastąpi, jeśli w zapytaniu zostanie zawarty dowolny sąsiadujący podciąg "ABCD". Ta strategia jest skuteczna w przypadku podziałów wyrazów opartych na znakach, które dzielą frazy i długie wyrazy podczas tworzenia indeksu i generują frazy w czasie zapytania.
Przerwy
Przerwy to spacje między wyrazami. Biały znak, interpunkcja, formatowanie lub tylko charakter samego języka może powodować przerwy. Istnieją cztery różne typy podziałów, których indeksator używa: koniec słowa (EOW), koniec zdania (EOS), koniec akapitu (EOP) i koniec rozdziału (EOC). Przerwa EOW jest domyślną przerwą. Po każdym tokenie każda przerwa wskazuje inną odległość semantyczną między wyrazami po obu stronach. Wyrazy oddzielone EOW mają najściśniejsze powiązanie semantyczne, a następnie EOS, EOP i EOC. Wiele wywołań IWordSink::PutBreak jest skumulowane i jest analogiczne do wstawiania pustych wyrazów lub zdań.
Skalowalność, trwałość i zabezpieczenia
Sposób, w jaki narzędzie do łamania słów reaguje na jednoczesne wywołania, w dużej mierze zależy od wybranego modelu wątkowania. Indeksator jest aplikacją jednowątkową. Aby podziały wyrazów działały w środowisku jednowątkowym, wyłączniki wyrazów muszą być zapisywane przy użyciu modelu wątkowego "wolny" lub "oba". Łamacze wyrazów nie mogą rejestrować się w COM korzystając z modelu wątkowego "apartment".
Zalecamy, aby moduły dzielenia wyrazów unikały stanów globalnych i przechowywały dane w wystąpieniu modułu dzielenia wyrazów. Jedyną zawartością, jaka powinna być przechowywana w implementacji podziału wyrazów, są parametry fQuery oraz ulMaxTokenSize. Segmentatory słów nie powinny być więcej niż dwa razy wolniejsze niż punkt odniesienia ustanowiony przez angielski segmentator słów. Wydajność wyłącznika programu Word powinna również poprawić się dzięki zwiększonej możliwości sprzętowej.
Moduły podziału wyrazów dla indeksatora są uruchamiane w kontekście zabezpieczeń systemu lokalnego. Powinny być pisane tak, aby zarządzać buforami i prawidłowo obsługiwać stos. Wszystkie kopie ciągów muszą mieć jawne kontrole, aby chronić przed przekroczeniami buforu. Zawsze należy sprawdzić przydzielony rozmiar buforu i przetestować rozmiar danych względem rozmiaru buforu. Podziały wyrazów nie powinny zakładać, że tekst przekazany do metody IWordBreaker::BreakText jest poprawnie uformowany. Aby uzyskać więcej informacji na temat rozwiązywania problemów z elementami dzielenia wyrazów, zobacz Rozwiązywanie problemów z zasobami językowymi i najlepszymi rozwiązaniami.
Implementowanie stemmera
Stemmers implementują interfejs IStemmer. Metoda IStemmer::GenerateWordForms generuje listę odmienionych form wyrazów dla danego słowa wejściowego. Aby zaimplementować składnik stemmer, musisz mieć heurystyki językowe dla języka. Obejmuje to informacje o morfologii. Może być również potrzebna lista wyrazów do wykluczenia lub uwzględnienia. Aby uzyskać więcej informacji na temat zagadnień językowych i sposobu, w jaki te zagadnienia wpływają na implementacje stemmerów, zobacz Lingwistyka i Zagadnienia Unicode.
Zalecamy, aby stemmery nie generowały dopełniacza ani przypadku dzierżawczego dla słów. Na przykład "David" nie jest generowany jako forma alternatywna dla "Davida". Analizator składniowy generuje zarówno "David", jak i "Davida", gdy analizuje "Davida".
Stemmer używa obiektu IWordFormSink, aby zebrać listę słów alternatywnych. IWordFormSink::PutWord generuje ostatnie słowo z generatora form podstawowych. We wszystkich przypadkach to ostatnie słowo jest takie samo jak słowo wejściowe z IStemmer::GenerateWordForms. Na przykład, biorąc pod uwagę słowo "pływać", stemmer generuje następujące formy wyrazów: "pływanie", "pływak", "pływa", "płynął" i "popłynął", przez wywołania do IWordFormSink::PutAltWord. Stemmer generuje "pływać" przez IWordFormSink::PutWord.
Skalowalność, trwałość i zabezpieczenia
Stemmer, podobnie jak łamacze słów, musi używać "wolnego" modelu wątkowego i zarejestrować się w COM z modelem wątkowania ustawionym na "wolny" lub "oba". Usługa Windows Search wywołuje osobne instancje stemmera z różnych wątków w tym samym czasie. W związku z tym stemmery powinny mieć minimalne dane wystąpienia.
Dokładność algorytmów stemmowania ma znaczący wpływ na trafność zapytań. Jeśli stemmer przetworzy tekst niepoprawnie, zapytania mogą zwracać nieprzewidywalne i niedokładne wyniki. Algorytmy stemmingu muszą obsługiwać setki zapytań na sekundę bez negatywnego wpływu na wydajność. Wydajność stemmera powinna poprawić się dzięki zwiększonym możliwościom sprzętowym. Aby uzyskać informacje na temat rozwiązywania problemów z stemmerami, zobacz Rozwiązywanie problemów z zasobami językowymi i najlepszymi rozwiązaniami.
Moduły stemmingowe dla usługi Windows Search działają w lokalnym kontekście zabezpieczeń. Powinny być pisane tak, aby zarządzać buforami i prawidłowo obsługiwać stos. Wszystkie kopie ciągów muszą mieć jawne kontrole, aby chronić przed przekroczeniami buforu. Zawsze należy sprawdzić przydzielony rozmiar buforu i przetestować rozmiar danych względem rozmiaru buforu.
Tematy pokrewne