Implementación de un separador de Word y lematizador
Microsoft proporciona separadores de palabras y lematizadores para varios idiomas. En este tema se describe cómo implementar y usar separadores de palabras y lematizadores personalizados para idiomas y configuraciones regionales más allá de los proporcionados por Microsoft.
Nota
Los separadores de palabras personalizados no se admitían temporalmente. En julio de 2018, se realizó un cambio en Windows Server 2019 que impedía que los archivos DLL sin una firma de Microsoft se cargaran mediante SearchIndexer.exe. Esta limitación se levantó en enero de 2021.
Este tema se organiza de la siguiente manera:
- Registro de un archivo DLL de recursos de lenguaje
- Registro de un idioma
- Implementación de un Word Beaker
- Implementación de un lematizador
- Temas relacionados
Registro de un archivo DLL de recursos de lenguaje
Cada DLL de recursos de lenguaje debe implementar y exportar los siguientes puntos de entrada. El archivo DLL se puede registrar para que esté en cualquier carpeta.
- DllMain es el punto de entrada estándar a DLL.
- DllRegisterServer registra el archivo DLL en el registro, como
regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
- DllCanUnloadNow permite a los clientes llamar a este punto de entrada a través del Modelo de objetos componentes (COM) para determinar si es posible descargar el archivo DLL del recurso de idioma.
- DllUnRegisterServer quita el archivo DLL del registro.
Registro de un idioma
El Registro contiene entradas específicas del idioma para el idioma que se está indizando y estas entradas controlan las partes de los procesos de indexación y consulta específicos del lenguaje. Estas entradas del Registro se pueden encontrar en la siguiente clave del Registro.
HKEY_LOCAL_MACHINE
SYSTEM
CurrentControlSet
ContentIndex
Control
Language
Implementación de un Word Beaker
Word separadores implementaN IWordBreaker. El método IWordBreaker::BreakText realiza todo el procesamiento y el análisis de texto. Para implementar un componente de separador de palabras, debe tener heurística de idioma para el idioma. Esto incluye información sobre la sintaxis y la morfología. También puede que necesite una lista de palabras para excluir o incluir. Cree el archivo de palabras irrelevantes para la configuración regional del idioma a partir de la lista de palabras excluidas. Para obtener más información sobre las consideraciones lingüísticas y cómo estas consideraciones afectan a las implementaciones del separador de palabras, vea Consideraciones lingüísticas y Unicode.
El propósito principal de IWordBreaker::BreakText es procesar el texto continuamente desde el TEXT_SOURCE hasta que se procese todo el texto, o hasta que el separador de palabras encuentre un error. Mientras se encuentra en este bucle de procesamiento de datos, IWordBreaker::BreakText llama a los métodos de análisis y utilidad que realizan tareas específicas para ese proceso. Por ejemplo, el separador de palabras alemanas puede controlar palabras compuestas, mientras que el separador de palabras francesas puede procesar diacríticos o cliticos. Las funciones específicas que realiza el separador de palabras y la estrategia que usa para realizar estas tareas dependen completamente de los requisitos de ese lenguaje.
Al romper texto, los separadores de palabras identifican formularios "alternativos" para las palabras que pueden tener varias representaciones. No hay ninguna relación semántica implícita entre las palabras generadas. De hecho, es posible que la palabra original no se incluya entre la lista de alternativas. Los formularios alternativos se guardan en la misma posición del índice que la palabra original para indicar que son idénticos.
Cuando se incluye un documento en el índice, a cada palabra se le asigna un valor entero que representa el desplazamiento o la distancia de la palabra desde el principio de un documento. La distancia relativa entre palabras de una consulta se compara con los desplazamientos almacenados en el índice de texto completo. La consulta "Where is Kyle's document" coincide con cualquier documento con "Where" at offset n, "is" at n+1, "Kyle's" at n+2 y "document" at n+3. "¿Dónde está archivado el documento de Kyle en la base de datos?" se representa como:
Where | is | Kyle Kyle's |
documento | Presentado | in | el | base de datos de base de datos |
En este ejemplo, el separador de palabras almacena formularios alternativos para "Kyle" ("Kyle's") y "database" ("base de datos") en el índice. El separador de palabras genera y almacena palabras alternativas durante el proceso de creación del índice en las siguientes condiciones:
- Si es probable que una palabra alternativa aparezca como una sola palabra en una consulta
- Si no es probable que un lematizador derive la palabra original de la alternativa
La generación de formularios de palabras alternativos aumenta el número de formas en que las consultas representan y coinciden con una oración, como se muestra en las siguientes variaciones:
- Dónde está el documento kyle archivado en la base de datos
- Dónde está el documento de Kyle archivado en la base de datos
- Dónde está el documento kyle archivado en la base de datos
- Dónde está el documento de Kyle archivado en la base de datos
WordSink y PhraseSink
Word separadores usan los objetos IWordSink e IPhraseSink para recopilar y almacenar todas las palabras y frases que extraen del texto. Un separador de palabras almacena palabras en un formulario lo más cerca posible del formulario de palabra original en el documento. IPhraseSink almacena frases en tiempo de consulta. Las frases mejoran la relevancia de los resultados de la consulta porque las secuencias de palabras más largas son poco frecuentes y proporcionan una distinción mayor que las frases más pequeñas. Cuando el indexador coloca una frase en el IPhraseSink en el momento de la consulta, crea una instancia del separador de palabras para dividir la frase en palabras. A continuación, el indexador evalúa la frase comprobando si las palabras de la frase se producen adyacentes entre sí en el índice. Por ejemplo, si "ABCD" se produce en el índice en las posiciones x, x+1, x+2 y x+3, la coincidencia de frases se producirá si se envía alguna subcadena adyacente de "ABCD" en una consulta. Esta estrategia es eficaz para los separadores de palabras basados en caracteres que dividen frases y palabras largas durante la creación del índice y que generan frases durante el tiempo de consulta.
Saltos
Los saltos son los espacios entre palabras. El espacio en blanco, la puntuación, el formato o simplemente la naturaleza del propio idioma puede provocar interrupciones. Hay cuatro tipos diferentes de saltos que usa el indexador: final de palabra (EOW), fin de frase (EOS), final del párrafo (EOP) y final del capítulo (EOC). La interrupción EOW es la interrupción predeterminada. Después de cada token, cada salto indica una distancia semántica diferente entre las palabras de cualquier lado. Las palabras separadas por EOW tienen el vínculo semántico más estrecho, seguido de EOS, EOP y EOC. Varias llamadas a IWordSink::P utBreak son acumulativas y son análogas a la inserción de palabras o oraciones nulas.
Escalabilidad, rendimiento y seguridad
La forma en que el separador de palabras responde a las llamadas simultáneas está determinada en gran medida por la elección del modelo de subprocesos. El indexador es una aplicación de un solo subproceso. Para que los separadores de palabras funcionen en un entorno de un solo subproceso, los separadores de palabras deben escribirse mediante un modelo de subproceso "libre" o "ambos". Word separadores no deben registrarse con COM mediante el modelo de subproceso "apartment".
Se recomienda que los separadores de palabras eviten estados globales y almacenen datos en la instancia del separador de palabras. El único contenido que se debe almacenar en la implementación del separador de palabras es para los parámetros fQuery y ulMaxTokenSize. Word separadores no debe ser más de dos veces más lento que el punto de referencia establecido por el separador de palabras en inglés. Word rendimiento del separador también debe mejorar con una mayor capacidad de hardware.
Word separadores para la ejecución del indexador en el contexto de seguridad del sistema local. Deben escribirse para administrar búferes y para apilar correctamente. Todas las copias de cadena deben tener comprobaciones explícitas para protegerse frente a saturaciones de búfer. Siempre debe comprobar el tamaño asignado del búfer y probar el tamaño de los datos con respecto al tamaño del búfer. Word separadores no puede suponer que el texto pasado al método IWordBreaker::BreakText está bien formado. Para obtener más información sobre cómo solucionar problemas de separadores de palabras, consulte Solución de problemas de recursos de lenguaje y procedimientos recomendados.
Implementación de un lematizador
Los lematizadores implementan la interfaz IStemmer . El método IStemmer::GenerateWordForms genera una lista de formularios de palabras inflected para una palabra de entrada determinada. Para implementar un componente de lematizador, debe tener heurística de idioma para su idioma. Esto incluye información sobre la morfología. También puede que necesite una lista de palabras para excluir o incluir. Para obtener más información sobre las consideraciones lingüísticas y cómo afectan estas consideraciones a las implementaciones del lematizador, consulte Consideraciones lingüísticas y Unicode.
Se recomienda que los lematizadores no generen el genitivo, o posesivo, mayúsculas y minúsculas para las palabras. Por ejemplo, "David" no se genera como forma alternativa para "David". El separador de palabras genera "David" y "David's" cuando analiza "David's".
El lematizador usa el objeto IWordFormSink para recopilar la lista de palabras alternativas. IWordFormSink::P utWord genera la palabra final del lematizador. En todos los casos, esta palabra final es la misma que la palabra de entrada de IStemmer::GenerateWordForms. Por ejemplo, dada la palabra "nadar", el lematizador genera las siguientes formas de palabra: "natación", "nadador", "nadador", "swam" y "swum", mediante llamadas a IWordFormSink::P utAltWord. El lematizador genera "nadar" a través de IWordFormSink::P utWord.
Escalabilidad, rendimiento y seguridad
Los lematizadores, como los separadores de palabras, deben usar un modelo de subproceso "libre" y registrarse con COM con su modelo de subprocesos establecido en "libre" o "ambos". Windows Search llama a instancias independientes del lematizador de diferentes subprocesos al mismo tiempo. Por lo tanto, los lematizadores deben tener datos mínimos de instancia.
La precisión del lematizador tiene un impacto significativo en la relevancia de las consultas. Si el lematizador deriva incorrectamente el texto, las consultas pueden devolver resultados impredecibles e inexactos. Los lematizadores deben controlar cientos de consultas por segundo sin afectar negativamente al rendimiento de las consultas. El rendimiento del lematizador debe mejorar con una mayor capacidad de hardware. Para obtener información sobre cómo solucionar problemas de lematizadores, consulte Solución de problemas de recursos de lenguaje y procedimientos recomendados.
Los lematizadores de Búsqueda de Windows se ejecutan en el contexto de seguridad local. Deben escribirse para administrar búferes y para apilar correctamente. Todas las copias de cadena deben tener comprobaciones explícitas para protegerse frente a saturaciones de búfer. Siempre debe comprobar el tamaño asignado del búfer y probar el tamaño de los datos con respecto al tamaño del búfer.
Temas relacionados