[RUBY] Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln

Da es notwendig wurde, eine große Anzahl von Namen (Furigana) in Romaji umzuwandeln, suchte ich nach einem solchen Juwel, aber es gab einen, der allgemeine Sätze in Romaji umwandelte (Beispiel: [Romaji](https: //) github.com/makimoto/romaji)) Aber ich konnte nichts finden, das sich auf "Name" spezialisiert hat, also habe ich es selbst gemacht.

Damit können Sie 99% Ihrer Namen ordnungsgemäß in Romaji konvertieren!

… Übrigens „Spezialisiert auf„ Namen “? Romaji ist dasselbe für gewöhnliche Sätze und Namen, nicht wahr? "99% Name"? Einige von Ihnen haben vielleicht gedacht: "Konvertieren Sie Romaji 100% genau."

Als ich es jedoch nachschlug, war die Welt der römischen Schriftzeichen ziemlich dunkel ...

Über Romaji Namensumwandlung

Das einzige Mal, wenn Sie Ihren Romaji-Namen benötigen, ist die Beantragung eines Reisepasses. Das Außenministerium hat die Notation im Passantrag erläutert, aber demnach scheint es, dass Regeln angenommen werden, die sich geringfügig von den allgemeinen römischen Schriftzeichen unterscheiden.

Ich werde eine Konvertierung basierend auf dieser Regel vornehmen.

Ich werde es mit dem folgenden Code erklären, den ich geschrieben habe. [^ 1]

[^ 1]: Tatsächlich werden vorher die Zeichencodekonvertierung und die Hiragana → Katakana-Konvertierung eingegeben.

kana.gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])Oh\z/){ "o" }
    .gsub(/(?<=[Oto])Oh/){ oh ? "h" : "" }
    .gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])C./){ oh ? "h" : "" }
    .gsub(/(?<=[Ukustunufumyurvuguzuzubupu])C./){ "" }
    .gsub(/[EIN-Vu-\-][EINィゥェォャュョ]?/, ConversionTable)
    .gsub(/Tsu(.)/){ ($1 == "c" ? "t" : $1) + $1 }
    .gsub(/n(?=[bmp])/){ "m" }

Grundkonvertierung

Die Romaji-Konvertierung erfordert grundsätzlich die Konvertierung von "a" in "a", "ka" in "kya" usw., jeweils ein Zeichen nach dem anderen (jedoch zwei Zeichen, wenn ein kleines Waieuyo folgt). ..

Im obigen Code ist dies der Teil.

    .gsub(/[EIN-Vu-\-][EINィゥェォャュョ]?/, ConversionTable)

Eine ConversionTable ist ein assoziatives Array, das die grundlegenden Konvertierungsregeln zwischen Katakana und Romaji enthält, z. B. "{" a "=>" a ", ...}". Da "tsu" später durch eine andere Methode konvertiert wird, wird es hier nicht als "{...," tsu "=>" tsu "}" konvertiert.

Schallabweisung

Grundsätzlich sollte "n" in "n" konvertiert werden, außer dass es vor "b, m, p" in "m" konvertiert werden soll. Die Verarbeitung erfolgt im folgenden Teil.

    .gsub(/n(?=[bmp])/){ "m" }

Eingabeaufforderung (tsu)

Grundsätzlich sollte "tsu" in den letzteren Konsonanten konvertiert werden, mit Ausnahme von "chi, cha, chu, cho", das in "t" konvertiert werden soll. In Romaji gibt es jedoch nichts, was mit "c" beginnt, außer den ersten vier. Es reicht also aus, nur zu überprüfen, ob die Rückseite "c" ist. Der folgende Teil führt diese Verarbeitung durch.

    .gsub(/Tsu(.)/){ ($1 == "c" ? "t" : $1) + $1 }

... Übrigens gibt es keine Namen, die mit "tsu" enden oder Namen, die nach "tsu" einen Vokal haben ...

Lange Noten (o o, o u, u u)

Bei langen Noten sind die langen Noten von "o" und "u" grundsätzlich nicht geschrieben. [^ 2] Mit anderen Worten, die Namen wie "Oono", "Kouta" und "Hyuga" sind "ono", "kota" und "hyuga".

[^ 2]: Übrigens wird der lange Ton von "i" wie "Niina (neues Gemüse)" geschrieben, aber der lange Ton von "-" wie "Nina" wird geschrieben, auch wenn er phonetisch gleich ist. Nein.

Es gibt jedoch Ausnahmen und das nachfolgende "o" (wie "Senoo") wird zu "oo". Die Verarbeitung erfolgt im folgenden Teil.

kana.gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])Oh\z/){ "o" } #Ausnahmebehandlung am Ende
    .gsub(/(?<=[Oto])Oh/){ oh ? "h" : "" } # oOh
    .gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])C./){ oh ? "h" : "" } # oC.
    .gsub(/(?<=[Ukusutsunufumyurvuguzuzubupu])C./){ "" } # uC.

Übrigens scheint es erlaubt zu sein, "oh" für "o o" und "o u" zu schreiben, also mache ich es möglich, als Option zwischen ihnen zu wechseln.

"Stimmt etwas nicht mit" o "? ], Es ist scharf. Dies wird später erklärt.

Hauptthema: Dunkler Teil

Das ist alles für die Regeln, die in den vorherigen Materialien des Außenministeriums geschrieben wurden. Ich bin sicher, einige von Ihnen haben vielleicht gedacht: "Was für eine einfache Sache."

Das Problem ist jedoch der zuvor erwähnte "lange Ton". Wenn es sich um eine "lange Notiz" handelt, befolgen Sie einfach die obigen Regeln.

Aber vorher müssen wir ein Urteil darüber fällen, ob es sich um eine lange Notiz handelt oder nicht. Von hier aus ist das Reich der Dunkelheit ...

Nicht lange Noten "o o" "o u" "u u"

"O o", "o u" und "u u" sollten mit Ausnahme des Endes einheitlich auf "o, u" gelöscht werden, aber "o o" und "o" Es kann Fälle geben, in denen die Form von "u" oder "u" keine lange Note ist.

Zum Beispiel "Hirooka (Hirooka)", "Kouchiwa (Fan einer kleinen Gruppe)", "Matsuura (Matsuura)". [^ 3] Dazu gehören "o o", "o u" und "u u", aber sie sind wie "hiro" + "oka" unterteilt und werden nicht auf "niedrig" erweitert. Und es wird "Hirooka".

[^ 3]: Die beiden anderen als "Hirooka" stammen aus dem Beispiel des Saitama Prefecture Passport Center.

Es ist eine relativ einfache Geschichte für Menschen, Kanji zu sehen, aber wie kann eine Maschine dies beurteilen?

Kannst du nur mit Kana damit umgehen?

Wie ich oben geschrieben habe, ist es für Menschen relativ einfach, "Kanji" zu sehen. Wenn Sie also nur Frigana haben, gibt es eine Möglichkeit, eine endgültige Entscheidung zu treffen?

… Leider denke ich nicht, dass es möglich ist. Zum Beispiel ist der zuvor geschriebene "kleine Fan" "ko" + "uchiwa", es ist also kein langer Ton, aber nehmen wir an, Sie haben einen Nachnamen, der "kochiwa" lautet, indem Sie "Kochiwa" schreiben. [^ 4] Auch mit dem gleichen "Kochiwa" muss das erstere in "kouchiwa" und das letztere in "kochiwa" umgewandelt werden. Mit anderen Worten, es ist unmöglich, nur mit Kana damit umzugehen.

[^ 4]: "Kodansen" scheint ein richtiger Familienname zu sein, aber "Kochiwa" ist ein Familienname, der zur Erklärung gemacht wurde, und ich weiß nicht, ob er tatsächlich existiert.

Was ist, wenn ich auch Kanji-Daten gebe?

Wie wäre es dann, nicht nur Kana-, sondern auch Kanji-Daten zu geben? Lesen Sie Kanji allgemein als Daten und überprüfen Sie, welcher Teil von Kana welchem Kanji entspricht, z. B. "Matsuura" + "Matsuura" → "Matsuura (Ura)". , Konvertieren Sie für jedes Kanji ... Dann scheint das obige Beispiel zu funktionieren. (Es scheint sehr lästig zu sein ...)

In den Materialien des Außenministeriums gibt es jedoch ein Beispiel für den Nachnamen "Misono (Mizonosei)". Ich denke, das ist "Mi-en (Sono) Student (U)", aber in römischen Buchstaben ist es "Misono". ** Was meinst du! ** ** **

Korrespondenz zu nicht langem Ton "o o" wie "hirooka"

Erstens habe ich das Gefühl, dass es nur zwei Arten von lang klingendem "o-o" gibt, "o-o (groß usw.)" und "zu (weit)". Wie unten gezeigt, kann daher die Anzahl der Namen, die unterstützt werden können, erhöht werden, indem die "o-o" -Regel nur auf "o-o" und "too" angewendet wird.

    .gsub(/(?<=[Oto])Oh/){ oh ? "h" : "" } # oOh

Aber wenn es einen Nachnamen wie "Hitooka" gäbe, würde das nicht funktionieren.

Abschließend

Deshalb habe ich diese Namen aufgegeben und mich entschlossen, mit der Conversion-Rate von 99% zufrieden zu sein. Wenn Sie eine höhere Conversion-Rate anstreben, halte ich es für ziemlich realistisch, die Daten des Nachnamens zu haben, die schwer zu konvertieren sind, und sie ausnahmsweise zu konvertieren. Wir warten auf die Herausforderung derer, die bereit sind, in die Dunkelheit zu schauen.

Recommended Posts

Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
Ich war süchtig nach der Rollmethode
Ich war süchtig nach dem Spring-Batch-Test
Ich war süchtig danach, vom Docker-Container aus keine Verbindung zu AWS-S3 herstellen zu können
Ich wurde von der Dunkelheit Romajis verschluckt, als ich versuchte, meinen Namen in Romaji umzuwandeln
Ich möchte den Namen des Posters des Kommentars anzeigen
Ich war süchtig nach Laradock + VSCode + xdebug
Ich habe versucht, mein Verständnis der Objektorientierung um n% zu vertiefen
Ich möchte die Eingabe begrenzen, indem ich den Zahlenbereich einschränke
Ich war süchtig nach der API-Version min23 von registerTorchCallback
Durch die Überprüfung der Funktionsweise von Java unter Linux konnte ich die Kompilierung und Hierarchie verstehen.
Ich war süchtig nach der Rollmethode
[Circle CI] Ich war süchtig nach dem automatischen Test von Circle CI (Rails + MySQL) [Memo]
Ich war süchtig nach dem Spring-Batch-Test
Ich möchte den Feldnamen des [Java] -Felds erhalten. (Alter Ton)
Ich möchte, dass Sie Enum # name () für den Schlüssel von SharedPreference verwenden
<Java> Quiz zum Batch-Konvertieren von Dateinamen, die durch eine bestimmte Zeichenfolge mit einem Teil des Dateinamens getrennt sind
Ich möchte eine Liste nur eindeutiger Zeichenfolgen erhalten, indem feste Zeichenfolgen vom Dateinamen ausgeschlossen werden
Ich möchte den Inhalt der Absicht var_dump
Ich habe versucht, den Mechanismus von Emscripten mit einem deutschen Löser zu untersuchen
Der Teil, dem ich in "Einführung in Ajax in Java-Webanwendungen" von NetBeans verfallen war
Beachten Sie, dass ich von den Einstellungen des Android-Projekts von IntelliJ IDEA abhängig war
Ich war süchtig nach NoSuchMethodError in Cloud-Endpunkten
[Kotlin] Ermittelt den Argumentnamen des Konstruktors durch Reflektion
Konvertieren Sie das Array von error.full_messages in Zeichen und geben Sie es aus
05. Ich habe versucht, die Quelle von Spring Boot zu löschen
Ich habe versucht, die Kapazität von Spring Boot zu reduzieren
Ich möchte die Antwort der Janken-App wissen
[Rails] So ändern Sie den Spaltennamen der Tabelle
[VBA] Ich habe ein Tool erstellt, um den primitiven Typ der von Hibernate Tools generierten Entity-Klasse in den entsprechenden Referenztyp zu konvertieren.
[Kotlin] Konvertieren Sie ZonedDateTime in String, indem Sie das Format angeben
Ich möchte die Bildlaufposition von UITableView zurückgeben!
Ich musste herausfinden, wo sich der Ordner mit den Eclipse-Plugins auf meinem Mac befand. (Memo)
Mit ToolKit konnte ich innerhalb von 10 Minuten eine GMS-App in G + H-Unterstützung konvertieren
Ich habe versucht, die ähnliche Funktion durch asynchrone Kommunikation zu implementieren
So ändern Sie dynamisch den von MyBatis erfassten Spaltennamen
Wovon ich bei der Einführung der JNI-Bibliothek süchtig war
Ruft den Objektnamen der vom neuen Operator erstellten Instanz ab
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
Ich war süchtig danach, die Update-Anweisung in MyBatis zu wiederholen
Ich möchte die Protokollausgabeeinstellung von UtilLoggingJdbcLogger ändern
Ich habe die grundlegende Grammatik von Ruby kurz zusammengefasst
Was ich mit der Redmine REST API süchtig gemacht habe
Ich möchte das JDK auf meinem Mac-PC installieren
Ich möchte dem select-Attribut einen Klassennamen geben
[Rails] So zeigen Sie eine Liste der Beiträge nach Kategorie an
[Ruby] Ich möchte die Reihenfolge der Hash-Tabelle umkehren
Die Geschichte, nach der ich beim Einrichten von STS süchtig war
[Rails] So konvertieren Sie den URI des von http gesendeten Bildes in https, wenn Sie die Twitter-API verwenden
Ich möchte die Notwendigkeit des Testens beurteilen, indem ich die Unterschiede der Klassendateien beim Refactoring von Java vergleiche.
Ich habe versucht, mir zu erlauben, die Verzögerung für den Android UDP-Client einzustellen
[Controller] Ich möchte den numerischen Wert einer bestimmten Spalte aus der Datenbank abrufen (mein Memo).
Als ich mir Sorgen über statische Methoden in der Java-Oberfläche machte, kam ich zur Reihenfolge der Namensinterpretation
Als ich mich wieder an Tribuo erinnerte, das von Oracle veröffentlicht wurde, war die Person in mir eine heiße Person.