wiki:normalization

Version 1 (modified by Wolfgang Schmidle, 14 years ago) (diff)

--

Normalisierung

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.java aufgelistet, danach werden die Änderungen in der Backend-Klasse MpdlNormalizer.java aufgelistet.

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 es besser erkennen kann.

Latein

i j
u v
que q;

";" wird getilgt, wenn das Zeichen direkt davor kein Buchstabe ("Character.isLetter") ist.

-- 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)

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)

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 in 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

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)

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 wird zu Oxia.

Tippfehler: \uu1f7d statt \u1f7d bei ώ

Backend: genauso; Tippfehler korrigiert

Griechisch ohne Akzente

Greek Atonic ("el_atonic"") meint, dass alle Akzente und Spiritus weggelassen werden. Normales modernes Griechisches hat dagegen noch Betonungszeichen (Oxia) bei mehrsilbigen Wörtern.

σ (03C3) ς (03C2)

"map characters with diacritics to their plain equivalent":

΁ (0381) ά (03AC)
΅ (0385) έ (03AD)
· (0387) ή (03AE)
Ή (0389) ί (03AF)
Α (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)

Einträge wie

΁ (0381) ά (03AC)
΅ (0385) έ (03AD)
· (0387) ή (03AE)
Ή (0389) ί (03AF)

sind sehr wahrscheinlich falsch. 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.) Dies fehlt in der Backend-Version.

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, Wassérstrasse und Wassérstrassé gefunden, aber nicht die originale Form Wasserstraße.

2. Und was bedeutet das?

Die wichtigeste 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.