[[PageOutline(1-4,,pullout)]] == 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 [attachment:OrthographicRules.java OrthographicRules] aufgelistet, danach werden die Änderungen in der Backend-Klasse [attachment:MpdlNormalizer.java MpdlNormalizer] (siehe auch [source:hg/software/eXist/mpdl-modules/src/de/mpg/mpiwg/berlin/mpdl/lt/analyzer/MpdlNormalizer.java 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. === 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) [[BR]] Ḝ (1E1C) ḝ (1E1D) Ẹ (1EB8) ẹ (1EB9) Ẻ (1EBA) ẻ (1EBB) Ẽ (1EBC) ẽ (1EBD) [[BR]] Ế (1EBE) ế (1EBF) Ề (1EC0) ề (1EC1) Ể (1EC2) ể (1EC3) Ễ (1EC4) ễ (1EC5) [[BR]] Ệ (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: || vnum || unum || || diuerſarum || diversarum || || DIVERSARVM || DIVERSARUM || || PARVVS || PARUUS || || octauum || octavum || || loquuti || loquuti || 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 === 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 [https://it-dev.mpiwg-berlin.mpg.de/tracs/mpdl-project-software/ticket/32 #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) [[BR]] ᾈ (1F88) ᾉ (1F89) ᾊ (1F8A) ᾋ (1F8B) ᾌ (1F8C) ᾍ (1F8D) ᾎ (1F8E) ᾏ (1F8F) [[BR]] Ὰ (1FBA) Ά (1FBB) ᾼ (1FBC) || || Ε (0395) || Ἐ (1F18) Ἑ (1F19) Ἒ (1F1A) Ἓ (1F1B) Ἔ (1F1C) Ἕ (1F1D) || || Η (0397) || Ἠ (1F28) Ἡ (1F29) Ἢ (1F2A) Ἣ (1F2B) Ἤ (1F2C) Ἥ (1F2D) Ἦ (1F2E) Ἧ (1F2F) [[BR]] ᾘ (1F98) ᾙ (1F99) ᾚ (1F9A) ᾛ (1F9B) ᾜ (1F9C) ᾝ (1F9D) ᾞ (1F9E) ᾟ (1F9F) [[BR]] Ὴ (1FCA) Ή (1FCB) ῌ (1FCC) || || Ι (0399) || Ϊ (03AA) Ἰ (1F38) Ἱ (1F39) Ἲ (1F3A) Ἳ (1F3B) Ἴ (1F3C) Ἵ (1F3D) Ἶ (1F3E) [[BR]] Ἷ (1F3F) Ὶ (1FDA) || || Ο (039F) || Ὀ (1F48) Ὁ (1F49) Ὂ (1F4A) Ὃ (1F4B) Ὄ (1F4C) Ὅ (1F4D) Ί (1FDB) Ὸ (1FF8) [[BR]] Ό (1FF9) || || Ρ (03A1) || Ῥ (1FEC) || || Υ (03A5) || Ϋ (03AB) ὘ (1F58) Ὑ (1F59) ὚ (1F5A) Ὓ (1F5B) ὜ (1F5C) Ὕ (1F5D) ὞ (1F5E) [[BR]] Ὗ (1F5F) Ὺ (1FEA) Ύ (1FEB) || || Ω (03A9) || Ὠ (1F68) Ὡ (1F69) Ὢ (1F6A) Ὣ (1F6B) Ὤ (1F6C) Ὥ (1F6D) Ὦ (1F6E) Ὧ (1F6F) [[BR]] ᾨ (1FA8) ᾩ (1FA9) ᾪ (1FAA) ᾫ (1FAB) ᾬ (1FAC) ᾭ (1FAD) ᾮ (1FAE) ᾯ (1FAF)[[BR]] Ὼ (1FFA) Ώ (1FFB) ῼ (1FFC) || || α (03B1) || ἀ (1F00) ἁ (1F01) ἂ (1F02) ἃ (1F03) ἄ (1F04) ἅ (1F05) ἆ (1F06) ἇ (1F07) [[BR]] ὰ (1F70) ά (1F71) ᾀ (1F80) ᾁ (1F81) ᾂ (1F82) ᾃ (1F83) ᾄ (1F84) ᾅ (1F85) [[BR]] ᾆ (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) [[BR]] ὴ (1F74) ή (1F75) ᾐ (1F90) ᾑ (1F91) ᾒ (1F92) ᾓ (1F93) ᾔ (1F94) ᾕ (1F95) [[BR]] ᾖ (1F96) ᾗ (1F97) ῂ (1FC2) ῃ (1FC3) ῄ (1FC4) ῆ (1FC6) ῇ (1FC7) || || ι (03B9) || ϊ (03CA) ἰ (1F30) ἱ (1F31) ἲ (1F32) ἳ (1F33) ἴ (1F34) ἵ (1F35) ἶ (1F36) [[BR]] ἷ (1F37) ὶ (1F76) ί (1F77) ῒ (1FD2) ΐ (1FD3) ῖ (1FD6) ῗ (1FD7) || || ο (03BF) || ό (03CC) ὀ (1F40) ὁ (1F41) ὂ (1F42) ὃ (1F43) ὄ (1F44) ὅ (1F45) ὸ (1F78) [[BR]] ό (1F79) || || ρ (03C1) || ῤ (1FE4) ῥ (1FE5) || || υ (03C5) || ϋ (03CB) ύ (03CD) ὐ (1F50) ὑ (1F51) ὒ (1F52) ὓ (1F53) ὔ (1F54) ὕ (1F55) [[BR]] ὖ (1F56) ὗ (1F57) ὺ (1F7A) ύ (1F7B) ῢ (1FE2) ΰ (1FE3) ῦ (1FE6) ῧ (1FE7) || || ω (03C9) || ώ (03CE) ὠ (1F60) ὡ (1F61) ὢ (1F62) ὣ (1F63) ὤ (1F64) ὥ (1F65) ὦ (1F66) [[BR]] ὧ (1F67) ὼ (1F7C) ώ (1F7D) ᾠ (1FA0) ᾡ (1FA1) ᾢ (1FA2) ᾣ (1FA3) ᾤ (1FA4)[[BR]] ᾥ (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 Arboreal werden alle Buchstaben eines Wortes außer dem ersten zu 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.