Automatische Transliteration nichtlateinischer Alphabete

Jonathan R. hinzugefügt 9 Monaten her
beantwortet

Liebes Support-Team,


ich würde mich über eine Möglichkeit sehr freuen, Titelangaben von Werken in Sprachen, welche nicht das lateinische Alphabet verwenden, über eine zusätzliche Funktion einem vorgegebenem Stil folgend zu transliterieren.


In meiner Datenbank habe ich Hunderte Titel in Russisch, Ukrainisch und Weißrussisch, deren Titelangaben ich in lateinischen Buchstaben eingegeben und dabei das in Deutschland übliche wissenschaftliche Transliterationssystem verwendet habe. Allerdings schreibe ich auch auf Englisch und benötige dafür ein anderes Transliterationssystem. Um dafür nicht jedesmal die Titelangaben der zitierten Titel zu ändern, verwende ich Freitextfelder und andere Behelfsmittel, die sehr aufwändig sind und mit jedem neuen Zitationsstil noch aufwändiger werden.


Ich bin mir sicher, dass viele andere Citavi-Benutzer das gleiche Problem haben (Verwendung von Titeln in nichtlateinischen Alphabeten, Übertragung in unterschiedliche Sprachen & Transliterationssysteme). Wäre es nicht möglich, eine automatische Transliterationsfunktion hinzuzufügen? Diese könnte vorgegebenen Transliterationssystemen folgen, die mit wenigen Klicks ausgewählt und nach Belieben angepasst werden könnten – ganz wie dies bereits mit Zitationsstilen hervorragend klappt. Bei der Einpflegung neuer Titel könnte man dann die Titelangaben zunächst im originalen Alphabet belassen, um sie erst unmittelbar bei der Zitation automatisch – dem jeweils vorgegebenen Transliterationsstil folgend – in lateinische Buchstaben übertragen zu lassen.


Eine solche Funktion würde mir – und ich bin mir sicher, zahlreichen anderen Benutzern ebenso – die Arbeit ungemein erleichtern. Das bisherige Vorgehen ist ein großes Ärgernis und mein einziges Problem mit Citavi. Vielen Dank!


Mit freundlichen Grüßen

Jonathan

Beste Antwort
Foto

Lieber Jonathan,

das funktioniert im Prinzip genauso wie mit Ukrainisch.

Sie müssten nach Zeile 78 noch eine Variable belarusianTermsList erstellen und entsprechend befüllen ("belarusian" und "Weißrussisch" bei der russianTermsList entfernen!). Nach Zeile 96 müssten Sie entsprechend eine regExBelarusian ergänzen.

Die Methode DisplayRussianInEnglish müssten Sie ebenso duplizieren ("DisplayBelarusianInEnglish") und anpassen.

Nach Zeile 105 braucht es dann noch eine weitere "else if"-Bedingung, die analog zu den bisherigen funktioniert.

Viele Grüße

Sebastian

Kommentare (15)

Foto
1

Hallo, Jonathan,

das ist leider alles etwas komplizierter als es auf den ersten Blick scheint, selbst wenn wir nicht-alphabet-basierte Systeme wie Chinesisch, für das es auch wiederum verschiedene Transliterationssysteme (Wade-Giles, Pinyin, ...) gibt, außen vor lassen.

Allein für das Russische gibt es offenbar eine Vielzahl von möglichen Transliterationen. Eine für alle Nutzer brauchbare Lösung in der Citavi-Oberfläche selsbt zu finden, die sich obendrein noch einfach bedienen lässt, dürfte der Quadratur des Kreises gleichkommen.

Prinzipiell ist der Funktionswunsch aber schon erfüllt, aber über den Zitationsstil-Editor und nicht im Hauptprogramm. Wenn der Titel im kyrillischen Alphabet eingegeben ist, könnte man auf Basis dieses Codes die Eingabe z.B. des Titelfeldes ins lateinische Alphabet umgewandeln und ausgeben lassen. Die Zuordnungen müssten dann aber für jedes Transliteration angepasst werden und dafür jeweils ein anderer Zitationsstil (bzw. eine andere programmierte Komponente) genutzt werden.

Viele Grüße

Sebastian

Foto
1

Lieber Sebastian,


vielen Dank für die rasche Antwort, das klingt gut. An welcher Stelle des Programmcodes einer Komponente füge ich einen solchen Code denn ein? Ich kenne mich leider überhaupt nicht mit Programmiersprachen aus.

Viele Grüße,

Jonathan

Foto
2

Lieber Jonathan,

hier im Handbuch erfahren Sie, wie Sie eine programmierte Komponente Ihrem Zitationsstil hinzufügen können: https://www1.citavi.com/sub/manual6/de/index.html?cse_programmable_components.html

Im Anhang finden Sie einen "proof of concept" basierend auf dem hier gefundenen Code.

Viele Grüße

Sebastian

Foto
1

Lieber Sebastian,

wunderbar – das klappt ganz ausgezeichnet. Die restlichen Anpassungen für verschiedene Zitationsstile sollte ich alleine hinbekommen. Vielen Dank!

Herzliche Grüße,

Jonathan

Foto
1

Lieber Sebastian,

ich habe inzwischen den Code meinem Transliterationsstil angepasst. Ein Problem habe ich aber noch – es gibt einen Buchstaben (И bzw. cap_ee im Code), der unterschiedlich transliteriert werden soll, je nachdem, ob es sich bei der ursprünglichen Sprache um Russisch oder um Ukrainisch handelt. Um dieses Problem zu lösen, möchte ich in Zeile 191 (siehe angefügte Datei) eine Bedingung einfügen, die den Inhalt des Feldes "Sprache" des Titels abfragt: wenn in diesem Feld "Ukrainisch" steht, wird dieser Buchstabe (И) als Y transliteriert, andernfalls als I. Wie definiere ich diese Bedingung?


Herzliche Grüße,

Jonathan

Foto
2

Innerhalb der Methode DisplayInEnglish steht die Sprache derzeit nicht zur Verfügung, weil als einzige Variable "text" in die Methode eingegeben wird (siehe Zeile 80 und 136, die Methode ist so definiert). Man könnte nun entweder die Variable languageResolved mit in die Methode übergeben oder aber man splittet DisplayInEnglishzwei Methoden, eine DisplayRussianInEnglish für Russisch, eine DisplayUkrainianInEnglish für Ukrainisch, und wählt anhand des Wertes für languageResolved die richtige Methode aus. M.E. ist das zweite der "sauberere" Weg, aber auch im Zeilenumfang länger. Ich würde das so machen, dass ich eine termsList "Russisch", eine "Ukrainisch" anlege, und dann regEx nutze, um "bool IsRussian" oder "bool IsUkrainian" auf true zu setzen, um dann in Z. 74 ff. entweder die Methode für Russisch, die für Ukrainisch auszuführen, oder aber, wenn beide false, return null. Man könnte auch überlegen, ob man statt 40 else if lieber einen switch nimmt, ist wohl schneller (was ich bis gerade eben auch nicht wusste, aber für diese Antwort ergoogelt habe). Das heißt, genau genommen…

/ed164e2752f4eec0519ea9332c971f54

… müßte man mal auswerten, ob die 5 meist genutzten Buchstaben des kyrillischen Alphabets annähernd 100% aller Buchstaben in einem kyrillischen Text sind. Oder man kombiniert: das kyrillische Äquivalent zu e als erstes per if, alles andere per switch. Die sprachanalytischen Probleme der Optimierung begeistern selbst mich, den Juristen. (Sorry, das klang jetzt nicht sonderlich zielführend, war aber ernst gemeint: den meistgenutzten Buchstaben per if abfragen, alles andere per switch wäre wahrscheinlich echt am schnellsten.)

Foto
1

Wenn man sich https://www.sttmedia.com/characterfrequency-ukrainian so anschaut, ist Switch-Case vermutlich wirklich effizienter. Ich stimme Jan Jakob zu: man sollte zwei Methoden implementieren, sonst wird die Verwirrung groß. Der Zeilenumfang an sich spielt nicht so die Rolle für die Geschwindigkeit.

Viele Grüße

Sebastian

Foto
Foto
1

Vielen Dank! Ich kann leider so gut wie gar kein C# und tue mich daher schwer damit, die Funktionsweise der einzelnen Bestandteile in den Zeilen 22 bis 87 richtig zu verstehen und diese Anleitung umzusetzen. Was genau soll ich wo einfügen? Wenn möglich, ohne auf Wahrscheinlichkeitstabellen zu setzen, das scheint mir aufgrund der Ähnlichkeit zwischen Russisch und Ukrainisch keine gute Idee zu sein, vgl. https://www.sttmedia.com/characterfrequency-russian (möglicherweise habe ich diesen Punkt – ohne C#-Kenntnisse – aber auch einfach nicht richtig verstanden).


Viele Grüße,

Jonathan

Foto
2

Hallo, Jonathan,

insgesamt ist eher wenig zu ändern. Ich habe im Anhang (ungetestet) mal Jan Jakobs Vorschläge umgesetzt. Ich hoffe, es bringt Sie auf den richtigen Weg.

Viele Grüße

Sebastian

Foto
1

Lieber Sebastian,

das funktioniert ganz hervorragend. Damit sollte das Problem insgesamt gelöst sein. Herzlichen Dank!

Viele Grüße,

Jonathan

Foto
1

Lieber Sebastian,

wäre es möglich, in die gleiche Datei mit Weißrussisch noch eine dritte Sprache einzufügen? Weißrussisch unterscheidet sich in der Transliteration zweier Buchstaben leider sowohl von Russisch als auch von Ukrainisch.

Herzlichen Dank und viele Grüße,

Jonathan

Foto
2

Lieber Jonathan,

das funktioniert im Prinzip genauso wie mit Ukrainisch.

Sie müssten nach Zeile 78 noch eine Variable belarusianTermsList erstellen und entsprechend befüllen ("belarusian" und "Weißrussisch" bei der russianTermsList entfernen!). Nach Zeile 96 müssten Sie entsprechend eine regExBelarusian ergänzen.

Die Methode DisplayRussianInEnglish müssten Sie ebenso duplizieren ("DisplayBelarusianInEnglish") und anpassen.

Nach Zeile 105 braucht es dann noch eine weitere "else if"-Bedingung, die analog zu den bisherigen funktioniert.

Viele Grüße

Sebastian

Foto
1

Lieber Sebastian,

wunderbar, vielen Dank für die rasche Hilfe! Das scheint einwandfrei geklappt zu haben.

Viele Grüße,

Jonathan

Foto
1

Hallo an Alle!

Ich danke erstmal herzlich für das tolle Skript, wir können jetzt ohne Probleme

Literaturangaben in mehrere kyrillische Schreibweisen umwandeln (Russisch, Ukrainisch, Russinisch). Das ist richtig super und hilft uns ungemein.


Nun haben wir aber das Problem, dass wir auch in slavischen Zeitschriften publizieren. Bis dato haben wir alle Werke (über 1500) mit DIN-Transliteration in Citavi aufgenommen. Für die slavischen Zeitschriften sollten wir einige aber wiederum in Kyrillisch umwandeln, was viel manuelle Arbeit macht.


Daher habe ich versucht, Ihr Skript einfach "umzudrehen", also die lateinischen Buchstaben als char anzugeben, zu benennen und unten für jede spezifische Sprache nach dem if, else Prinzip fortzufahren, um die lateinischen chars jeweils als kyrillische Buchstaben "ausspucken" zu lassen.


Hierbei entsteht das folgende Problem: Einige wenige kyrillische Zeichen werden in der DIN-Transliteration als Digraphen wiedergegeben. So ist "Я" ->"Ja; "Ё" -> "Jo"; "Ю" ->"Ju"; "Щ" -> "Šč"; "Ъ" -> "'' " (zwei Apostrophe).

Zwei Buchstaben lassen sich aber nicht als char zuordnen, da das logischerweise nur ein Character ist.


Dadurch funktioniert das Skript nicht mehr. Lässt man diese Buchstaben weg, so klappt es in Richtung Lateinisch zu Kyrillisch gut, die Digraphen werden dann im Kyrillischen aber falsch wiedergegeben (z.B. йа statt я).


Hättet Ihr vielleicht eine Idee wie wir so etwas realisieren könnten?

private static char cap_shcha = 'Šč'


In der angehängten Datei versuche ich mich gerade am Russischen, mit meinen bisher nicht vorhandenen C# Kenntnissen.


Beste Grüße und nochmals vielen Dank,

Moulay

Foto
1

Hallo, Moulay

Hier gibt es eine (wenn auch nicht hübsche) Methode, die das gewünschte erreichen sollte: https://stackoverflow.com/questions/27038805/how-to-anti-transliterate-latin-to-cyrillic

Die könnten Sie in der programmierten Komponente einbauen und statt der ursprünglichen aufrufen. Untrans2 scheint dabei performanter zu sein als Untrans1. Ausprobiert habe ich aber nicht. :-)

Viele Grüße

Sebastian