Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
A Microsoft fornece separadores de palavras e lematizadores para diversos idiomas. Este tópico descreve como implementar e usar separadores de palavras personalizados e lematizadores para idiomas e localidades além daquelas fornecidas pela Microsoft.
Observação
Separadores de palavras personalizados estavam temporariamente sem suporte. Em julho de 2018, foi feita uma alteração no Windows Server 2019 que impedia que as DLLs sem uma assinatura da Microsoft fossem carregadas por SearchIndexer.exe. Essa limitação foi levantada em janeiro de 2021.
Este tópico é organizado da seguinte maneira:
- Registrando uma DLL de recurso de idioma
- Registrando um idioma
- Implementando um "Word Beaker"
- Implementando um Stemmer
- tópicos relacionados
Registrando uma DLL de recurso de idioma
Cada DLL de recurso de idioma deve implementar e exportar os seguintes pontos de entrada. A DLL pode ser registrada para estar em qualquer pasta.
- DllMain é o ponto de entrada padrão para DLL.
- DllRegisterServer registra a DLL no registro, como
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll - O DllCanUnloadNow permite que os clientes chamem esse ponto de entrada por meio do COM (Component Object Model) para determinar se é possível descarregar a DLL do recurso de idioma.
- DllUnRegisterServer remove a DLL do registro.
Registrando um idioma
O registro contém entradas específicas de idioma para o idioma que está sendo indexado e essas entradas controlam as partes dos processos de indexação e consulta específicos da linguagem. Essas entradas do Registro podem ser encontradas na seguinte chave do Registro.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Implementando um separador de palavras do Word
Os separadores de palavras implementam o IWordBreaker. O método IWordBreaker::BreakText executa todo o processamento e análise de texto. Para implementar um componente de separação de palavras, você deve ter heurística de linguagem para seu idioma. Isso inclui informações sobre sintaxe e morfologia. Você também pode precisar de uma lista de palavras para excluir ou incluir. Você cria o arquivo de palavras de ruído para sua localidade de idioma a partir da lista de palavras excluídas. Para obter mais informações sobre considerações linguísticas e como essas considerações afetam implementações de separação de palavras, consulte Considerações linguísticas e Unicode.
A principal finalidade do IWordBreaker::BreakText é processar o texto continuamente do TEXT_SOURCE até que todo o texto seja processado ou até que o separador de palavras encontre um erro. Nesse loop de processamento de dados, IWordBreaker::BreakText chama métodos de análise e utilitário que executam tarefas específicas para esse processo. Por exemplo, o separador de palavras alemão pode lidar com palavras compostas, enquanto o separador de palavras francês pode processar diacríticos ou clitics. As funções específicas que o separador de palavras executa e a estratégia que ele usa na execução dessas tarefas dependem inteiramente dos requisitos para esse idioma.
Ao interromper o texto, os separadores de palavras identificam formulários "alternativos" para palavras que podem ter várias representações. Nenhuma relação semântica está implícita entre as palavras geradas. Na verdade, a palavra original pode não ser incluída entre a lista de alternativas. Os formulários alternativos são salvos na mesma posição no índice que a palavra original para indicar que eles são idênticos.
Quando um documento é incluído no índice, cada palavra recebe um valor inteiro que representa o deslocamento ou a distância da palavra desde o início de um documento. A distância relativa entre palavras em uma consulta é comparada aos offsets armazenados no índice de texto completo. A consulta "Onde está o documento de Kyle" corresponde a qualquer documento com "Where" no deslocamento n, "is" em n+1, "Kyle's" em n+2 e "document" em n+3. "Onde está o documento de Kyle arquivado na base de dados?" é representado como:
| Where | está | Kyle Kyle's |
documento | registrado | mergulhar | o | banco de dados |
Neste exemplo, o separador de palavras armazena formas alternativas para "Kyle" ("do Kyle") e "banco de dados" ("data base") no índice. O separador de palavras gera e armazena palavras alternativas durante o processo de criação de índice nas seguintes condições:
- Se for provável que uma palavra alternativa apareça como uma única palavra em uma consulta
- Se um stemmer não for capaz de derivar a palavra original a partir da alternativa
A geração de formulários de palavras alternativas aumenta o número de maneiras que as consultas representam e correspondem a uma frase, conforme mostrado nas seguintes variações:
- Onde está o documento de Kyle arquivado no banco de dados
- Onde está o documento de Kyle arquivado no banco de dados
- Onde está o documento de Kyle arquivado na base de dados
- Onde está o documento de Kyle arquivado na base de dados
WordSink e PhraseSink
Os separadores de palavras usam os objetos IWordSink e IPhraseSink para coletar e armazenar todas as palavras e frases que extraem do texto. Um separador de palavras armazena palavras na forma mais próxima possível da forma original da palavra no documento. O IPhraseSink armazena frases no momento da consulta. As frases melhoram a relevância dos resultados da consulta porque sequências mais longas de palavras são mais raras e fornecem maior distinção do que frases menores. Quando o indexador coloca uma frase no IPhraseSink em tempo de consulta, ele cria uma instância do separador de palavras para dividir a frase em palavras. Em seguida, o indexador avalia a frase verificando se as palavras na frase ocorrem adjacentes umas às outras no índice. Por exemplo, se "ABCD" ocorrer no índice nas posições x, x+1, x+2 e x+3, a correspondência de frase ocorrerá se qualquer subcadeia de caracteres adjacente de "ABCD" for enviada em uma consulta. Essa estratégia é eficaz para separadores de palavras baseados em caracteres que dividem frases e palavras longas durante a criação do índice e que geram frases durante o tempo de consulta.
Quebra
Quebras são os espaços entre palavras. Espaço em branco, pontuação, formatação ou apenas a natureza da linguagem em si pode causar quebras. Há quatro tipos diferentes de quebras que o indexador usa: fim da palavra (EOW), fim da frase (EOS), fim do parágrafo (EOP) e fim do capítulo (EOC). A quebra de EOW é a quebra padrão. Após cada token, cada quebra indica uma distância de significado diferente entre as palavras de cada lado. As palavras separadas pelo EOW têm o vínculo semântico mais apertado, seguido por EOS, EOP e EOC. Várias chamadas para IWordSink::PutBreak são cumulativas e são análogas à inserção de palavras ou frases ausentes.
Escalabilidade, desempenho e segurança
A maneira como o separador de palavras responde a chamadas simultâneas é determinada em grande parte pela sua escolha de modelo de encadeamento. O indexador é um aplicativo monothread. Para que os separadores de palavras funcionem em um ambiente de thread único, os separadores de palavras devem ser escritos usando um modelo de threading "gratuito" ou "ambos". Os divisores de palavras não devem se registrar no COM usando o modelo de threading "apartment".
Recomendamos que os separadores de palavras evitem estados globais e armazenem dados na instância do separador de palavras. O único conteúdo que deve ser armazenado na implementação do separador de palavras é para os parâmetros fQuery e ulMaxTokenSize. Os separadores de palavras não devem ser mais do que duas vezes mais lentos do que o parâmetro de comparação estabelecido pelo separador de palavras em inglês. O desempenho do separador de palavras também deve melhorar com o aumento da capacidade de hardware.
Separadores de palavras para a execução do indexador no contexto de segurança do Sistema Local. Eles devem ser elaborados para gerenciar buffers e empilhar corretamente. Todas as cópias de cadeia de caracteres devem ter verificações explícitas para proteger contra sobrecargas de buffer. Você sempre deve verificar o tamanho alocado do buffer e testar o tamanho dos dados em relação ao tamanho do buffer. Os separadores de palavras não podem assumir que o texto passado para o método IWordBreaker::BreakText está bem formado. Para obter mais informações sobre como solucionar problemas de separadores de palavras, consulte Solução de problemas de recursos de linguagem e práticas recomendadas.
Implementando um stemmer
Os stemmers implementam a interface IStemmer. O método IStemmer::GenerateWordForms gera uma lista de formulários de palavras inflexionados para uma palavra de entrada específica. Para implementar um componente de stemmer, você deve ter heurísticas de idioma para seu idioma. Isso inclui informações sobre a morfologia. Você também pode precisar de uma lista de palavras para excluir ou incluir. Para obter mais informações sobre questões linguísticas e como essas considerações afetam as implementações de stemmers, consulte Considerações Linguísticas e Unicode.
Recomendamos que os stemizadores não gerem o caso genitivo ou possessivo para palavras. Por exemplo, "David" não é gerado como uma forma alternativa para "David's." A ferramenta de separação de palavras gera tanto "David" quanto "David's" quando analisa "David's."
O lematizador usa o objeto IWordFormSink para reunir a lista de palavras alternativas. IWordFormSink::PutWord gera a palavra final do stemmer. Em todos os casos, essa palavra final é a mesma da palavra de entrada de IStemmer::GenerateWordForms. Por exemplo, dada a palavra "nadar", o stemizador gera as seguintes formas de palavra: "natação", "nadador", "nado", "nadou" e "nado", através de chamadas para IWordFormSink::PutAltWord. O lematizador gera "natação" por meio de IWordFormSink::P utWord.
Escalabilidade, desempenho e segurança
Os lematizadores, como separadores de palavras, devem usar um modelo de threading "gratuito" e registrar-se com COM com seu modelo de threading definido como "gratuito" ou "ambos". A Pesquisa do Windows chama instâncias separadas do lematizador de threads diferentes ao mesmo tempo. Portanto, os lematizadores devem ter dados mínimos de instância.
A precisão do lematizador tem um impacto significativo na relevância da consulta. Se o lematizador conter o texto incorretamente, as consultas poderão retornar resultados imprevisíveis e imprecisos. Os stemizadores devem lidar com centenas de consultas por segundo sem afetar negativamente o desempenho das consultas. O desempenho do lematizador deve melhorar com o aumento da capacidade de hardware. Para obter informações sobre solução de problemas de lematizadores, consulte Solução de problemas de recursos de linguagem e práticas recomendadas.
Os verbetizadores para Pesquisa do Windows são executados no contexto de Segurança Local. Eles devem ser elaborados para gerenciar buffers e empilhar corretamente. Todas as cópias de cadeia de caracteres devem ter verificações explícitas para proteger contra sobrecargas de buffer. Você sempre deve verificar o tamanho alocado do buffer e testar o tamanho dos dados em relação ao tamanho do buffer.
Tópicos relacionados