Rozwiązywanie problemów z zasobami językowymi i najlepszymi rozwiązaniami

Ten temat zawiera najlepsze praktyki i sugestie dotyczące sprawdzania poprawności oraz rozwiązywania problemów związanych z implementacjami IWordBreaker i IStemmer.

Ten temat jest zorganizowany w następujący sposób:

Najlepsze rozwiązania

  • Upewnij się, że model wątków dla zasobów językowych jest ustawiony na wartość "oba" w rejestrze.
  • Jeśli to możliwe, umieść dane językowe w zasobie w pliku DLL, a nie w osobnym pliku. Dzięki temu biblioteka DLL jest łatwiejsza do zainstalowania i bezpieczniejsza. Ponadto umieszczenie danych językowych w zasobie spowoduje zwiększenie wydajności tego składnika zasobów języka.
  • Zminimalizuj zasoby systemowe używane przez składniki zasobów językowych. Jeśli na przykład każde wystąpienie obiektu zasobu języka wymaga dostępu tylko do odczytu do leksykonu, rozważ udostępnienie leksykonu we wszystkich wystąpieniach.
  • Rozważ użycie neutralnego wyłącznika wyrazów do obsługi tekstu, który nie znajduje się w języku lub ustawieniach regionalnych dla implementacji wyłącznika wyrazów. Pomoże to zapewnić spójne przetwarzanie tekstu we wszystkich językach.
  • Sprawdź wszystkie kody powrotne i zwróć je z funkcji, takich jak IStemmer::GenerateWordForms i IWordBreaker::BreakText. Jeśli indeksowanie nie powiedzie się, ważne jest przekazanie błędu, aby użytkownik był powiadamiany o indeksowanych dokumentach.

Testowanie spójności stemmerów

Zalecamy monitorowanie wydajności implementacji IStemmer pod kątem spójności w następujących warunkach:

  • Stemmer działa konsekwentnie przy wielokrotnych wywołaniach do IStemmer::Init. Stemmer ponownie inicjalizuje się z tymi samymi parametrami, co w poprzedniej inicjalizacji, bez resetowania parametrów.
  • Biorąc pod uwagę ten sam korpus testowy i powtórzenia tego samego zapytania, IStemmer::GenerateWordForms generuje identyczne dane wyjściowe i wykonuje identyczne wywołania metod IWordFormSink obiektu.

Testowanie nieprawidłowych danych wejściowych w narzędziu stemmer

Zalecamy monitorowanie sposobu, w jaki metody IStemmer obsługują wszystkie błędy związane z nieprawidłowymi parametrami. Ponadto zalecamy upewnienie się, że metody stemmera nie zgłaszają nieobsługiwanych wyjątków. Stemmer powinien obsługiwać następujące błędy:

  • Wywołaj metodę IStemmer::Init z pfLicense ustawioną na null. Inicjowanie kończy się niepowodzeniem i nie powoduje naruszenia dostępu.
  • Wywołaj metodę IStemmer::GetLicenseToUse za pomocą parametru ppwcsLicense ustawionego na wartość NULL. IStemmer::GetLicenseToUse nie powoduje naruszenia dostępu.
  • Wywołaj metodę IStemmer::GenerateWordForms przy użyciu parametru pwcInBuf ustawionego na NULL. IStemmer::GenerateWordForms kończy się niepowodzeniem (zwraca E_FAIL) i nie powoduje naruszenia dostępu.
  • Wywołaj metodę IStemmer::GenerateWordForms z parametrem cwc równym 0. IStemmer::GenerateWordForms zwraca pomyślne (zwraca S_OK) i nie powoduje naruszenia dostępu.
  • Wywołaj metodę IStemmer::GenerateWordForms przy użyciu parametru pwcInBuf ustawionego na wartość NULL oraz parametru cwc równego 0. IStemmer::GenerateWordForms kończy się niepowodzeniem (zwraca E_FAIL) i nie powoduje naruszenia dostępu.

Testowanie spójności łamacza tekstu

Zalecamy upewnienie się, że implementacja IWordBreaker działa spójnie w następujących warunkach:

  • Wyłącznik wyrazów działa spójnie przy wielu wywołaniach metody IWordBreaker::Init. Wyraz breaker ponownie inicjuje z tymi samymi parametrami co w poprzedniej inicjalizacji, bez zwalniania parametrów.
  • Biorąc pod uwagę te same korpusy testowe i powtórzenia tego samego zapytania, metoda IWordBreaker::BreakText generuje identyczne dane wyjściowe i wykonuje identyczne wywołania metod IWordSink i obiektów IPhraseSink.

Testowanie nieprawidłowych danych wejściowych w wyłączniku programu Word

Zalecamy upewnienie się, że metody IWordBreaker obsługują wszystkie błędy związane z nieprawidłowymi parametrami. Ponadto zalecamy upewnienie się, że metody dzielenia wyrazów nie zgłaszają nieobsługiwanych wyjątków. Moduł dzielenia wyrazów powinien wykonywać następujące funkcje i obsługiwać następujące błędy:

  • Wywołanie metody IWordBreaker::Init musi zwrócić wartość LANGUAGE_E_DATABASE_NOT_FOUND lub S_OK.
  • Wywołanie metody IWordBreaker::Init pomyślnie inicjuje parametr pfLicense na wartość FALSE oraz wywołuje IStemmer::GetLicenseToUse i nie powoduje naruszenia dostępu.
  • Dzielnik słów nie odczytuje dalej niż do końca parametru awcBuffer w metodzie IWordBreaker::BreakText.
  • Wywołaj metodę IWordBreaker::BreakText z pwcInBuf ustawioną na NULL. IWordBreaker::BreakText kończy się niepowodzeniem (zwraca E_FAIL) i nie powoduje naruszenia dostępu.
  • Wywołaj metodę IWordBreaker::BreakText z parametrem cwc równym 0. IWordBreaker::BreakText zwraca pomyślnie (zwraca S_OK) i nie powoduje naruszenia dostępu.
  • Wywołaj metodę IWordBreaker::BreakText z parametrem pwcInBuf ustawionym na null i parametr cwc równy 0. IWordBreaker::BreakText kończy się niepowodzeniem (zwraca E_FAIL) i nie powoduje naruszenia dostępu.
  • Frazy generowane podczas tworzenia indeksu zawierają taką samą liczbę wyrazów.
  • Frazy są generowane podczas tworzenia indeksu za pomocą kolejnych wywołań metod IWordFormSink::PutWord i IWordFormSink::PutAltWord. Wyraz breaker używa tylko obiektu IPhraseSink w czasie zapytania.

rozszerzanie zasobów językowych

Zrozumienie komponentów zasobów językowych

Wdrożenie narzędzi Word Breaker i analizatora morfologicznego (stemmer)

zagadnienia dotyczące lingwistyki i unicode