Condividi tramite


Implementazione di un segmentatore di parole e di uno stemming

Microsoft fornisce segmentatori di parole e stemmatizzatori per diverse lingue. Questo argomento descrive come implementare e usare segmentatori di parole e stemmer personalizzati per lingue e impostazioni locali che vanno oltre quelle fornite da Microsoft.

Nota

I segmentatori di parole personalizzati non erano temporaneamente supportati. A 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 delle risorse del linguaggio

Ogni DLL delle risorse 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 alla 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 linguistiche specifiche per la lingua in fase di indicizzazione e queste voci controllano le parti dei processi di indicizzazione e query che sono linguistici. 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 Beaker di Word

Gli spezzatori di parole implementano IWordBreaker. Il metodo IWordBreaker::BreakText esegue tutta l'elaborazione e l'analisi del testo. Per implementare un componente di suddivisione in parole, è necessario disporre di euristiche linguistiche nella tua lingua. Sono incluse informazioni sulla sintassi e sulla morfologia. Potrebbe anche essere necessario un elenco di parole da escludere o includere. Costruisci il file di parole non significative per il tuo locale linguistico 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 dal 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 clitics. Le funzioni specifiche eseguite dal word breaker e la strategia usata per eseguire queste attività dipendono interamente dai requisiti per tale linguaggio.

Quando si interrompe il testo, i word breaker identificano 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, a ogni parola viene assegnato un valore intero che rappresenta l'offset o la distanza della parola dall'inizio di un documento. La distanza relativa tra le parole in una query viene confrontata con gli intervalli archiviati nell'indice full-text. La query "Where is Kyle's document" corrisponde a qualsiasi documento con "Where" all'offset n, "is" a n+1, "Kyle's" a n+2 e "document" a n+3. "Dove è il documento di Kyle archiviato nella data-base?" è rappresentato come:

               
Dove è di Kyle Kyle
documento archiviato in Le database data base

 

In questo esempio, l'interrompitore di parole archivia le forme alternative 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 nelle condizioni seguenti:

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

La generazione di forme 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 è il documento Kyle archiviato nel database
  2. Dove è il documento di Kyle archiviato nel database
  3. Dove è il documento Kyle archiviato nella data base
  4. Dove è il documento di Kyle archiviato nella base dati

WordSink e PhraseSink

I 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 il più vicino possibile alla forma originale del documento. IPhraseSink archivia le frasi al momento della query. Le frasi migliorano la pertinenza dei risultati delle query perché le sequenze di parole più lunghe sono più rare e offrono una distinzione maggiore rispetto alle frasi più piccole. Quando l'indicizzatore inserisce una frase nel IPhraseSink al momento della query, crea un'istanza del separatore di parole per suddividere la frase in parole. L'indicizzatore valuta quindi la frase controllando se le parole nella frase si verificano l'una accanto all'altra 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 suddivideno 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. Spazi vuoti, punteggiatura, formattazione o solo 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::PutBreak 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 viene in gran parte determinato dalla scelta del modello di threading. L'indicizzatore è un'applicazione a thread singolo. Affinché i word breaker funzionino in un ambiente a thread singolo, i word breaker devono essere scritti usando un modello di threading "libero" o "entrambi". I word breaker non devono registrarsi con COM usando il modello di threading "apartment".

Si consiglia ai segmentatori di parole di evitare gli stati globali e di archiviare i dati nell'istanza del segmentatore di parole. L'unico contenuto che deve essere archiviato nell'implementazione del word breaker è relativo ai parametri fQuery e ulMaxTokenSize. I word breaker non devono essere più di due volte più lenti rispetto al benchmark stabilito dal word breaker inglese. Le prestazioni del word breaker dovrebbero migliorare anche con una maggiore funzionalità hardware.

Word breakers per l'indicizzatore vengono eseguiti 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 evitare sovraccarichi del buffer. È consigliabile verificare sempre le dimensioni allocate del buffer e testare le dimensioni dei dati rispetto alle dimensioni del buffer. I word breaker non possono presupporre 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 uno Stemmer

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

È consigliabile che gli stemmatizzatori non generino il genitivo, o possessivo, per le parole. Ad esempio, "David" non viene generato come forma alternativa per "David's". L'analizzatore di parole genera sia "David" che "David's" quando analizza "David's".

Lo stemmer usa l'oggetto IWordFormSink per raccogliere l'elenco di parole alternative. IWordFormSink::PutWord genera la parola finale dallo stemmatore. In tutti i casi, questa parola finale corrisponde alla parola di input di IStemmer::GenerateWordForms. Ad esempio, data la parola "nuotare", lo stemmer genera le seguenti forme di parola: "nuotando", "nuotatore", "nuota", "nuotò" e "nuotato", tramite chiamate a IWordFormSink::PutAltWord. Lo stemmer genera «swim» tramite IWordFormSink::P utWord.

Scalabilità, esecuzione 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 contemporaneamente istanze separate dello stemmer da thread diversi. Gli stemmer devono pertanto avere dati di istanza minimi.

L'accuratezza dello stemmer ha un impatto significativo sulla pertinenza delle query. Se lo stemmer elabora 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 dello 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.

l'estensione delle risorse linguistiche

Comprensione delle Componenti delle Risorse Linguistiche

considerazioni linguistiche e Unicode

Risoluzione dei problemi relativi alle risorse linguistiche e alle migliori pratiche