Closed chatelao closed 4 years ago
Ja klar, die gibt es noch in vielen weiteren Sprachen, siehe auch meine Vorträge, die im Wiki verlinkt sind.
Mein französisch ist aber ganz sicher nicht gut genug das selbst zu implementieren. Schau in street_abbrv.sql ich freue mich über pull-requests!
Einfach osml10n_street_abbrev_fr äquivalent zum Beispiel zu osml10n_street_abbrev_en erzeugen. Ich prüfe den fertigen Code dann gerne auf korrektes Funktionieren.
Mit sind Muttersprachler (native speakers) an dieser Stelle wichtig, denn es geht auch darum dass solche Abkürzungen überrhaupt gebräuchlich sind und das kann ich nun schon gar nicht abschätzen.
Mein Vater ist frz. Muttersprache. Ich schaue mir die gängigen und sinnvoll möglichen Abkürzungen mit ihm an.
Sven Geggus notifications@github.com schrieb am Mo., 14. Okt. 2019, 17:04:
Ja klar, die gibt es noch in vielen weiteren Sprachen, siehe auch meine talks.
Mein französisch ist aber ganz sicher nicht gut genug das selbst zu implementieren. Schau in street_abbrv.sql https://github.com/giggls/mapnik-german-l10n/blob/master/plpgsql/street_abbrv.sql ich freue mich über pull-requests!
Einfach osml10n_street_abbrev_fr äquivalent zum Beispiel zu osml10n_street_abbrev_en erzeugen. Ich prüfe den fertigen Code dann gerne auf korrektes Funktionieren.
Mit sind Muttersprachler (native speakers) an dieser Stelle wichtig, denn es geht auch darum dass solche Abkürzungen überrhaupt gebräuchlich sind und das kann ich nun schon gar nicht abschätzen.
— You are receiving this because you authored the thread. Reply to this email directly, view it on GitHub https://github.com/giggls/mapnik-german-l10n/issues/22?email_source=notifications&email_token=AASY6XHDXWP5OGJSHQTJPNTQOSC7DA5CNFSM4JAQIIS2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEBFDDZQ#issuecomment-541733350, or unsubscribe https://github.com/notifications/unsubscribe-auth/AASY6XHLZKYGCQKIRWGE3RDQOSC7DANCNFSM4JAQIISQ .
Erste Fragestellung @giggls
Wie ist mit Begriffen umzugehen, die es Englisch als auch Französisch identisch gibt, die aber anders abgekürzt werden:
Bsp.: https://www.openstreetmap.de/karte.html?zoom=18&lat=46.80203&lon=7.1506&layers=B000TT
Gibt es eine Liste mit den dominanten Sprachen am Ort der Übersetzung, die verwendet werden könnte?
osml10n_street_abbrev_all
müsste in Abhängigkeit der ortsgängigen Sprachen ausgeführt werden. Keine Ahnung ob das so möglich ist?Der Code weiß nicht in welcher Sprache der lokale Name geschrieben ist. Woher auch?
Straßen sind nur ganz selten mehrsprachig getaggt. Zeige mir ein Real-World Beispiel wo der gegenwärtig verwendete Code schief geht. Es gibt eine harte Reihenfolge der Priorität lateinischer Sprachen, die genommen werden, wenn die Zielsprache nicht zur Verfügung steht: latin_langs text[] := '{"en","fr","es","pt","de"}';
Tönt unter den gegebenen Umständen vernünftig.
Schief geht er hier in Fribourg (Im Üchtland):
Da kann man sich vielleicht eine Eigenschaft des französischen zu Nutze machen, dass es dort meist heißt: "Avenue de la ..." während es im englischen "... Avenue" ist. Also "Avenue " abkürzen als "Av. ", " Avenue" abkürzen als " Ave."
Nicht vergessen, dass die ganze Sache hier sowieso keine 100% Lösung ist. In den meisten Fällen ist die lokalisierte Version besser aber ganz sicher nicht in allen.
Die Prä-/Postfix Unterscheidung ist eine gute Idee. Ich schaue mir das mal an. Soviel RegExp sollte ich noch hinkriegen.
Am Do., 17. Okt. 2019 um 09:57 Uhr schrieb Sven Geggus < notifications@github.com>:
Da kann man sich vielleicht eine Eigenschaft des französischen zu Nutze machen, dass es dort meist heißt: "Avenue de la ..." während es im englischen "... Avenue" ist. Also "Avenue " abkürzen als "Av. ", " Avenue" abkürzen als " Ave."
Nicht vergessen, dass die ganze Sache hier sowieso keine 100% Lösung ist. In den meisten Fällen ist die lokalisierte Version besser aber ganz sicher nicht in allen.
die Präpositionen sind im Französischen dort, wo es um Orte geht, also Avenue d'Italie, oder Avenue de Choisy, oder Avenue d'Ivry, während bei Personen, und das sind ebenfalls sehr viele, keine Präpositionen dazukommen: Avenue Paul Vaillant-Couturier oder Avenue Marx Dormoy oder Avenue Victor Hugo. Es stimmt, im Französischen steht Avenue oder Boulevard oder Rue etc. praktisch immer vorn (wie auch im Italienischen und evtl. in allen romanischen Sprachen), während es im Englischen normalerweise hinten steht: Paris Avenue, oder 5th Avenue, etc.
Eben und genau das kann man sich zu Nutze machen um in einem Fall Av. im anderen Fall Ave. abzukürzen. BTW, wenn wir schon dabei sind, du könntest italienische Abkürzungen beitragen. In Südtirol gibt es vermutlich sogar Städte wo das sinnvoll ist, weil deutsch und italienisch gerendert wird.
Als Vorlage kann generell auch das hier dienen: https://github.com/mapbox/geocoder-abbreviations/tree/master/tokens
@chatelao: Ergänze bitte auch tests für solche Straßennamen.
Am Do., 17. Okt. 2019 um 10:41 Uhr schrieb Sven Geggus < notifications@github.com>:
Eben und genau das kann man sich zu Nutze machen um in einem Fall Av. im anderen Fall Ave. abzukürzen. BTW, wenn wir schon dabei sind, du könntest italienische Abkürzungen beitragen. In Südtirol gibt es vermutlich sogar Städte wo das sinnvoll ist, weil deutsch und italienisch gerendert wird.
das habe ich (nicht alleine) bereits hier getan: https://wiki.openstreetmap.org/wiki/Name_finder:Abbreviations#Italiano_-_Italian
Frage: kürzt Ihr auch Vornamen ab? Das ist im italienischen ein großes Thema, weil sehr viele Straßen nach Personen benannt sind, diese immer mit Vor- und Nachnamen heißen, aber im Sprachgebrauch und ggf. auch auf Karten sofern der Platz es erfordert, werden nur Straßenart und Nachname verwendet. Bis auf Ausnahmen, wo eine unbedeutendere Persönlichkeit mit demselben Nachnamen von einer bekannten Person unterschieden werden muss. Z.B. Via Garibaldi (der Einiger Italiens) und Via Rosa Raimondi Garibaldi (eine Frau mit demselben Nachnamen). Nominatim war dem bisher leider nicht sehr aufgeschlossen gegenüber (der Rat war, erstmal mit alt_name oder short_name das händisch zu machen, oder die Personen mit wikidata zu vertaggen), ist aber auch Thema in anderen Ländern, AFAIR Spanien.
Was man auch z.B. oft weglassen kann im italienischen sind Präpositionen: anstatt "Via del Monte di Minchia" "Via Monte di Minchia".
Ich orientiere mich im allgemeinen daran wie das auf Straßenschildern und oder auf gedruckten Karten gemacht wird. Wenn Du in den Code schaust kannst du sehen, dass wir im deutschen Titel wie Doktor oder Professor abkürzen. Mal schaun, vielleicht baue ich am WE mal die Tabelle aus dem Wiki zumindest für einige weiterre Sprachen in das Script ein.
Ihr seid lustig, die Tabelle.sieht doch sehr ähnlich jener, die ich aus der kanadischen Postempfehlung entworfen habe:
Das kommt gut.
sent from a phone
On 17. Oct 2019, at 11:42, Sven Geggus notifications@github.com wrote:
Ich orientiere mich im allgemeinen daran wie das auf Straßenschildern und oder auf gedruckten Karten gemacht wird.
auf Schildern werden die Vornamen oft weggelassen, offiziell sind sie praktisch immer Namensbestandteil.
Sehe ich nicht wie man das automatisiert machen könnte. Gegen eine Liste wegzulassender Vornamen abgleichen? Echt?
Am Do., 17. Okt. 2019 um 17:43 Uhr schrieb Sven Geggus < notifications@github.com>:
Sehe ich nicht wie man das automatisiert machen könnte. Gegen eine Liste wegzulassender Vornamen abgleichen? Echt?
Lonvias Vorschlag für Nominatim war, einen wikidata link für die Herkunft / den Bezug des Straßennamens zu setzen, so dass man aus Wikidata sehen kann, was Vorname und was Nachname ist (sofern das dort eingetragen ist). (Rein hypothetisch, das ist nichts, was derzeit programmiert wird soweit ich vermute).
Den Renderer (für den diese Software ja ist) von Wikidata abhängig zu machen halte ich für völlig abwegig.
Alternativ könnte man eine Liste wenigstens der häufigsten Personen pflegen, und wie man sie abkürzen kann. Es gibt (mind., aber sehen wirs mal so für diesen Kontext) 2 Arten von Personen nach denen Straßen benannt werden: Lokalhelden und allgemein bekannte (national oder international, z.B. John Fitzgerald Kennedy). Die Lokalhelden werden wohl nur wenige Male vorkommen (in ihrer Gegend), während die anderen immer und immer wieder auftauchen. Für diese zweiten, allgemeinen Personen, wäre eine eigene Liste vermutlich schaffbar und auch sinnvoller. Für die anderen könnte man es über wikidata machen (was aber auch auf das cachen der Resultate und damit auf eine eigene Liste hinausläuft, nur dass sie automatisch erstellt wäre).
Typischer Fall ist "Via Cavour", der mit vollem Namen "Camillo Paolo Filippo Giulio Benso, conte di Cavour, di Cellarengo e di Isolabella" heißt, oder auch "kurz" "Camillo Benso di Cavour" oder "Camillo Benso conte di Cavour". Oder halt einfach "Cavour".
Am Do., 17. Okt. 2019 um 17:59 Uhr schrieb Martin Koppenhoefer < dieterdreist@gmail.com>:
Typischer Fall ist "Via Cavour", der mit vollem Namen "Camillo Paolo Filippo Giulio Benso, conte di Cavour, di Cellarengo e di Isolabella" heißt, oder auch "kurz" "Camillo Benso di Cavour" oder "Camillo Benso conte di Cavour". Oder halt einfach "Cavour".
Hier ist sein Wikidata item: https://www.wikidata.org/wiki/Q166092 Wie man sieht ist es ggf. noch komplizierter, der Herr wäre mit einer Liste von uns einfacher zu handeln, weil "Benso" ist der Nachname, "Cavour" eigentlich nur eine Abkürzung seines Titels (bzw. Namensbestandteils, je nachdem wie man es sieht) "Graf von Cavour", aber das ist der Name unter dem er am bekanntesten ist.
von Cavour finde ich über 1000 über Taginfo: https://taginfo.openstreetmap.org/search?q=name%3Dvia+camillo+benso+
Meine Lieben, aktuell kommt mindestens die "en/fr" Unterscheidung ein wenig voran:
Any feedback welcome
Das sieht gut aus:
sven=> select regexp_replace('Avenue de la gare','^Avenue\M','Av.');
regexp_replace
----------------
Av. de la gare
(1 Zeile)
sven=> select regexp_replace('5th Avenue','(?!^)Avenue\M','Ave.');
regexp_replace
----------------
5th Ave.
(1 Zeile)
Wobei ich mich frage ob man das de la
eigentlich ebenfalls abgekürzt wird.
@dieterdreist: Das mit den Vornamen ist mir zu kompliziert. Einen pull request würde ich trotzdem nehmen :)
sent from a phone
On 17. Oct 2019, at 18:52, Sven Geggus notifications@github.com wrote:
@dieterdreist: Das mit den Vornamen ist mir zu kompliziert. Einen pull request würde ich trotzdem nehmen :)
nimmst du die short_name-Werte fall vorhanden in den tags wenn der name nicht passt?
Nein, kein Short name. Es geht hier primär um Lokalisierung, das scheint mir irgendwie gerade in Vergessenheit zu geraten.
Mir wäre außerdem nicht bekannt wie und ob man in Mapnik den zu rendernden String je nach Länge des Objekts unterschiedlich wählen kann.
sent from a phone
On 17. Oct 2019, at 22:25, Sven Geggus notifications@github.com wrote:
Mir wäre außerdem nicht bekannt wie und ob man in Mapnik den zu rendernden String je nach Länge des Objekts unterschiedlich wählen kann.
über placements
https://github.com/mapnik/mapnik/wiki/TextSymbolizer
bin mir nicht sicher ob das bei Straßen funktionieren würde, aber bei Plätzen, Brücken und anderen Punkten geht es AFAIK damit.
Die Frage wäre ja wie ich ins SQL einen Kennwert für die gewünschte Länge des name Strings rein kriege. Momentan kürzt der Code einfach immer stur doof ab, auch wenn es aufgrund der Länge des Straßenobjektes nicht notwendig wäre.
Am Fr., 18. Okt. 2019 um 09:57 Uhr schrieb Sven Geggus < notifications@github.com>:
Die Frage wäre ja wie ich ins SQL einen Kennwert für die gewünschte Länge des name Strings rein kriege. Momentan kürzt der Code einfach immer stur doof ab, auch wenn es aufgrund der Länge des Straßenobjektes nicht notwendig wäre.
evtl. einfach erst eine Regel für den längeren Namen und danach eine für den kürzeren Namen, wenn der lange schon gerendert wurde passt der kürzere nicht mehr hin. Geht wie gesagt bei Straßen eher nicht, bei Brücken und Plätzen aber schon (gerade für Plätze hat man oft auch wenig "Platz" und sie sind doch oft Hauptorientierungspunkte).
Und, ich weiß nicht ob du das machst, Zusammenfassung von gleichnamigen, gleichrangigen Segmenten würde oft auch viele nützliche Straßennamen zutage fördern, die wegen Abbiegebeschränlungen, wechselnden maxspeed, route-Relationen etc. zu fragmentiert fürs Rendering sind.
Wenn das bei Straßen ohnehin keine Option ist, dann sollten wir diese Diskussion hiermit beenden,
denn osml10n_get_streetname_from_tags
wird derzeit ausschließlich für linienförmige Objekte verwendet. Wenn nicht, dann ist das ein Fehler im Kartenstil.
Hm, keine Regel ohne Außnahme!
Quebec Kanada: 1ere Avenue 2e Avenue
Ob man den Regulären Ausdruck so umbiegen kann, dass er das französisch abkürzt?
Ich schaue mir das kurz an und schreibe den Patch.
Das Schwesterprojekt macht schon Fortschritte, aber ist noch nicht spruchreif: https://github.com/chatelao/osm-abbrev, insb.: https://github.com/chatelao/osm-abbrev/tree/master/src
Das hier scheint zu tun, kann man aber bestimmt noch schöner machen:
diff --git a/plpgsql/street_abbrv.sql b/plpgsql/street_abbrv.sql
index 22c8c14..078f5ce 100644
--- a/plpgsql/street_abbrv.sql
+++ b/plpgsql/street_abbrv.sql
@@ -50,9 +50,10 @@ CREATE or REPLACE FUNCTION osml10n_street_abbrev_all(longname text) RETURNS TEXT
DECLARE
abbrev text;
BEGIN
+ // make shure to call this before osml10n_street_abbrev_en
+ abbrev=osml10n_street_abbrev_fr(abbrev);
abbrev=osml10n_street_abbrev_en(longname);
abbrev=osml10n_street_abbrev_de(abbrev);
- abbrev=osml10n_street_abbrev_fr(abbrev);
abbrev=osml10n_street_abbrev_ru(abbrev);
abbrev=osml10n_street_abbrev_uk(abbrev);
return abbrev;
@@ -69,9 +70,10 @@ CREATE or REPLACE FUNCTION osml10n_street_abbrev_latin(longname text) RETURNS TE
DECLARE
abbrev text;
BEGIN
+ // make shure to call this before osml10n_street_abbrev_en
+ abbrev=osml10n_street_abbrev_fr(abbrev);
abbrev=osml10n_street_abbrev_en(longname);
abbrev=osml10n_street_abbrev_de(abbrev);
- abbrev=osml10n_street_abbrev_fr(abbrev);
return abbrev;
END;
$$ LANGUAGE 'plpgsql' IMMUTABLE;
@@ -148,6 +150,9 @@ CREATE or REPLACE FUNCTION osml10n_street_abbrev_fr(longname text) RETURNS TEXT
BEGIN
abbrev=longname;
abbrev=regexp_replace(abbrev,'^Avenue\M','Av.');
+ // this should fix the issue with invalid usage of english abbreviations in canada
+ abbrev=regexp_replace(abbrev,'^([0-9]+)e Avenue\M','\1e Av.');
+ abbrev=regexp_replace(abbrev,'^1ere Avenue\M','1ere Av.');
abbrev=regexp_replace(abbrev,'^Boulevard\M','Bd');
abbrev=regexp_replace(abbrev,'^Chemin\M','Ch.');
abbrev=regexp_replace(abbrev,'^Esplanade\M','Espl.');
Auswertung in Montreal, es gibt folgende Testfälle:
Das Overpass Turbo Query dazu: https://overpass-turbo.eu/s/O1a
[out:csv (name; false)];
(
way["highway"]["name"~"Avenue"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
Wie kürzt man den 1., 2., 3. generell auf französisch ab?
https://francais.lingolia.com/fr/vocabulaire/nombres-date-et-heure/les-nombres-ordinaux - Besser könnte ich das wohl nicht beschreiben:
In-Extremis könnte man gleich die Superscripte aus den Unicode Tabellen nehmen:
https://en.wikipedia.org/wiki/Unicode_subscripts_and_superscripts#Latin_and_Greek_tables
1ʳᵉ Avenue / 2ᵉ Avenue etc. - Ob dies der Lesbarkeit dienlich wäre- wohl eher nicht. Und wahrscheinlich unterstützen nicht alle Fonts diese Zeichen.
Müsste das dann nicht 1re heißen, weil Avenue weiblich ist?
Da wir ohnehin nur Noto verwenden wäre das schnell überprüft.
Passt doch. Vielleicht versuche ich für "en" den Lookback anzupassen, dass die Reihenfolge keine Rolle spielt. Aber da muss mir Google noch etwas helfen.
Eventuell mal visual-regexp anschaun, das verwende ich immer.
Zur Ergänzung eine alternative Schreibweise mit Lookbehind RegExp 🧙:
sql abbrev=regexp_replace(abbrev,'(?<=^|[0-9]re |[0-9]e )Avenue\M','Av.');
sql abbrev=regexp_replace(abbrev,'(?<!^|[0-9]re |[0-9]e )Avenue\M','Ave.');
Das erzeugt jedoch definitiv etwas anderes als mein Code.
Ich sehe gerade ich habe ein ^ zu viel, aber das stört anscheinend nicht. So sollte das aussehen: regexp_replace(abbrev,'^1[eè]?re Avenue\M','1re Av.');
Das erlaubt 1ere, 1ère und 1re
. Eventuell solle ich auch alle drei in einen Test stecken.
Wenn Du das was mein Code macht mit einem einzigen regexp_replace hinkriegst, dann mach mir einen pull request. In den Tests kannst Du ja sehen ob es klappt.
Es sollte aber halt schon das selbe tun wie mein Code.
Wenn ich Dein Regex richtig verstehe berücksichtigt er außerdem keine mehrstelligen Nummern.
22e Avenue oder so.
Was man IMO generell nicht machen sollte ist falsch gemapptes Zeug korrigieren, dass sollen die Mapper fixen, nicht die Nutzer der Daten.
Kurze Erläuterung zum (vereinfachten) "positive lookbehind" (?<=^|1re |[0-9]e )Avenue\M
. Er prüft drei Fälle (Die Pipes "|" trennen die Fälle):
Hier die verwendete Query: https://overpass-turbo.eu/s/O4f
Die beiden Fälle 1ère und 1ere hab ich nicht mit aufgenommen, weil sie in Montreal nur 1x resp. 2x vorkommen und in der allgemeinen Beschreibung der frz. Nummerierungen nicht erwähnt werden.
Fazit: Diese beiden Regeln sind in meinen lokalen Tests, ohne "1ere" und "1ère" erfolgreich:
abbrev=regexp_replace(abbrev,'(?<=^|1re |[0-9]e )Avenue\M','Av.');
abbrev=regexp_replace(abbrev,'(?<!^|1re |[0-9]e )Avenue\M','Ave.');
Englisch:
French:
=> Ich kann gerne einen spezifischen pull request erstellen und würde vorschlagen, dass wir "1ère" und "1ere" nicht berücksichtigen.
Ich finde mit
[out:csv (name; false)];
(
way["highway"]["name"~"^1[^0-9].* Avenue"]({{bbox}});
);
// print results
out body;
>;
out skel qt;
folgendes in Montreal und Quebec:
1e Avenue
1re Avenue
1ère Avenue
1ere Avenue
Was davon jetzt falsch ist kann ich schlecht beurteilen. Ich würde falsch erfasste Namen eher unberücksichtigt lassen. Aber sind "1ère" und "1ere" wirklich falsch?
1e kommt mir auch eher falsch vor.
Sie deshalb weg zu lassen weil diese Art der Regular Expression das nicht kann oder (noch schlimmer) weil wir das nicht hinkriegen halte ich jedenfalls für keine gute Idee.
Was mir auch nicht gefällt ist dass dein Code 1re und 1e durchlässt. Da sollte ein einheitlicher Output rauskommen.
Wäre das passend (Bei [èe]re bin ich schmerzlos)? Dann passe ich die Testfälle an und schreibe den Code um. Mir sind die RegExp sympatisch, weil der Code en/fr getrennt und in beliebieger Reihenfolge ausgeführt werden kann.
Ich denke das ist doch genau das was mein momentaner Code macht. Nur halt mit einer if Kaskade und nicht mit reinen regular expressions.
Das mit der beliebigen Reihenfolge erlaubt mein Code ja auch schon das mit der Änderung der Aufrufreihenfolge habe ich verworfen.
https://github.com/giggls/mapnik-german-l10n/compare/v2.5.7..master
Noch eine Frage: Bis zu welcher PostGre Version zurück sollte der Code funktionieren?
PS: Wenn möglich, möchte langfristig alle "if/then/else" elimineren und nur eine Liste von Regeln führen. Aber muss nicht unbedingt sein.
Von mir aus, wenn Du die selbe Funktionalität rein mit Regular Expressions hinkriegst. Momentan brauche ich wegen regexp_match mindestens PostgreSQL 10. Sollte ich im INSTALL.md mal anpassen.
Im Debian Paket (https://github.com/giggls/mapnik-german-l10n/blob/master/debian/pgversions) wird v9.4+ erwähnt :-). Im control die v9.5 (https://github.com/giggls/mapnik-german-l10n/blob/master/debian/control).
Ich hätte fast angefangen, alles rückwärts zu portieren (geht ja irgendwie). Aber wenn das nicht nötig ist (kann ich nicht beurteilen), dann lassen wir das und schauen vorwärts nach 10/11.
9.4 is likely the version where I first started to develop this code. Fixed now.
Guten Tag, es gibt auch im Französischen jede Menge an Abkürzungen für Orte / Strassen Prefixes:
Häufig gebraucht: