Condividi tramite


Implementazione di un Word Breaker e Stemmer

Microsoft fornisce word breaker e stemmer per una serie di lingue. Questo argomento descrive come implementare e usare word breaker e stemmer personalizzati per le lingue e le impostazioni locali oltre a quelli forniti da Microsoft.

Nota

I word breaker personalizzati non sono stati temporaneamente supportati. Nel luglio 2018 è stata apportata una modifica a Windows Server 2019 che impediva il caricamento delle DLL senza firma Microsoft da SearchIndexer.exe. Questa limitazione è stata revocata nel gennaio 2021.

Questo argomento è organizzato come segue:

Registrazione di una DLL della risorsa del linguaggio

Ogni DLL della risorsa del linguaggio deve implementare ed esportare i punti di ingresso seguenti. La DLL può essere registrata in qualsiasi cartella.

  • DllMain è il punto di ingresso standard della DLL.
  • DllRegisterServer registra la DLL nel Registro di sistema, ad esempio regsvr32.exe %SystemRoot%\MyFolder\wordbreaker.dll
  • DllCanUnloadNow consente ai client di chiamare questo punto di ingresso tramite Component Object Model (COM) per determinare se è possibile scaricare la DLL della risorsa del linguaggio.
  • DllUnRegisterServer rimuove la DLL dal Registro di sistema.

Registrazione di una lingua

Il Registro di sistema contiene voci specifiche della lingua per la lingua indicizzata e queste voci controllano le parti dei processi di indicizzazione e query specifici del linguaggio. Queste voci del Registro di sistema sono disponibili nella chiave del Registro di sistema seguente.

HKEY_LOCAL_MACHINE
   SYSTEM
      CurrentControlSet
         ContentIndex
            Control
               Language
                  

Implementazione di un Word Beaker

Word breaker implementano IWordBreaker. Il metodo IWordBreaker::BreakText esegue tutte le operazioni di elaborazione e analisi del testo. Per implementare un componente word breaker, è necessario disporre di un'euristica del linguaggio per la lingua. Ciò include informazioni sulla sintassi e sulla morsa. Potrebbe anche essere necessario un elenco di parole da escludere o includere. Si compila il file di parole di rumore per le impostazioni locali della lingua dall'elenco di parole escluse. Per altre informazioni sulle considerazioni linguistiche e sul modo in cui queste considerazioni influiscono sulle implementazioni di word breaker, vedere Considerazioni linguistiche e Unicode.

Lo scopo principale di IWordBreaker::BreakText consiste nell'elaborare il testo in modo continuo dalla TEXT_SOURCE fino a quando non viene elaborato tutto il testo o finché il word breaker non rileva un errore. Durante questo ciclo di elaborazione dati, IWordBreaker::BreakText chiama metodi di analisi e utilità che eseguono attività specifiche per tale processo. Ad esempio, il word breaker tedesco può gestire parole composte, mentre il word breaker francese può elaborare diacritici o clitici. Le funzioni specifiche eseguite dal word breaker e la strategia usata per eseguire queste attività dipendono interamente dai requisiti per tale lingua.

Quando si interrompe il testo, i word breaker identificano le forme "alternative" per le parole che possono avere più rappresentazioni. Nessuna relazione semantica è implicita tra le parole generate. Infatti, la parola originale potrebbe non essere inclusa nell'elenco delle alternative. I moduli alternativi vengono salvati nella stessa posizione dell'indice della parola originale per indicare che sono identici.

Quando un documento viene incluso nell'indice, ogni parola viene assegnata a un valore intero che rappresenta l'offset o la distanza della parola dall'inizio di un documento. La distanza relativa tra parole in una query viene confrontata con gli offset archiviati nell'indice full-text. La query "Where is kyle's document" corrisponde a qualsiasi documento con "Where" in offset n, "is" in n+1, "Kyle's" in n+2 e "document" in n+3. "Dove è archiviato il documento di Kyle nel data-base?" è rappresentato come:

               
Where is Kyle Kyle's
documento Archiviato in il database data base

 

In questo esempio il word breaker archivia moduli alternativi per "Kyle" ("Kyle's") e "database" ("data base") nell'indice. Il word breaker genera e archivia parole alternative durante il processo di creazione dell'indice in base alle condizioni seguenti:

  • Se è probabile che una parola alternativa venga visualizzata come singola parola in una query
  • Se un stemmer non è probabile derivare la parola originale dall'alternativa

La generazione di moduli di parole alternative aumenta il numero di modi in cui le query rappresentano e corrispondono a una frase, come illustrato nelle varianti seguenti:

  1. Dove è file del documento Kyle nel database
  2. Dove è archiviato il documento di Kyle nel database
  3. Dove è il documento Kyle archiviato nella data base
  4. Dove è il documento di Kyle archiviato nella data base

WordSink e PhraseSink

Word breaker usano gli oggetti IWordSink e IPhraseSink per raccogliere e archiviare tutte le parole e le frasi estratte dal testo. Un word breaker archivia le parole in un modulo che è il più vicino possibile alla forma di parola originale nel documento. IPhraseSink archivia frasi in fase di query. Le frasi migliorano la rilevanza dei risultati delle query perché le sequenze più lunghe di parole sono più rare e forniscono una distinzione maggiore rispetto alle frasi più piccole. Quando l'indicizzatore inserisce una frase nella query IPhraseSink in fase di query, crea un'istanza del word breaker per suddividere la frase in parole. L'indicizzatore valuta quindi la frase controllando se le parole nella frase si verificano adiacenti tra loro nell'indice. Ad esempio, se "ABCD" si verifica nell'indice in posizioni x, x+1, x+2 e x+3, la corrispondenza della frase si verificherà se una sottostringa adiacente di "ABCD" viene inviata in una query. Questa strategia è efficace per i word breaker basati su caratteri che dividono frasi e parole lunghe durante la creazione dell'indice e che generano frasi durante il tempo di query.

Interruzioni

Le interruzioni sono gli spazi tra le parole. Spazio vuoto, punteggiatura, formattazione o semplicemente la natura della lingua stessa può causare interruzioni. Esistono quattro diversi tipi di interruzioni usate dall'indicizzatore: fine di parola (EOW), fine di frase (EOS), fine del paragrafo (EOP) e fine del capitolo (EOC). L'interruzione EOW è l'interruzione predefinita. Dopo ogni token, ogni interruzione indica una distanza semantica diversa tra le parole su entrambi i lati. Le parole separate da EOW hanno il collegamento semantico più stretto, seguito da EOS, EOP e EOC. Più chiamate a IWordSink::P utBreak sono cumulative e sono analoghe all'inserimento di parole o frasi Null.

Scalabilità, esecuzione e sicurezza

Il modo in cui il word breaker risponde alle chiamate simultanee è in gran parte determinato dalla scelta del modello di threading. L'indicizzatore è un'applicazione a thread singolo. Per consentire ai word breaker di funzionare in un ambiente a thread singolo, i word breaker devono essere scritti usando un modello di threading "gratuito" o "entrambi". Word i breaker non devono registrarsi con COM usando il modello di threading "apartment".

È consigliabile evitare stati globali e archiviare i dati nell'istanza del word breaker. L'unico contenuto che deve essere archiviato nell'implementazione del word breaker è per i parametri fQuery e ulMaxTokenSize. Word i breaker devono essere più lenti di due volte rispetto al benchmark stabilito dal word breaker inglese. Word prestazioni del breaker dovrebbero migliorare anche con una maggiore funzionalità hardware.

Word breaker per l'esecuzione dell'indicizzatore nel contesto di sicurezza del sistema locale. Devono essere scritti per gestire i buffer e per eseguire correttamente lo stack. Tutte le copie di stringa devono disporre di controlli espliciti per proteggere gli overrun del buffer. È sempre necessario verificare la dimensione allocata del buffer e testare le dimensioni dei dati rispetto alle dimensioni del buffer. Word i breaker non possono presumere che il testo passato al metodo IWordBreaker::BreakText sia ben formato. Per altre informazioni sulla risoluzione dei problemi relativi ai word breaker, vedere Risoluzione dei problemi relativi alle risorse del linguaggio e alle procedure consigliate.

Implementazione di un stemmer

Gli stemmer implementano l'interfaccia IStemmer . Il metodo IStemmer::GenerateWordForms genera un elenco di moduli di parole inflected per una determinata parola di input. Per implementare un componente stemmer, è necessario disporre dell'euristica del linguaggio per la lingua. Ciò include informazioni sulla morfologia. Potrebbe essere necessario anche un elenco di parole da escludere o includere. Per altre informazioni sulle considerazioni linguistiche e sul modo in cui queste considerazioni influiscono sulle implementazioni di stemmer, vedere Considerazioni linguistiche e Unicode.

È consigliabile che gli stemmer non generino il genitivo, o possessivo, per le parole. Ad esempio, "David" non viene generato come modulo alternativo per "David' s". Il word breaker genera sia "David" che "David' s" quando analizza "David's".

Lo stemmer usa l'oggetto IWordFormSink per raccogliere l'elenco di parole alternative. IWordFormSink::P utWord genera la parola finale dallo stemmer. In tutti i casi, questa parola finale corrisponde alla parola di input di IStemmer::GenerateWordForms. Ad esempio, data la parola "swim", lo stemmer genera le seguenti forme di parola: "nuoto", "nuotatore", "nuotatore", "swam" e "swum", tramite chiamate a IWordFormSink::P utAltWord. Lo stemmer genera "swim" tramite IWordFormSink::P utWord.

Scalabilità, prestazioni e sicurezza

Gli stemmer, come i word breaker, devono usare un modello di threading "libero" e registrarsi con COM con il modello di threading impostato su "libero" o "entrambi". Windows Search chiama istanze separate dello stemmer da thread diversi contemporaneamente. Gli stemmer devono pertanto avere dati di istanza minimi.

L'accuratezza dello stemmer ha un impatto significativo sulla pertinenza delle query. Se lo stemmer deriva erroneamente il testo, le query potrebbero restituire risultati imprevedibili e imprecisi. Gli stemmer devono gestire centinaia di query al secondo senza influire negativamente sulle prestazioni delle query. Le prestazioni di Stemmer dovrebbero migliorare con una maggiore funzionalità hardware. Per informazioni sulla risoluzione dei problemi relativi agli stemmer, vedere Risoluzione dei problemi relativi alle risorse del linguaggio e alle procedure consigliate.

Gli stemmer per Windows Search vengono eseguiti nel contesto di sicurezza locale. Devono essere scritti per gestire i buffer e per eseguire correttamente lo stack. Tutte le copie di stringa devono disporre di controlli espliciti per evitare sovraccarichi del buffer. È consigliabile verificare sempre le dimensioni allocate del buffer e testare le dimensioni dei dati rispetto alle dimensioni del buffer.

Estensione delle risorse del linguaggio

Informazioni sui componenti delle risorse del linguaggio

Considerazioni linguistiche e Unicode

Risoluzione dei problemi relativi alle risorse del linguaggio e alle procedure consigliate