Comparación de analizadores Lucene

104

¿Alguien puede explicar la diferencia entre los diferentes analizadores de Lucene? Recibo una excepción maxClauseCount y entiendo que puedo evitar esto usando un KeywordAnalyzer, pero no quiero cambiar el StandardAnalyzer sin comprender los problemas que rodean a los analizadores. Muchas gracias.

Oficial
fuente

Respuestas:

209

En general, cualquier analizador en Lucene es tokenizer + lematizador + filtro de palabras vacías.

Tokenizer divide su texto en trozos, y dado que diferentes analizadores pueden usar diferentes tokenizadores, puede obtener diferentes flujos de token de salida , es decir, secuencias de trozos de texto. Por ejemplo, KeywordAnalyzermencionaste que no divide el texto en absoluto y toma todo el campo como un solo token. Al mismo tiempo, StandardAnalyzer(y la mayoría de los otros analizadores) usan espacios y puntuación como puntos de división. Por ejemplo, para la frase "Estoy muy feliz" producirá una lista ["yo", "estoy", "muy", "feliz"] (o algo así). Para obtener más información sobre analizadores / tokenizadores específicos, consulte sus Documentos de Java .

Las leyendas se utilizan para obtener la base de una palabra en cuestión. Depende en gran medida del idioma utilizado. Por ejemplo, para la frase anterior en inglés habrá algo como ["i", "be", "veri", "happi"] producido, y para el francés "Je suis très heureux" algún tipo de analizador francés (como SnowballAnalyzer, inicializado con "francés") producirá ["je", "être", "tre", "heur"]. Por supuesto, si usa el analizador de un idioma para derivar texto en otro, se usarán las reglas del otro idioma y el derivador puede producir resultados incorrectos. No es un error de todo el sistema, pero los resultados de búsqueda pueden ser menos precisos.

KeywordAnalyzerno utiliza lematizadores, pasa todo el campo sin modificaciones. Por lo tanto, si va a buscar algunas palabras en un texto en inglés, no es una buena idea utilizar este analizador.

Las palabras vacías son las palabras más frecuentes y casi inútiles. Nuevamente, depende en gran medida del idioma. Para el inglés, estas palabras son "a", "the", "I", "be", "have", etc. Los filtros de palabras vacías las eliminan del flujo de tokens para reducir el ruido en los resultados de búsqueda, por lo que finalmente nuestra frase "I StandardAnalyzerEstoy muy feliz "con se transformará en lista [" veri "," happi "].

Y de KeywordAnalyzernuevo no hace nada. Por lo tanto, KeywordAnalyzerse usa para cosas como ID o números de teléfono, pero no para texto habitual.

Y en cuanto a tu maxClauseCountexcepción, creo que lo consigues buscando. En este caso, lo más probable es que se deba a una consulta de búsqueda demasiado compleja. Intente dividirlo en varias consultas o use más funciones de bajo nivel.

amigo
fuente
1
@ffriend: no creo que Stemmer (usando bola de nieve u otros algoritmos) pueda convertir am -> be porque es un trabajo de Lemmatizer. Puede consultarlo aquí snowball.tartarus.org/demo.php
Tho
Entonces, ¿dónde encaja Tika en esto? ¿No es técnicamente un analizador?
anon
1
@anon: Tika es un proyecto independiente con varias características clave. Suponiendo que te refieres a los analizadores de Tika, yo diría que Tika toma el flujo de bytes y genera texto + metadatos, mientras que los analizadores de Lucene toman texto y generan un flujo de tokens procesado. Por ejemplo, primero puede analizar un archivo PDF o XML con Tika, produciendo documentos con campos como "título", "autor" y "texto", y luego analizar algunos o todos estos campos con analizadores Lucene.
ffriend
simplemente preguntarse, "muy" y "feliz" no son palabras declinadas, ¿por qué se transforman en "veri" y "happi"? ¿Es para igualar las diferencias i <-> y ya que suenan similares?
Oguzalb
0

En mi perspectiva, he usado StandAnalyzery SmartCNAnalyzer. Como tengo que buscar texto en chino. Obviamente, SmartCnAnalyzermaneja mejor el chino. Para diferentes propósitos, debe elegir el analizador más adecuado.

neal
fuente