2010-11-05 6 views
10

Estoy buscando una biblioteca de Java que permita la "normalización" del texto. Algo similar a standart Normalizer, pero más ancho (algo así como utf8proc LUMP).Biblioteca de Java para la normalización de texto

Debe reemplazar todo tipo de characteres especiales por equivalentes ASCII (si es posible, por supuesto). Todas las variantes de espacio para codificar 32, todas las variantes de mínimos (largos, cortos, delgados, etc.) para codificar 45 y así sucesivamente.

+0

PD: Parece que tengo que implementarlo. ¿Alguna idea de como hacerlo? – valodzka

Respuesta

2

Debería mirar la transformación Latin-ASCII en CLDR. estará en ICU 4.6

+0

Gracias, parece una buena solución – valodzka

+1

El transliterador Latin-ASCII entró en la UCI 4.6/CLDR 1.9. –

1

¿Has mirado en el Normalizer de icu4j?

normalize transforma el texto Unicode en una forma compuesta o descompuesta equivalente, lo que permite ordenar y buscar el texto más fácilmente. normalize admite los formularios de normalización estándar descritos en Unicode Standard Annex #15 — Unicode Normalization Forms.

+0

Sí, lo revisé. Por defecto no hace lo que necesito. He buscado en Normalizer2 (http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html), se puede configurar, pero no es una tarea sencilla. – valodzka

4

sus requisitos específicos son un poco vago, pero supongo que usted quiere una cosa que hace lo hace Normalizer, pero con la característica de agrupar ciertos puntos de código Unicode de un carácter - similar a utf8proc.

Yo iría por un enfoque de 2 pasos:

  1. Primer uso Normalizer.normalize para crear lo (des) composición desea
  2. iterar a través de los puntos de código del resultado y reemplazar unificar los caracteres de la manera que te gusta

Ambos deberían ser sencillos. Para 2, si está tratando con personajes fuera del Panel Multilingüe Básico, repita los puntos de código usando appropriate algorithm for doing so. Si solo está utilizando puntos de código BMP, simplemente itere sobre los caracteres.

Para los caracteres que desea agrupar, crear una estructura de datos de sustitución para el mapeo ununified punto de código -> punto código unificado. Map<Character, Character> o Map<Integer, Integer> vienen a la mente por eso. Rellene el mapa de sustitución a su gusto, p. tomando la información de de utf8proc lump.txt y una fuente para character categories.

Map<Character, Character> LUMP; 

static { 
    LUMP = new HashMap<Character, Character>(); 
    LUMP.put('\u2216', '\\'); // set minus 
    LUMP.put('\u007C', '|'); // divides 
    // ... 
} 

Crea un nuevo StringBuilder o algo similar con el mismo tamaño que tu cadena normalizada. Al iterar sobre los puntos de código, verifique si LUMP.get(codePoint) no es nulo. En este caso, agregue el valor devuelto, de lo contrario agregue el punto de código a StringBuilder. Eso debería ser.

Si es necesario, puede admitir una forma de cargar los contenidos de LUMP desde una configuración, p. de un objeto Properties.

Cuestiones relacionadas