Version 5 (modified by 14 years ago) (diff) | ,
---|
Normalisierung
Zusammenfassung
Abschnitt 1 beschreibt die Normalisierungsregeln in Arboreal und im Backend im Detail. In Abschnitt 2 werden diese Regeln diskutiert. Abschnitt 3 beschreibt, in welchen Situationen diese Regeln angewendet werden. In Abschnitt 4 beschreibe ich, wie bei uns normalisiert werden soll. Abschnitt 5 listet auf, was dafür konkret zu tun ist.
1. Wie werden Wörter zurzeit normalisiert?
Im folgenden gehe ich alle Sprachen einzeln durch. Zuerst werden jeweils die Normalisierungen in der Arboreal-Klasse OrthographicRules aufgelistet, danach werden die Änderungen in der Backend-Klasse MpdlNormalizer aufgelistet. Abschnitt 1 kann auch übersprungen werden.
In den Tabellen wird immer zuerst die normalisierte Form genannt, und dann alle Formen, die in dieselbe Form normalisiert werden. Beispiel:
ae | æ (00E6) ę (0119) |
bedeutet, dass æ und ę zu ae normalisiert werden. "--" bedeutet, dass die Form ganz getilgt wird. Bei combining characters habe ich jeweils ein o dazugemacht, damit man den combining character besser erkennen kann.
Latein
i | j |
u | v |
que | q; |
";" wird getilgt, wenn das Zeichen direkt davor kein Buchstabe ("Character.isLetter") ist.
Malcolm: Linguistic note: /u/ and /v/ are rarely phonemic in Latin, as in
- alui 's/he nourished' vs. alvi 'of a belly',
- volui 's/he wished' or 'it rolled' vs. volvi 'to be rolled',
- (in)seruit 's/he joined together' vs. (in)servit 's/he serves'.
-- | combining ò (0300) combining ó (0301) combining ô (0302) soft hyphen (00AD) |
A | À (00C0) Á (00C1) Â (00C2) Ä (00C4) Ā (0100) Ă (0102) |
Ae | Æ (00C6) Ę (0118) |
C | Ç (00C7) |
E | È (00C8) É (00C9) Ê (00CA) Ë (00CB) Ē (0112) Ĕ (0114) |
I | Ì (00CC) Í (00CD) Î (00CE) Ï (00CF) Ī (012A) Ĭ (012C) |
O | Ò (00D2) Ó (00D3) Ô (00D4) Ö (00D6) Ō (014C) Ŏ (014E) |
Oe | Œ (0152) |
U | Ù (00D9) Ú (00DA) Û (00DB) Ü (00DC) Ū (016A) Ŭ (016C) |
a | à (00E0) á (00E1) â (00E2) ä (00E4) ā (0101) ă (0103) |
ae | æ (00E6) ę (0119) |
c | ç (00E7) |
e | è (00E8) é (00E9) ê (00EA) ë (00EB) ē (0113) ĕ (0115) |
i | ì (00EC) í (00ED) î (00EE) ï (00EF) ī (012B) ĭ (012D) |
o | ò (00F2) ó (00F3) ô (00F4) ö (00F6) ō (014D) ŏ (014F) |
oe | œ (0153) |
s | ſ (017F) |
ss | ß (00DF) |
u | ù (00F9) ú (00FA) û (00FB) ü (00FC) ū (016B) ŭ (016D) |
-- | 〈 (2329) 〉 (232A) |
Beachte: Zirkumflex (z.B. û 00FB, ê 00EA) wird normalisiert, aber nicht Tilde (z.B. ũ 0169, ẽ 1EBD)
Backend zusätzlich:
e | Ḕ (1E14) ḕ (1E15) Ḗ (1E16) ḗ (1E17) Ḙ (1E18) ḙ (1E19) Ḛ (1E1A) ḛ (1E1B) Ḝ (1E1C) ḝ (1E1D) Ẹ (1EB8) ẹ (1EB9) Ẻ (1EBA) ẻ (1EBB) Ẽ (1EBC) ẽ (1EBD) Ế (1EBE) ế (1EBF) Ề (1EC0) ề (1EC1) Ể (1EC2) ể (1EC3) Ễ (1EC4) ễ (1EC5) Ệ (1EC6) ệ (1EC7) |
Insbesondere wird jetzt auch ẽ (1EBD) normalisiert.
Italienisch
Regeln:
- u wird zu v, wenn direkt davor und danach ein Vokal (d.h. A E I O U Æ Œ in groß/klein) steht (hyphen/soft hyphen davor wird übersprungen)
- j: ij wird zu ii
- v wird zu u, wenn direkt davor und danach ein Konsonant (d.h. B C D F G H K L M N P Q R S T V W X Z in groß/klein sowie ſ ß) steht (hyphen/soft hyphen danach wird übersprungen), außerdem am Anfang eines Wortes oder wenn direkt davor kein Buchstabe ist
- t: tio wird zu zio (i und o können auch groß sein)
- h am Wortanfang wird getilgt, außer bei hai, hanno, ho* ('h' only appears at the beginning of some pres. indic. forms of 'avere' -- with the exception of some unimportant loanwords in modern Italian (which I choose to ignore))
- hyphen/soft hyphen wird vor whitespace getilgt, soft hyphen wird durch hyphen ersetzt
Diese Regeln normalisieren in Richtung der heutigen italienischen Orthographie. Beachte den Unterschied zur einfachen Regel "v wird u" im Lateinischen.
Wortanfang definiert als whitespace oder ’ (2019) oder \
Programmfehler bei "v" (falsch, richtig):
while ((((c_n = s.charAt(y)) == '-') || (c_n == '\u00ad')) && (y++ > 0)); while ((((c_n = s.charAt(y)) == '-') || (c_n == '\u00ad')) && (y++ < s.length() - 1));
Ae | Æ (00C6) |
Oe | Œ (0152) |
ae | æ (00E6) |
oe | œ (0153) |
s | ſ (017F) |
ss | ß (00DF) |
À (00C0) | Á (00C1) |
È (00C8) | É (00C9) |
Ì (00CC) | Í (00CD) |
Ò (00D2) | Ó (00D3) |
Ù (00D9) | Ú (00DA) |
à (00E0) | á (00E1) |
è (00E8) | é (00E9) |
ì (00EC) | í (00ED) |
ò (00F2) | ó (00F3) |
ù (00F9) | ú (00FA) |
also:
- Diphthongzeichen aufgelöst, ſ und ß (Teilmenge der Regeln für Latein)
- Gravis wird zu Akut (anders als bei Latein)
Backend:
Regeln für u, j, v, t, h, hyphen nicht übertragen wegen Programmfehler(n)
stattdessen die lateinischen Regeln übernommen (allerdings ohne j, v, "q;", ";", combining characters, soft hyphen, 〈 〉). Die zusätzlichen e-Varianten sind ebenfalls nicht übernommen, stattdessen eine neue Regel "ẍ (1E8D) wird zu e" (gemeint ist ẽ (1EBD), was auch in den zusätzlichen Regeln für Latein vorkommt).
Englisch
Englisch fehlt in Arboreal.
Backend: wie bei Latein; wieder ohne j, v, "q;", ";", aber mit combining characters, soft hyphen, 〈 〉. Wieder zusätzlich mit ẍ (1E8D).
Französisch
Regeln für u und v genau wie bei Italienisch, mit dem gleichen Programmfehler.
-- | hyphen (002D) soft hyphen (00AD) |
ae | æ (00E6) |
s | ſ (017F) |
ss | ß (00DF) |
Beachte: œ wird nicht normalisiert.
Backend: Regeln für u und v weggelassen. Ansonsten wie bei Arboreal.
Deutsch
In Arboreal eine andere Definition für Wortanfang ("beginWord") als zum Beispiel im Italienischen: nach Whitespace und . , : ; ? ! ( < [ ' " ‘ “ (wird nur dafür verwendet, das Wort ab dem zweiten Buchstaben in Kleinbuchstaben umzuwandeln)
-- | hyphen (002D) soft hyphen (00AD) |
Ae | Ä (00C4) |
Oe | Ö (00D6) |
Ue | Ü (00DC) |
ae | ä (00E4) |
e | é (00E9) |
oe | ö (00F6) |
ss | ß (00DF) |
ue | ü (00FC) |
Backend: genauso
Chinesisch
" " | " " (3000) |
, | 、 (3001) |
. | 。 (3002) |
1 | ¹ (00B9) |
2 | ² (00B2) |
3 | ³ (00B3) |
4 | ⁴ (2074) |
5 | ⁵ (2075) |
Die Zeile, die ZWS (200B) tilgt, ist auskommentiert mit dem Kommentar "BREAKS EVERYTHING!"
Backend: Genauso, allerdings sind die Zeilen für " " (3000) 、(3001) 。(3002) als Folge von Ticket #32 auskommentiert.
Arabisch
Trage ich bei Interesse nach.
(fehlt im Backend)
Keilschrift
Das meint:
- akk: Akkadisch/Akkadian
- sux: Sumerisch/Sumerian
- elx: Elamisch/Elamite
- hit: Hethitisch/Hittite
- ura: Urartäisch/Urartian? (ISO 639-3: ura ist eine Amazonas-Sprache (Urarina), Urartäisch ist xur)
- peo: Altpersisch/Old Persian
- uga: Ugaritisch/Ugaritic
- qam: local use
- qcu: local use
- qhu: local use
- qpc: local use
Trage ich bei Interesse nach.
(Backend: wie bei Arboreal)
Griechisch
σ (03C3) | ς (03C2) |
-- | < > [ ] 1 2 |
ά (1F71) | ά (03AC) |
έ (1F73) | έ (03AD) |
ή (1F75) | ή (03AE) |
ί (1F77) | ί (03AF) |
ό (1F79) | ό (03CC) |
ύ (1F7B) | ύ (03CD) |
ώ (1F7D) | ώ (03CE) |
-- | hyphen (002D) soft hyphen (00AD) |
Optisch identisch, aber "Tonos" (der monotonische Akzent im modernen Griechisch) wird zu "Oxia" (der Akut im Altgriechischen).
Tippfehler: \uu1f7d statt \u1f7d bei ώ
Backend: genauso; Tippfehler korrigiert
Griechisch ohne Diakritika
Greek Atonic ("el_atonic") meint, dass alle Diakritika, d.h. Akzente, Spiritus, Trema ("dialytika", ϋ 03CB) und Iota subscriptum/adscriptum, weggelassen werden. Normales modernes Griechisches hat dagegen noch Betonungszeichen (Tonos) bei mehrsilbigen Wörtern.
σ (03C3) | ς (03C2) |
"map characters with diacritics to their plain equivalent":
Α (0391) | Ἀ (1F08) Ἁ (1F09) Ἂ (1F0A) Ἃ (1F0B) Ἄ (1F0C) Ἅ (1F0D) Ἆ (1F0E) Ἇ (1F0F) ᾈ (1F88) ᾉ (1F89) ᾊ (1F8A) ᾋ (1F8B) ᾌ (1F8C) ᾍ (1F8D) ᾎ (1F8E) ᾏ (1F8F) Ὰ (1FBA) Ά (1FBB) ᾼ (1FBC) |
Ε (0395) | Ἐ (1F18) Ἑ (1F19) Ἒ (1F1A) Ἓ (1F1B) Ἔ (1F1C) Ἕ (1F1D) |
Η (0397) | Ἠ (1F28) Ἡ (1F29) Ἢ (1F2A) Ἣ (1F2B) Ἤ (1F2C) Ἥ (1F2D) Ἦ (1F2E) Ἧ (1F2F) ᾘ (1F98) ᾙ (1F99) ᾚ (1F9A) ᾛ (1F9B) ᾜ (1F9C) ᾝ (1F9D) ᾞ (1F9E) ᾟ (1F9F) Ὴ (1FCA) Ή (1FCB) ῌ (1FCC) |
Ι (0399) | Ϊ (03AA) Ἰ (1F38) Ἱ (1F39) Ἲ (1F3A) Ἳ (1F3B) Ἴ (1F3C) Ἵ (1F3D) Ἶ (1F3E) Ἷ (1F3F) Ὶ (1FDA) |
Ο (039F) | Ὀ (1F48) Ὁ (1F49) Ὂ (1F4A) Ὃ (1F4B) Ὄ (1F4C) Ὅ (1F4D) Ί (1FDB) Ὸ (1FF8) Ό (1FF9) |
Ρ (03A1) | Ῥ (1FEC) |
Υ (03A5) | Ϋ (03AB) (1F58) Ὑ (1F59) (1F5A) Ὓ (1F5B) (1F5C) Ὕ (1F5D) (1F5E) Ὗ (1F5F) Ὺ (1FEA) Ύ (1FEB) |
Ω (03A9) | Ὠ (1F68) Ὡ (1F69) Ὢ (1F6A) Ὣ (1F6B) Ὤ (1F6C) Ὥ (1F6D) Ὦ (1F6E) Ὧ (1F6F) ᾨ (1FA8) ᾩ (1FA9) ᾪ (1FAA) ᾫ (1FAB) ᾬ (1FAC) ᾭ (1FAD) ᾮ (1FAE) ᾯ (1FAF) Ὼ (1FFA) Ώ (1FFB) ῼ (1FFC) |
α (03B1) | ἀ (1F00) ἁ (1F01) ἂ (1F02) ἃ (1F03) ἄ (1F04) ἅ (1F05) ἆ (1F06) ἇ (1F07) ὰ (1F70) ά (1F71) ᾀ (1F80) ᾁ (1F81) ᾂ (1F82) ᾃ (1F83) ᾄ (1F84) ᾅ (1F85) ᾆ (1F86) ᾇ (1F87) ᾲ (1FB2) ᾳ (1FB3) ᾴ (1FB4) ᾶ (1FB6) ᾷ (1FB7) |
ε (03B5) | ἐ (1F10) ἑ (1F11) ἒ (1F12) ἓ (1F13) ἔ (1F14) ἕ (1F15) ὲ (1F72) έ (1F73) |
η (03B7) | ἠ (1F20) ἡ (1F21) ἢ (1F22) ἣ (1F23) ἤ (1F24) ἥ (1F25) ἦ (1F26) ἧ (1F27) ὴ (1F74) ή (1F75) ᾐ (1F90) ᾑ (1F91) ᾒ (1F92) ᾓ (1F93) ᾔ (1F94) ᾕ (1F95) ᾖ (1F96) ᾗ (1F97) ῂ (1FC2) ῃ (1FC3) ῄ (1FC4) ῆ (1FC6) ῇ (1FC7) |
ι (03B9) | ϊ (03CA) ἰ (1F30) ἱ (1F31) ἲ (1F32) ἳ (1F33) ἴ (1F34) ἵ (1F35) ἶ (1F36) ἷ (1F37) ὶ (1F76) ί (1F77) ῒ (1FD2) ΐ (1FD3) ῖ (1FD6) ῗ (1FD7) |
ο (03BF) | ό (03CC) ὀ (1F40) ὁ (1F41) ὂ (1F42) ὃ (1F43) ὄ (1F44) ὅ (1F45) ὸ (1F78) ό (1F79) |
ρ (03C1) | ῤ (1FE4) ῥ (1FE5) |
υ (03C5) | ϋ (03CB) ύ (03CD) ὐ (1F50) ὑ (1F51) ὒ (1F52) ὓ (1F53) ὔ (1F54) ὕ (1F55) ὖ (1F56) ὗ (1F57) ὺ (1F7A) ύ (1F7B) ῢ (1FE2) ΰ (1FE3) ῦ (1FE6) ῧ (1FE7) |
ω (03C9) | ώ (03CE) ὠ (1F60) ὡ (1F61) ὢ (1F62) ὣ (1F63) ὤ (1F64) ὥ (1F65) ὦ (1F66) ὧ (1F67) ὼ (1F7C) ώ (1F7D) ᾠ (1FA0) ᾡ (1FA1) ᾢ (1FA2) ᾣ (1FA3) ᾤ (1FA4) ᾥ (1FA5) ᾦ (1FA6) ᾧ (1FA7) ῲ (1FF2) ῳ (1FF3) ῴ (1FF4) ῶ (1FF6) ῷ (1FF7) |
Außerdem
-- | < > [ ] |
-- | hyphen (002D) soft hyphen (00AD) |
(aber nicht 1 und 2)
Außerdem einige fehlerhafte Einträge:
(0381) | ά (03AC) |
΅ (0385) | έ (03AD) |
· (0387) | ή (03AE) |
Ή (0389) | ί (03AF) |
Diese Einträge enthalten denselben Tippfehler; gemeint ist
α (03B1) | ά (03AC) |
ε (03B5) | έ (03AD) |
η (03B7) | ή (03AE) |
ι (03B9) | ί (03AF) |
Diese Regeln sind offenbar nicht oft verwendet worden.
Backend: genauso
Weiteres
In Arboreal werden alle Buchstaben eines Wortes außer dem ersten in Kleinbuchstaben normalisiert. (Ausnahme natürlich u.a. Chinesisch.) In der Backend-Version wurde dies weggelassen.
In der Backend-Version gibt es zusätzlich eine Methode "deNormalizeToRegExpr". Diese Methode erstellt Teile von regexes, die für Latein, Deutsch und Englisch wohl aus einer normalisierten Form alle Wortformen finden soll, die zu dieser Wortform normalisiert werden. Die Implementation scheint allerdings fehlerhaft zu sein. Ein Beispiel: Wasserstraße wird normalisiert zu Wasserstrasse, daraus wird in "deNormalizeToRegExpr" wiederum "Waßerstraße|Wass[eé]rstrass[eé]". Es werden also die Wortformen Waßerstraße, Wasserstrasse, Wassérstrasse, Wasserstrassé und Wassérstrassé gefunden, aber nicht die originale Form Wasserstraße.
2. Was bedeutet das?
Die wichtigste Frage ist, wo die Normalisierungsregeln überhaupt verwendet werden. Siehe dazu Abschnitt 3.
3. Wann wird zurzeit normalisiert?
Die wichtigste Erkenntnis ist, dass die Arboreal-Regeln gar nicht für die Textanzeige gedacht sind, aber im Backend dafür verwendet werden.