Notas de estudio de Lucence (dos)

Tabla de contenido

API de tokenizador de Lucene

org.apache.lucene.analysi.Analyzer

TokenStreamComponents createComponents (String fieldName)

TokenStreamComponents  

org.apache.lucene.analysis.TokenStream

Dos tipos de subclases de TokenStream

TokenStream hereda AttributeSource

Descripción de la regla de uso de AttributeSource

Pasos para usar TokenStream.

Implementación simple de nuestro propio analizador, descripción de requisitos

resumen

El tokenizador proporcionado por Lucene

Segmentación de palabras en inglés de StandardAnalyzer en el módulo principal de Lucene

Dispositivo de segmentación de palabras chinas de Lucene SmartChineseAnalyzer

El tokenizador proporcionado en el paquete común de Lucene-Analyzers

Integración de IKAnalizer

IKAnalyzer es un segmentador de palabras chinas ligero y de código abierto con muchas aplicaciones

La integración es necesaria porque la API del método createComponents de Analyzer ha cambiado.

IKAnalyzer proporciona dos modos de segmentación de palabras: segmentación de palabras de grano fino y segmentación de palabras inteligente, según sus parámetros de construcción.

Después de la integración, pruebe el efecto de la segmentación detallada de palabras y la segmentación inteligente de palabras.

Compare IKAnalyzer y SmartChineseAnalyzer

Amplíe las palabras vacías de IKAnalyzer

Expandir el diccionario de IKAnalyzer

 Ejemplo de archivo IKAnalyzer.cfg.xml


API de tokenizador de Lucene

org.apache.lucene.analysi.Analyzer

El analizador , la API central del componente tokenizer, es responsable de construir un TokenStream (procesador de segmentación de palabras) que realmente realiza el procesamiento de segmentación de palabras en el texto. Al llamar a sus dos métodos siguientes, se obtiene el procesador de segmentación de palabras del texto de entrada.

public final TokenStream tokenStream(final String fieldName,
                                       final Reader reader) {
    TokenStreamComponents components = reuseStrategy.getReusableComponents(this, fieldName);
    final Reader r = initReader(fieldName, reader);
    if (components == null) {
      components = createComponents(fieldName);
      reuseStrategy.setReusableComponents(this, fieldName, components);
    }
    components.setReader(r);
    return components.getTokenStream();
  }
public final TokenStream tokenStream(final String fieldName, final String text) {
    TokenStreamComponents components = reuseStrategy.getReusableComponents(this, fieldName);
    @SuppressWarnings("resource") final ReusableStringReader strReader = 
        (components == null || components.reusableStringReader == null) ?
        new ReusableStringReader() : components.reusableStringReader;
    strReader.setValue(text);
    final Reader r = initReader(fieldName, strReader);
    if (components == null) {
      components = createComponents(fieldName);
      reuseStrategy.setReusableComponents(this, fieldName, components);
    }

Pregunta 1: ¿Dónde consiguió TokenStream?

Pregunta 2: ¿Quién es el lector de flujo de caracteres transmitido por el método?

Pregunta 3: ¿Qué son los componentes? ¿Cuál es la lógica de adquisición de componentes?

Pregunta 4: ¿Qué es el método createComponents (fieldName)?

Pregunta 5: ¿Analyzer puede crear objetos directamente?

Pregunta 6: ¿Por qué está diseñado de esta manera?

Pregunta 7: Por favor, eche un vistazo a cuáles son las subclases de implementación de Analyzer.

Pregunta 8: Para implementar un analizador propio, ¿qué método se debe implementar?

TokenStreamComponents createComponents (String fieldName)

Es el único método abstracto y punto de extensión en Analizer. Realice su propio analizador proporcionando la implementación de este método.

Descripción del parámetro: fieldName, si necesitamos crear diferentes componentes de procesador de segmentación de palabras para diferentes campos, podemos juzgar en función de este parámetro. De lo contrario, este parámetro no se utiliza.

El valor de retorno es el componente del procesador de segmentación de palabras TokenStreamComponents. Necesitamos crear los componentes del procesador de segmentación de palabras que queremos en el método createComponents.

TokenStreamComponents  

Componente del procesador de segmentación de palabras : esta clase encapsula el procesador de segmentación de palabras TokenStream para uso externo. Proporciona acceso a los dos atributos de fuente (fuente) y receptor (para uso externo de procesadores de segmentación de palabras).

Pregunta 1: ¿Cuántos métodos de construcción existen para esta clase? ¿Cuál es la diferencia? ¿Qué se puede encontrar de él?

Pregunta 2: ¿Cuáles son los tipos de atributos de fuente y sumidero? ¿Cuál es la relación entre estos dos tipos?

Pregunta 3: No hay código para crear objetos fuente y receptor en esta clase (en su lugar, es pasado por el constructor). Es decir, antes de crear su objeto en el método Analyzer.createComponents, ¿qué se debe crear primero?

Pregunta 4: ¿Quién es el flujo de entrada proporcionado al método tokenStream () en Analyzer? ¿Quién es el objeto TokenStream obtenido? ¿Es necesario encapsular un objeto de origen en el receptor del objeto TokenStream?

Si debe ser así, ¿esta encapsulación también debe realizarse en el método Analyzer.createComponents?

org.apache.lucene.analysis.TokenStream

El procesador de segmentación de palabras es responsable de la segmentación de palabras y el procesamiento del texto de entrada.

Pregunta 1: Continuando con la página anterior, ¿existe un método de entrada correspondiente en TokenStream?

Pregunta 2: TokenStream es una clase abstracta, ¿cuáles son sus métodos y cuáles son sus métodos abstractos? ¿Cuáles son las características de su método de construcción?

Pregunta 3: ¿Cuáles son los dos tipos de subcategorías específicas de TokenStream? ¿Cual es la diferencia?

Pregunta 4: ¿Quién ha heredado TokenStream? ¿Para qué sirve?

Descripción del concepto: Atributo del token: atributos del artículo (información del artículo): como palabras incluidas, ubicación, etc.

Dos tipos de subclases de TokenStream

Tokenizer : Tokenizer , la entrada es el TokenStream del flujo de caracteres del Reader, y los subelementos están separados del flujo.

TokenFilter : filtro de subelemento , su entrada es otro TokenStream, que completa el procesamiento especial del token que fluye desde el TokenStream anterior.

Pregunta 1: Verifique el código fuente y los comentarios de la clase Tokenizer. ¿Cómo usar esta clase? ¿Qué solo hay que hacer para implementar su propio Tokenizer?

Pregunta 2: ¿Cuáles son las subclases de Tokenizer?

Pregunta 3: Verifique el código fuente y los comentarios de la clase TokenFilter, ¿cómo implementar su propio TokenFilter?

Pregunta 4: ¿Cuáles son las subclases de TokenFilter?

Pregunta 5: ¿TokenFilter es un patrón de decorador típico? Si necesitamos realizar varios procesamientos en la segmentación de palabras, solo necesitamos envolverlo capa por capa de acuerdo con nuestro orden de procesamiento (cada capa completa un procesamiento específico). Las diferentes necesidades de procesamiento solo necesitan un orden de paquete diferente y un número de capas diferente.

TokenStream hereda AttributeSource

Pregunta 1: ¿Vemos el almacenamiento de información de subelemento en TokenStream y sus dos subcategorías, como cuál es la palabra del subelemento y el índice de posición de esta palabra?

Descripción del concepto: Token de atributo Atributos del subelemento de atributo (información del subelemento), como la palabra del subelemento, la posición de índice de la palabra, etc. Estos atributos se obtienen a través de diferentes estadísticas de procesamiento de Tokenizer / TokenFilter. Las diferentes combinaciones de Tokenizer / TokenFilter tendrán diferentes subelementos. Cambiará dinámicamente, no sabes cuántos o qué son. ¿Cómo realizar el almacenamiento de información detallada? La respuesta es AttributeSource, Attribute, AttributeImpl, AttributeFactory 1. AttribureSource es responsable de almacenar los objetos Attribute y proporciona los métodos de almacenamiento y recuperación correspondientes. 2. Los objetos Attribute pueden almacenar una o más información de atributos. 3. AttributeFactory es una fábrica responsable de crear Objetos de atributo. AttributeFactory.getStaticImplementation se utiliza de forma predeterminada en TokenStream. No es necesario que lo proporcionemos, solo siga sus reglas.

Descripción de la regla de uso de AttributeSource

  • 1. Si desea almacenar atributos detallados en una determinada implementación de TokenStream, agregue un objeto de atributo a AttributeSource a través de uno de los dos métodos de adición de AttributeSource.
  • <T amplía el atributo> T addAttribute (Class <T> attClass) Este método requiere que pase la clase de interfaz (heredando el atributo) del atributo que necesita agregar y le devuelva la instancia de la clase de implementación correspondiente. De la interfaz a la instancia, esta es la razón por la que se necesita AttributeFactory. void addAttributeImpl (atributo AttributeImpl)
  • 2. Cada clase de implementación de atributo agregada solo tendrá una instancia en AttributeSource. En el proceso de segmentación de palabras, el subelemento es reutilizar esta instancia para almacenar la información de atributo del subelemento. Llamar repetidamente al método add para agregar devuelve el objeto de instancia almacenado.
  • 3. Para obtener la información de atributo de un subelemento, debe mantener un objeto de instancia de un atributo, obtener el objeto de atributo a través del método addAttribute o el método getAttribure, y luego llamar al método de instancia para obtener y establecer el valor.
  • 4. En TokenStream, usamos nuestro propio atributo, el predeterminado de fábrica. Cuando llamamos a este método add, ¿cómo sabe qué clase de implementación es? Hay ciertas reglas a seguir: 1. La interfaz de atributo personalizado MyAttribute hereda el atributo 2. La clase de implementación de atributo personalizado debe heredar el atributo e implementar la interfaz personalizada MyAttribute 3. La clase de implementación de atributo personalizado debe proporcionar un método de construcción sin parámetros 4, En Para que la fábrica predeterminada encuentre la clase de implementación basada en la interfaz personalizada, el nombre de la clase de implementación debe ser el nombre de la interfaz + Impl. Compruebe si la implementación del atributo proporcionada en lucene es así.

Pasos para usar TokenStream.

No usamos directamente el tokenizador en nuestra aplicación, solo necesitamos crear el objeto tokenizador que queremos para los motores de indexación y los motores de búsqueda. Pero cuando elegimos un tokenizador, necesitamos probar el efecto del tokenizador, y necesitamos saber cómo usar el tokenizador TokenStream obtenido.

Pasos de uso:

  • 1. Obtenga el objeto de atributo que desea obtener del tokenStream (la información se almacena en el objeto de atributo)
  • 2. Llame al método reset () de tokenStream para reiniciar. Porque tokenStream se reutiliza.
  • 3. Llame al incrementToken () de tokenStream en un bucle, uno por uno, hasta que devuelva falso
  • 4. Saque el valor de atributo que desee para cada subelemento del bucle.
  • 5. Llame a end () de tokenStream para ejecutar el procesamiento final requerido por la tarea.
  • 6. Llame al método close () de tokenStream para liberar los recursos ocupados.

Pensando: tokenStream es un modo de decorador, ¿cómo funciona este reset / incrementToken / end / close? Verifique el código fuente de tokenStream / Tokenizer / TokenFilter.

Implementación simple de nuestro propio analizador, descripción de requisitos

Tokenizer: Realice la segmentación de palabras en inglés por caracteres en blanco. La información de atributo que debe registrarse es: palabra

TokenFilter: procesamiento a realizar: convertido a minúsculas

Nota: Cuando se utiliza tokenizer para la segmentación de palabras, lee un carácter del flujo de caracteres y determina si es un carácter en blanco para la segmentación de palabras.

Pensamiento: Tokenizer es un objeto AttributeSource y TokenFilter es un objeto AttributeSource. En estas dos nuestras propias clases de implementación, ambos llamamos al método addAttribute. ¿Cómo es que solo hay un objeto de atributo? Consulte el código fuente para encontrar la respuesta.

resumen

A través del estudio de API y código fuente, siente algunas de las ideas de diseño del autor.

  • 1. ¿Cómo maneja los cambios y cambios, como el diseño de Analyzer y TokenStream?
  • 2. ¿Cómo lidia con el problema de que diferentes tokenizadores tienen diferentes lógicas de procesamiento?

 

El tokenizador proporcionado por Lucene

Segmentación de palabras en inglés de StandardAnalyzer en el módulo principal de Lucene

Vea qué información de atributos analiza y almacena, pruebe su efecto de segmentación de palabras en inglés, el efecto de segmentación de palabras en chino

Dispositivo de segmentación de palabras chinas de Lucene SmartChineseAnalyzer

<!-- Lucene提供的中文分词器模块,lucene-analyzers-smartcn -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers-smartcn</artifactId>
    <version>7.3.0</version>
</dependency>

Prueba su efecto de segmentación de palabras en chino e inglés

El tokenizador proporcionado en el paquete común de Lucene-Analyzers

Vea qué tokenizadores hay

Integración de IKAnalizer

IKAnalyzer es un segmentador de palabras chinas ligero y de código abierto con muchas aplicaciones

Primero se desarrolló para su uso en Lucene y luego se convirtió en un componente de segmentación de palabras independiente. Solo brinde soporte a la versión Lucene 4.0. Necesitamos una integración simple para usar Lucene en la versión 4.0 y posteriores.

<!-- ikanalyzer 中文分词器  -->
<dependency>
    <groupId>com.janeluo</groupId>
    <artifactId>ikanalyzer</artifactId>
    <version>2012_u6</version>
    <exclusions>
    <exclusion>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-core</artifactId>
    </exclusion>
    <exclusion>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    </exclusion>
    <exclusion>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-analyzers-common</artifactId>
    </exclusion>
    </exclusions>
</dependency>

<!--  lucene-queryparser 查询分析器模块 -->
<dependency>
    <groupId>org.apache.lucene</groupId>
    <artifactId>lucene-queryparser</artifactId>
    <version>7.3.0</version>
</dependency>

La integración es necesaria porque la API del método createComponents de Analyzer ha cambiado.

Pasos de integración

1. Busque la clase de soporte de Lucene proporcionada por el cuerpo del paquete IkAnalyzer y compare el método createComponets de IKAnalyzer.

2. Cree una nueva versión de acuerdo con estas dos clases, copie el código en la clase directamente y modifique los parámetros.

IKAnalyzer proporciona dos modos de segmentación de palabras: segmentación de palabras de grano fino y segmentación de palabras inteligente, según sus parámetros de construcción.

Después de la integración, pruebe el efecto de la segmentación detallada de palabras y la segmentación inteligente de palabras.

Oración de prueba: Lo que dijo Zhang San es cierto

Compare IKAnalyzer y SmartChineseAnalyzer

Oración de prueba: Lo que dijo Zhang San es cierto. Lucene es un kit de desarrollo de motor de búsqueda de código abierto basado en Java.

Amplíe las palabras vacías de IKAnalyzer

Hay pocas palabras vacías predeterminadas en Ik y, a menudo, necesitamos extenderlas. Puede descargar palabras vacías relativamente completas desde la URL: https://github.com/cseryp/stopwords.

Pasos de expansión de palabras vacías en Ik:

1. Cree el archivo de configuración de IK en el directorio de clases: IKAnalyzer.cfg.xml

2. Agregue un nodo para configurar el archivo extendido de palabras vacías en el archivo de configuración: <entry key = "ext_stopwords"> my_ext_stopword.dic </entry> Si hay más de uno, sepárelos con ";" 3. Cree el nuestro en el directorio de categorías Expanda el archivo de palabras vacías my_ext_stopword.dic 4. Edite el archivo para agregar palabras vacías, una por línea

Expandir el diccionario de IKAnalyzer

Cada año se generan muchas palabras nuevas, los pasos para agregar nuevas palabras al diccionario segmentador de palabras:

1. En el archivo de configuración IK en el directorio de categorías: IKAnalyzer.cfg.xml, agregue un nodo para configurar el archivo de palabras extendidas: <entry key = "ext_dict"> ext.dic </entry> Si hay más de uno, separar con ";"

2. Cree el archivo de palabras extendidas ext.dic en el directorio de clases.

Tenga en cuenta que si el archivo está codificado en UTF-8

4. Edite el archivo para agregar nuevas palabras, una por línea

Sentencia de prueba: ¡Una vez que mi país fue transmitido, fue elogiado por todas las partes y despertó fuertemente el patriotismo y el orgullo de la gente del país! Nuevas palabras: asombroso mi país

 Ejemplo de archivo IKAnalyzer.cfg.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">  
<properties>  
<comment>IK Analyzer 扩展配置</comment>
<!--用户可以在这里配置自己的扩展字典 -->
<entry key="ext_dict">ext.dic</entry> 

<!--用户可以在这里配置自己的扩展停止词字典-->
<entry key="ext_stopwords">my_ext_stopword.dic</entry>
</properties>

 

Supongo que te gusta

Origin blog.csdn.net/qq_34050399/article/details/112386297
Recomendado
Clasificación