2010-11-05 14 views
10

Sto cercando la libreria java che consente la "normalizzazione" del testo. Qualcosa di simile allo standard Normalizer, ma più ampio (qualcosa come utf8proc LUMP).Libreria Java per normalizzazione del testo

Dovrebbe sostituire tutti i tipi di caratteri speciali in equivalenti ASCII (se possibile, ovviamente). Tutte le varianti di spazio al codice 32, tutte le varianti di minuses (long, short, thin, ecc.) Al codice 45 e così via.

+0

PS: sembra che devo implementarlo. Qualche idea su come farlo? – valodzka

risposta

2

Si dovrebbe guardare la trasformazione Latin-ASCII in CLDR. sarà in ICU 4.6

+0

Grazie, sembra una buona soluzione – valodzka

+1

Il traslitteratore latino-ASCII è entrato in ICU 4.6/CLDR 1.9. –

1

Hai esaminato il numero Normalizer di icu4j?

normalize trasforma il testo Unicode in una forma composta o scomposta equivalente, consentendo un più facile ordinamento e ricerca del testo. normalize supporta i moduli di normalizzazione standard descritti in Unicode Standard Annex #15 — Unicode Normalization Forms.

+0

Sì, l'ho controllato. Di default non fa quello che mi serve. Ho cercato su Normalizer2 (http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html), può essere configurato, ma non è un compito semplice. – valodzka

4

esigenze specifiche sono un po 'vago, ma suppongo che si vuole una cosa che fa quello Normalizer fa, ma con la caratteristica di grumo insieme alcuni punti di codice Unicode per un carattere - simile a utf8proc.

vorrei andare per un approccio 2-step:

  1. Primo utilizzo Normalizer.normalize per creare qualunque cosa (de-) composizione che desiderate
  2. Poi scorrere i punti di codice del risultato e sostituire unificare i caratteri il modo in cui ti piace

Entrambi devono essere semplici. Per 2, se si utilizzano caratteri fuori dal riquadro multilingue di base, quindi scorrere i punti di codice utilizzando uno appropriate algorithm for doing so. Se si utilizzano solo punti di codice BMP, quindi semplicemente scorrere i caratteri.

Per i personaggi che si desidera grumo insieme, creare una struttura di dati di sostituzione per la mappatura ununified punto di codice ->punto codice unificato. Map<Character, Character> o Map<Integer, Integer> vengono in mente per questo. Compila la mappa di sostituzione a tuo piacimento, ad es. prendendo le informazioni da utf8proc's lump.txt e una fonte per character categories.

Map<Character, Character> LUMP; 

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

Creare un nuovo StringBuilder o qualcosa di simile con le stesse dimensioni della stringa normalizzata. Quando si esegue l'iterazione sui punti del codice, verificare se LUMP.get(codePoint) non è nullo. In questo caso, aggiungi il valore restituito, altrimenti aggiungi il punto di codice a StringBuilder. Questo dovrebbe essere.

Se necessario, è possibile supportare un modo di caricare il contenuto di LUMP da una configurazione, ad es. da un oggetto Properties.