Unicode-Segmentierungsalgorithmus
Die Unicode-Segmentierungsalgorithmen sind eine Gruppe von Algorithmen, die das Unicode-Konsortium zur Zerlegung eines Textes in Segmente, etwa Wörter, veröffentlicht. Die Algorithmen finden in einem Text die Stellen, an denen er in Segmente aufgeteilt werden kann, und können zum Beispiel in Textverarbeitungsprogrammen eingesetzt werden, um Cursorbewegungen zu kontrollieren, das wortweise Markieren zu steuern und Ähnliches. Die Algorithmen sind dabei bewusst allgemein gehalten, um in möglichst vielen Sprachen gut zu funktionieren. Dies kann dazu führen, dass die gefundenen Grenzen nicht immer den Erwartungen entsprechen und entsprechende Anpassungen der Algorithmen nötig sind. Eine Reihe von sprachspezifischen Anpassungen bietet das Common Locale Data Repository.
Geschichte
Autor des Standard-Anhangs 29, der verschiedene Segmentierungsalgorithmen beschreibt, ist Mark Davis. Der erste Entwurf wurde am 11. März 2001 veröffentlicht,[1] die erste als Standard anerkannte Version am 17. April 2003.[2] Zum Stand November 2012 liegen die Algorithmen in der Version 21 vor.[3]
Zeichen
Die Zeichen im Sinne von Codepunkten entsprechen nicht immer den Zeichen aus Benutzersicht, den Graphemen. Dies tritt vor allem bei kombinierenden Zeichen auf: So wird ein Buchstabe gefolgt von einem kombinierenden diakritischen Zeichen ebenso als ein Zeichen wahrgenommen, wie koreanische Silbenblöcke oder indische Schriftzeichen, die in Unicode ebenfalls mit kombinierenden Zeichen gebildet werden.
Der Standard beschreibt zwei verschiedene Algorithmen, um einen Text in einzelne Grapheme zu zerlegen, von denen der eine aber vor allem der Abwärtskompatibilität dient.
Beide Algorithmen greifen auf die Eigenschaft Grapheme_Cluster_Break
zurück. Anhand mehrerer Regeln wird schrittweise bestimmt, an welchen Stellen ein Graphem endet, bzw. nicht endet. Diese Regeln nennen dafür mögliche Kombinationen von Werten der Grapheme_Cluster_Break
-Eigenschaft, die zwei aufeinander folgender Zeichen haben können und geben an, ob in diesem Fall zwischen den beiden Zeichen eine Graphemgrenze liegt oder nicht.
Für die Implementierung können verschiedene Wege gewählt werden, etwa das Nachschlagen in einer Lookup-Tabelle oder die Bestimmung mittels eines regulären Ausdrucks.
Der ursprüngliche Algorithmus verwendete die beiden Eigenschaften Grapheme_Base
und Grapheme_Extend
. Die erste ging in der Eigenschaft Grapheme_Cluster_Break
auf, die zweite erwies sich als unpraktisch und wird nicht mehr verwendet.
Wörter
Ähnlich geht der Algorithmus zur Bestimmung von Wortgrenzen vor. Die Eigenschaft Word_Break
legt fest, wie sich ein Zeichen bei der Zerlegung des Textes in Wörter verhält, eine Reihe von Regeln bestimmt, bei welchen Kombination eine Wortgrenze erkannt wird. Allerdings gibt es hier Fälle, in denen nicht nur zwei benachbarte Zeichen berücksichtigt werden, sondern eine größere Umgebung.
Der Algorithmus erfordert in vielen Fällen Anpassungen an die verwendete Sprache. Dies ist vor allem bei Sprachen der Fall, die keine Leerzeichen verwenden. Problematisch ist auch die Frage, ob und wann Bindestriche und Apostrophe als Worttrenner fungieren sollen.
Zerlegt man den Text an den ermittelten Wortgrenzen, so ergeben sich nicht nur einzelne Wörter, auch Zahlen und einzelne Satzzeichen werden gefunden. Je nach Anwendung – etwa beim Zählen der Wörter in einem Text – müssen also noch alle vom Algorithmus gefundenen Wörter, die keinen Buchstaben enthalten, aussortiert werden.
Beispiel
Für eine beispielhafte Anwendung des Algorithmus dient der Satz:
Der „schnelle“ Läufer benötigte 2,5 Minuten für die Strecke.
Der Algorithmus sieht zunächst ein Wortende am Anfang und am Ende des Textes vor. Zwischen zwei Buchstaben gibt es keine Wortgrenze, ebenso nicht zwischen Ziffern und Zeichen, die innerhalb von Zahlen vorkommen können, wie in diesem Fall das Komma. An allen anderen Stellen findet der Algorithmus eine Wortgrenze. Der Satz wird also folgendermaßen zerlegt:
Der „schnelle“ Läufer benötigte 2,5 Minuten für die Strecke.
Sätze
Analog funktioniert die Zerlegung eines Textes in Sätze. Auch hier gibt es mit Sentence_Break
eine Eigenschaft, die von einer Reihe von Regeln verwendet wird, um Satzgrenzen zu ermitteln. Probleme existieren vor allem bei der Unterscheidung, ob ein Punkt in einer Abkürzung steht oder ob er den Satz beendet. Auch die Zeichensetzung in direkter Rede bereitet in einigen Sprachen Schwierigkeiten.
Zeilen
Für die Bestimmung der Stellen, an denen ein Text in Zeilen umbrochen werden kann, gibt es mit dem Unicode-Zeilenumbruch-Algorithmus einen separat definierten Algorithmus.
Einzelnachweise
- Version 1 des Unicode Standard Annex #29: Unicode Text Segmentation
- Version 4 des Unicode Standard Annex #29: Unicode Text Segmentation
- Version 21 des Unicode Standard Annex #29: Unicode Text Segmentation
Weblinks
- Offizielle Formulierung der Algorithmen (englisch)
- Demonstration der Algorithmen (englisch)
- Boundary Analysis im ICU User Guide (englisch)