Partilhar via


Solução de problemas de recursos de linguagem e práticas recomendadas

Este tópico fornece práticas recomendadas e sugestões para validar e solucionar problemas de implementações do IWordBreaker e do IStemmer .

Este tópico é organizado da seguinte maneira:

Práticas Recomendadas

  • Verifique se o modelo de threading para recursos de linguagem está definido como "ambos" no Registro.
  • Sempre que possível, coloque dados de linguagem em um recurso em sua DLL em vez de em um arquivo separado. Isso torna a DLL mais fácil de instalar e mais segura. Além disso, colocar dados de linguagem em um recurso resultará em um desempenho aprimorado para esse componente de recurso de linguagem.
  • Minimize os recursos do sistema que os componentes de recurso de linguagem usam. Por exemplo, se cada instância de um objeto de recurso de linguagem precisar de acesso somente leitura a um léxico, considere compartilhar o léxico em todas as instâncias.
  • Considere usar o separador de palavras neutro para manipular o texto que não está no idioma ou localidade para a implementação do separador de palavras. Isso ajudará a garantir que o texto seja processado consistentemente em todos os idiomas.
  • Verifique todos os códigos de retorno e retorne-os de funções como IStemmer::GenerateWordForms e IWordBreaker::BreakText. Se a indexação falhar, é importante passar o erro para que o usuário seja notificado sobre quais documentos foram indexados.

Testando a consistência do lematizador

Recomendamos que você monitore o desempenho de uma implementação do IStemmer para consistência nas seguintes condições:

  • O lematizador é executado consistentemente em várias chamadas para IStemmer::Init. O lematizador reinicializa com os mesmos parâmetros que na inicialização anterior, sem liberar os parâmetros.
  • Considerando o mesmo corpus de teste e repetições da mesma consulta, IStemmer::GenerateWordForms produz a saída idêntica e faz chamadas idênticas aos métodos do objeto IWordFormSink .

Teste de entrada inválida no lematizador

Recomendamos que você monitore como os métodos IStemmer lidam com todos os erros relacionados a parâmetros inválidos. Além disso, recomendamos que você garanta que os métodos de lematizador não gerem exceções sem tratamento. O lematizador deve lidar com os seguintes erros:

  • Chame para IStemmer::Init com pfLicense definido como NULL. A inicialização falha e não resulta em uma violação de acesso.
  • Chame para IStemmer::GetLicenseToUse com o parâmetro ppwcsLicense definido como NULL. IStemmer::GetLicenseToUse não resulta em uma violação de acesso.
  • Chame para IStemmer::GenerateWordForms com o parâmetro pwcInBuf definido como NULL. IStemmer::GenerateWordForms falha (retorna E_FAIL) e não resulta em uma violação de acesso.
  • Chame para IStemmer::GenerateWordForms com o parâmetro cwc igual a 0. IStemmer::GenerateWordForms retorna com êxito (retorna S_OK) e não resulta em uma violação de acesso.
  • Chame para IStemmer::GenerateWordForms com o parâmetro pwcInBuf definido como NULL e o parâmetro cwc igual a 0. IStemmer::GenerateWordForms falha (retorna E_FAIL) e não resulta em uma violação de acesso.

Testando a consistência do separador de Word

Recomendamos que você garanta que a implementação do IWordBreaker seja executada de forma consistente nas seguintes condições:

  • Word disjuntor é executado consistentemente em várias chamadas para seu método IWordBreaker::Init. O separador de palavras reinicializa com os mesmos parâmetros que na inicialização anterior, sem liberar os parâmetros.
  • Considerando o mesmo corpus de teste e repetições da mesma consulta, o método IWordBreaker::BreakText produz a saída idêntica e faz chamadas idênticas aos métodos dos objetos IWordSink e IPhraseSink .

Teste de entrada inválida no separador de Word

Recomendamos que você verifique se os métodos IWordBreaker lidam com todos os erros relacionados a parâmetros inválidos. Além disso, recomendamos que você garanta que os métodos de separador de palavras não gerem exceções sem tratamento. O separador de palavras deve executar as seguintes funções e tratar os seguintes erros:

  • A chamada para IWordBreaker::Init deve retornar LANGUAGE_E_DATABASE_NOT_FOUND ou S_OK.
  • Chamar para IWordBreaker::Init inicializa com êxito o parâmetro pfLicense para FALSE e chama IStemmer::GetLicenseToUse e não resulta em uma violação de acesso.
  • Word disjuntor não lê além do final do parâmetro awcBuffer no método IWordBreaker::BreakText.
  • Chame para IWordBreaker::BreakText com o pwcInBuf definido como NULL. IWordBreaker::BreakText falha (retorna E_FAIL) e não resulta em uma violação de acesso.
  • Chame para IWordBreaker::BreakText com o parâmetro cwc igual a 0. IWordBreaker::BreakText retorna com êxito (retorna S_OK) e não resulta em uma violação de acesso.
  • Chame para o método IWordBreaker::BreakText com o parâmetro pwcInBuf definido como NULL e o parâmetro cwc igual a 0. IWordBreaker::BreakText falha (retorna E_FAIL) e não resulta em uma violação de acesso.
  • As frases geradas durante a criação do índice contêm o mesmo número de palavras.
  • As frases são geradas durante a criação do índice por meio de chamadas sucessivas para os métodos IWordFormSink::P utWord e IWordFormSink::P utAltWord . O separador de palavras usa apenas o objeto IPhraseSink durante o tempo de consulta.

Estendendo recursos de linguagem

Noções básicas sobre componentes de recursos de linguagem

Implementando um separador de Word e lematizador

Considerações linguísticas e Unicode