2010-11-05 16 views
10

Ich bin auf der Suche nach Java-Bibliothek, die "Normalisierung" von Text ermöglichen. Etwas Ähnliches wie Standart Normalizer, aber breiter (etwas wie utf8proc LUMP).Java-Bibliothek für Text Normalisierung

Es sollte alle Arten von Sonderzeichen zu ASCII-Äquivalenten (wenn es natürlich möglich ist) ersetzen. Alle Varianten von Speicherplatz zu Code 32, alle Varianten von Minus (lang, kurz, dünn, etc) zu Code 45 und so weiter.

+0

PS: Sieht aus wie ich es implementieren muss. Irgendwelche Ideen, wie es geht? – valodzka

Antwort

2

Sie sollten sich die Latin-ASCII Transformation in CLDR ansehen. Es wird in ICU 4.6 sein

+0

Vielen Dank, sehen Sie wie eine gute Lösung – valodzka

+1

Der Latein-ASCII Transliterator ging in ICU 4.6/CLDR 1.9. –

1

Haben Sie icu4js Normalizer angeschaut?

normalize wandelt Unicode-Text in eine äquivalente, zusammengesetzte oder zerlegte Form um, was das Sortieren und Suchen von Text erleichtert. normalize unterstützt die Standardnormalisierungsformen, die in Unicode Standard Annex #15 — Unicode Normalization Forms beschrieben sind.

+0

Ja, ich habe es überprüft. Standardmäßig tut es nicht, was ich brauche. Ich habe auf Normalizer2 (http://icu-project.org/apiref/icu4j/com/ibm/icu/text/Normalizer2.html) geschaut, es kann konfiguriert werden, aber es ist keine einfache Aufgabe. – valodzka

4

Ihre spezifischen Anforderungen sind etwas vage, aber ich nehme an, Sie etwas wollen, das tut, was Normalizer tut, aber mit dem Merkmal einen Topf zu werfen bestimmte Unicode-Codepunkte auf ein Zeichen - ähnlich wie utf8proc.

ich gehen würde, für einen 2-Schritt-Ansatz:

  1. Erster Einsatz Normalizer.normalize zu schaffen, was auch immer (de-) Zusammensetzung Sie
  2. dann durch die Codepunkte des Ergebnisses durchlaufen und ersetzen Sie die Zeichen vereinigen so wie es dir gefällt.

Beide sollten einfach sein. Wenn Sie sich mit Zeichen aus dem Basic Multilingual Pane befassen, durchlaufen Sie für 2 die Codepunkte mit einem appropriate algorithm for doing so. Wenn Sie nur BMP-Codepunkte verwenden, durchlaufen Sie einfach die Zeichen.

Für die Zeichen, die Sie über einen Kamm scheren möchten, erstellen Sie eine Substitutionsdatenstruktur für das Mapping ununified Codepunkt ->einheitliche Code-Punkt. Map<Character, Character> oder Map<Integer, Integer> dafür in den Sinn kommen. Füllen Sie die Ersatzkarte nach Ihren Wünschen, z. indem man die Information von utf8procs klump.txt und eine Quelle für character categories nimmt.

Map<Character, Character> LUMP; 

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

Erstellen Sie einen neuen StringBuilder oder etwas ähnliches mit der gleichen Größe wie Ihre normalisierte Zeichenfolge. Überprüfen Sie bei der Iteration über die Codepunkte, ob LUMP.get(codePoint) nicht null ist. Fügen Sie in diesem Fall den zurückgegebenen Wert hinzu, andernfalls fügen Sie den Codepunkt zum StringBuilder hinzu. Das sollte es sein.

Bei Bedarf können Sie eine Möglichkeit zum Laden des Inhalts von LUMP aus einer Konfiguration unterstützen, z. von einem Properties Objekt.