wiki:normalization/1

Regularisierung und Normalisierung, I: 1 2 3, II: 4 5 6 7

1. Wie werden Wörter zurzeit normalisiert?

In Arboreal wird jede Sprache getrennt normalisiert. Im folgenden gehe ich die 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 (siehe auch hier) 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 den combining character besser erkennen kann.

Ersetzungsregeln

In Arboreal wird zuerst die Groß- und Kleinschreibung normalisiert: Alle Buchstaben eines Wortes außer dem ersten werden zu Kleinbuchstaben, und zwar bei Sprachen auf Basis des lateinischen Alphabets und bei Griechisch. In der Backend-Version wurde dies weggelassen.

Die Regeln gehen dann so vor: Ein Wort wird Buchstabe für Buchstabe durchgegangen. Es wird entschieden, wodurch jeder Buchstabe ersetzt werden soll, und daraus ein neues Wort zusammengesetzt.

  • Die meisten Buchstaben werden durch sich selbst ersetzt, d.h. es gibt keine Änderung. Beispiel: a bleibt a.
  • Es gibt Regeln für Buchstaben-Sequenzen. Beispiel: ij wird im Italienischen zu ii.
  • Die meisten Ersetzungsregeln sind kontextlos. Beispiel: ſ wird im Lateinischen immer durch s ersetzt.
  • Einige Regeln sind kontextabhängig. Es wird entweder geprüft, ob ein Buchstabe am Anfang oder Ende eines Wortes steht, oder was für ein Buchstabe davor oder danach kommt. Beispiel: Im Italienischen wird u zu v, wenn vor und nach dem u ein Vokal ist.
  • Die Regeln beziehen sich immer das Originalwort, d.h. wenn in einem Wort bereits Änderungen gemacht wurden, wissen die Regeln für die nächsten Buchstaben des Wortes noch nichts davon. Beispiel: PARVVS wird erst zu Parvvs, dann wird es buchstabenweise zu Paruus. Nachdem das erste v in u umgewandelt wurde, ist zweite v trotzdem noch zwischen v und s und wird deshalb ebenfalls umgewandelt.

Latein

i j
u v
que q;

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

-- soft hyphen (00AD)
Ae Æ (00C6) Ę (0118)
Oe Π(0152)
ae æ (00E6) ę (0119)
oe œ (0153)
s ſ (017F)
ss ß (00DF)
-- 〈 (2329) 〉 (232A)

ersatzlos entfernte Diakritika:

-- combining ò (0300) combining ó (0301) combining ô (0302)
A À (00C0) Á (00C1) Â (00C2) Ä (00C4) Ā (0100) Ă (0102)
E È (00C8) É (00C9) Ê (00CA) Ë (00CB) Ē (0112) Ĕ (0114)
I Ì (00CC) Í (00CD) Î (00CE) Ï (00CF) Ī (012A) Ĭ (012C)
O Ò (00D2) Ó (00D3) Ô (00D4) Ö (00D6) Ō (014C) Ŏ (014E)
U Ù (00D9) Ú (00DA) Û (00DB) Ü (00DC) Ū (016A) Ŭ (016C)
a à (00E0) á (00E1) â (00E2) ä (00E4) ā (0101) ă (0103)
e è (00E8) é (00E9) ê (00EA) ë (00EB) ē (0113) ĕ (0115)
i ì (00EC) í (00ED) î (00EE) ï (00EF) ī (012B) ĭ (012D)
o ò (00F2) ó (00F3) ô (00F4) ö (00F6) ō (014D) ŏ (014F)
u ù (00F9) ú (00FA) û (00FB) ü (00FC) ū (016B) ŭ (016D)
C Ç (00C7)
c ç (00E7)

Das Zirkumflex (z.B. û 00FB, ê 00EA) wird normalisiert, aber nicht die 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 für u/v:

  • 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)
  • 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). Am Anfang eines Wortes oder wenn direkt davor kein Buchstabe ist, reicht ein Konsonant danach.

Die Regeln für u/v stehen im Gegensatz zur einfachen Regel "v wird zu u" im Lateinischen. Lateinische Beispiele für Malcolms Algorithmus (zusammen mit den Regeln für ſ und für Großbuchstaben):

vnum unum
diuerſarum diversarum
DIVERSARVM Diversarum
PARVVS Paruus
octauum octavum
loquuti loquuti
QVI Qvi (!)

(beachte: korrekt wäre parvus)

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

weitere Regeln:

  • j: ij wird zu ii
  • 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

Wortanfang definiert als whitespace oder ’ (2019) oder \

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

Niederländisch

Für Niederländisch gibt es weder in Arboreal noch im Backend Normalisierungsregeln.

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). (Vorsicht: Das Trac-Wiki wandelt α mit Oxia in α mit Tonos um! Das Problem kann aber auch eine Umwandlung in der Mac-Zwischenablage sein.)

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)

Weiterer Tippfehler bei Ί (1FDB).

Die Codepoints 1F58, 1F5A, 1F5C, 1F5E in der Klasse von Υ sind im Gegensatz zu 1F59, 1F5B, 1F5D, 1F5F in Unicode nicht belegt, denn Υ mit Spritus lenis ("psili") gibt es nicht.

Backend: genauso

Weiteres

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. (Siehe auch die Word-information-Seite von wasserstrasse, wo an das DWDS die Form waßerstraße geschickt und deshalb nicht gefunden wird.)

Last modified 13 years ago Last modified on Jul 22, 2011, 9:32:00 AM

Attachments (2)

Download all attachments as: .zip