Confronto di Lucene Analyzers


104

Qualcuno può spiegare la differenza tra i diversi analizzatori all'interno di Lucene? Ricevo un'eccezione maxClauseCount e capisco che posso evitarlo utilizzando KeywordAnalyzer ma non voglio cambiare da StandardAnalyzer senza comprendere i problemi che circondano gli analizzatori. Grazie mille.

Risposte:


209

In generale, qualsiasi analizzatore in Lucene è tokenizer + stemmer + filtro stop-words.

Tokenizer divide il testo in blocchi e poiché diversi analizzatori possono utilizzare tokenizzatori diversi, è possibile ottenere flussi di token di output diversi , ovvero sequenze di blocchi di testo. Ad esempio, KeywordAnalyzerhai citato non divide affatto il testo e prende tutto il campo come un singolo token. Allo stesso tempo, StandardAnalyzer(e la maggior parte degli altri analizzatori) usa spazi e punteggiatura come punti di divisione. Ad esempio, per la frase "Sono molto felice" produrrà elenco ["i", "sono", "molto", "felice"] (o qualcosa del genere). Per ulteriori informazioni su analizzatori / tokenizzatori specifici, consultare i relativi documenti Java .

Gli stemmer sono usati per ottenere la base di una parola in questione. Dipende molto dalla lingua utilizzata. Ad esempio, per la frase precedente in inglese ci sarà qualcosa come ["i", "be", "veri", "happi"] e per il francese "Je suis très heureux" una sorta di analizzatore francese (come SnowballAnalyzer, inizializzato con "French") produrrà ["je", "être", "tre", "heur"]. Ovviamente, se utilizzerai l'analizzatore di una lingua per stemperare il testo in un'altra, verranno utilizzate le regole dell'altra lingua e lo stemmer potrebbe produrre risultati errati. Non è un errore di tutto il sistema, ma i risultati della ricerca potrebbero essere meno accurati.

KeywordAnalyzernon utilizza stemmers, supera tutto il campo senza modifiche. Quindi, se hai intenzione di cercare alcune parole nel testo inglese, non è una buona idea usare questo analizzatore.

Le stop words sono le parole più frequenti e quasi inutili. Di nuovo, dipende molto dalla lingua. Per l'inglese queste parole sono "a", "the", "I", "be", "have", ecc. I filtri di parole non significative le rimuovono dal flusso di token per ridurre il rumore nei risultati di ricerca, quindi finalmente la nostra frase "I sono molto contento "con StandardAnalyzerverrà trasformato in list [" veri "," happi "].

E KeywordAnalyzerancora non fa nulla. Quindi, KeywordAnalyzerviene utilizzato per cose come ID o numeri di telefono, ma non per il testo normale.

E per quanto riguarda la tua maxClauseCounteccezione, credo che tu lo ottenga durante la ricerca. In questo caso molto probabilmente è a causa di una query di ricerca troppo complessa. Prova a suddividerlo in più query o utilizza più funzioni di basso livello.


1
@ffriend: non credo che Stemmer (usando snowball o altri algoritmi) possa convertire am -> perché è un lavoro di Lemmatizer. Puoi verificarlo qui snowball.tartarus.org/demo.php
Tho

Allora, dove si inserisce Tika in questo? Non è tecnicamente un analizzatore?
anon

1
@anon: Tika è un progetto separato con diverse caratteristiche chiave. Supponendo che tu intenda parser Tika, direi che Tika prende il flusso di byte e genera testo + metadati, mentre gli analizzatori Lucene prendono il testo e generano il flusso di token elaborato. Ad esempio, puoi prima analizzare file PDF o XML con Tika, produrre documenti con campi come "titolo", "autore" e "testo", quindi analizzare alcuni o tutti questi campi con gli analizzatori Lucene.
ffriend

mi chiedo, "molto" e "felice" non sono parole rifiutate, perché si trasformano in "veri" e "happi"? deve corrispondere alle <-> y differenze poiché suonano simili?
oguzalb

0

Dal mio punto di vista, ho usato StandAnalyzere SmartCNAnalyzer. Dato che devo cercare il testo in cinese. Ovviamente SmartCnAnalyzerè più bravo a gestire il cinese. Per scopi diversi, devi scegliere l'analizzatore più appropriato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.