[RUBY] J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji

Puisqu'il est devenu nécessaire de convertir un grand nombre de noms (Furigana) en Romaji, j'ai cherché un tel bijou, mais il y en avait un qui convertissait des phrases générales en Romaji (Exemple: [Romaji](https: //) github.com/makimoto/romaji)) Mais je n'ai rien trouvé de spécialisé dans "nom", alors je l'ai fait moi-même.

Avec lui, vous pouvez correctement convertir 99% de vos noms en Romaji!

… Au fait, «Spécialisé en« nom »? Romaji est la même chose pour les phrases et les noms ordinaires, n'est-ce pas? "" 99% nom "? Certains d'entre vous ont peut-être pensé: «Convertissez les Romaji à 100% avec précision».

Cependant, quand je l'ai recherché, le monde des personnages romains était assez sombre ...

À propos de la conversion du nom en Romaji

La seule fois où vous avez besoin de votre nom Romaji est de demander un passeport. Le ministère des Affaires étrangères a expliqué la notation dans la demande de passeport, mais d'après cela, il semble que des règles légèrement différentes des caractères romains généraux soient adoptées.

Je vais faire une conversion basée sur cette règle.

Je vais expliquer en utilisant le code suivant que j'ai écrit. [^ 1]

[^ 1]: En fait, avant cela, la conversion de code de caractère et la conversion hiragana → katakana sont entrées.

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

Conversion de base

La conversion Romaji n'a besoin que de convertir "a" en "a", "ka" en "kya", et ainsi de suite, un caractère à la fois (mais deux caractères s'il est suivi d'un petit waieuyo). ..

Dans le code ci-dessus, c'est la pièce.

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

Un ConversionTable est un tableau associatif contenant les règles de conversion de base entre Katakana et Romaji, telles que {" a "=>" a ", ...}. De plus, comme "tsu" sera converti ultérieurement par une autre méthode, il n'est pas converti ici en tant que {...," tsu "=>" tsu "}.

Répulsion sonore

Fondamentalement, "n" doit être converti en "n", sauf qu'il est supposé être converti en "m" avant "b, m, p". Le traitement est effectué dans la partie suivante.

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

Invite (tsu)

Fondamentalement, "tsu" doit être converti en cette dernière consonne, à l'exception de "chi, cha, chu, cho", qui doit être converti en "t". Cependant, en Romaji, il n'y a rien qui commence par "c" autre que les quatre premiers, il suffit donc de vérifier uniquement si le dos est "c". La partie suivante effectue ce traitement.

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

... Au fait, il n'y a pas de noms qui se terminent par "tsu" ou de noms qui ont une voyelle après "tsu" ...

Notes longues (o o, o u, u u)

Comme pour les notes longues, les longues notes de «o» et «u» ne sont pas écrites en principe. [^ 2] En d'autres termes, les noms tels que "Oono", "Kouta" et "Hyuga" sont "ono", "kota" et "hyuga".

[^ 2]: Au fait, le son long de "i" comme "Niina (nouveau légume)" est écrit, mais le son long de "-" comme "Nina" est écrit même s'il est phonétiquement le même. Non.

Cependant, il y a des exceptions, et le "o" à la fin (comme "Senoo") devient "oo". Le traitement est effectué dans la partie suivante.

kana.gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])Oh\z/){ "o" } #Traitement des exceptions à la fin
    .gsub(/(?<=[Oto])Oh/){ oh ? "h" : "" } # oOh
    .gsub(/(?<=[Okosotonohomoyorowogozodobopoyo])C/){ oh ? "h" : "" } # oC
    .gsub(/(?<=[Ukustunufumyurvuguzuzubupu])C/){ "" } # uC

Au fait, il semble qu'il soit permis d'écrire "oh" pour "o o" et "o u", donc je permet de basculer entre eux en option.

"Y a-t-il quelque chose qui ne va pas avec" o "? ], C'est tranchant. Cela sera expliqué plus tard.

Sujet principal: partie sombre

C'est tout pour les règles écrites dans les documents précédents du ministère des Affaires étrangères. Je suis sûr que certains d'entre vous ont peut-être pensé: "Quelle chose facile à faire".

Cependant, le problème est le "ton long" mentionné précédemment. Si c'est "long", suivez simplement les règles ci-dessus.

Mais avant cela, nous devons juger s'il s'agit d'une note longue ou non. De là, c'est le royaume des ténèbres ...

Pas de longues notes "o o" "o u" "u u"

"O o", "o u" et "u u" doivent être effacés uniformément en "o, u" à l'exception de la fin, mais "o o" et "o" Il peut y avoir des cas où la forme de "u" ou "u" n'est pas une longue note.

Par exemple, "Hirooka (Hirooka)", "Kouchiwa (fan de petit groupe)", "Matsuura (Matsuura)". [^ 3] Ceux-ci incluent "o o", "o u" et "u u", mais ils sont divisés comme "hiro" + "oka" et ne sont pas étendus à "low". , Et cela devient "hirooka".

[^ 3]: Les deux autres que "Hirooka" sont tirés de l'exemple du Saitama Prefecture Passport Center.

C'est une histoire relativement simple pour les humains de voir des kanji, mais comment une machine peut-elle juger cela ...

Pouvez-vous gérer cela avec seulement Kana?

Comme je l'ai écrit ci-dessus, il est relativement facile pour les humains de voir "Kanji". Donc, si vous n'avez que Frigana, y a-t-il un moyen de prendre une décision définitive?

… Malheureusement, je ne pense pas que ce soit possible. Par exemple, le "petit ventilateur" précédemment écrit est "ko" + "uchiwa", donc ce n'est pas un son long, mais disons que vous avez un nom de famille qui lit "kochiwa" en écrivant "Kochiwa". [^ 4] Même avec le même "kochiwa", le premier doit être converti en "kouchiwa" et le second en "kochiwa". En d'autres termes, il est impossible de s'en occuper uniquement avec kana.

[^ 4]: "Kodansen" semble être un vrai nom de famille, mais "Kochiwa" est un nom de famille fait pour l'explication et je ne sais pas s'il existe réellement.

Et si je donne également des données Kanji?

Alors, que diriez-vous de donner non seulement des données kana mais aussi des kanji? Ayez la lecture générale des kanji comme données, et vérifiez quelle partie de kana correspond à quel kanji, comme "Matsuura" + "Matsuura" → "Matsuura (Ura)". , Convertir pour chaque kanji ... Ensuite, l'exemple ci-dessus semble fonctionner. (Cela semble être très gênant ...)

Cependant, dans les documents du Ministère des affaires étrangères, il y a un exemple du nom de famille "Misono (Mizonosei)". Je pense que c'est "Mien (Sono) étudiant (U)", mais en lettres romaines, c'est "misono". ** Que voulez-vous dire! ** **

Correspondance avec un son non long "o o" tel que "hirooka"

En premier lieu, j'estime qu'il n'y a que deux types de «o-o» à long son, «o-o (grand, etc.)» et «trop (loin)». Par conséquent, comme indiqué ci-dessous, il semble que le nombre de noms pouvant être pris en charge puisse être augmenté en appliquant la règle «o-o» uniquement à «o-o» et «too».

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

Mais s'il y avait un nom comme "Hitooka", cela ne fonctionnerait pas.

En conclusion

C'est pourquoi j'ai abandonné ces noms et décidé d'être satisfait du taux de conversion de 99%. Si vous visez un taux de conversion plus élevé, je pense qu'il est tout à fait réaliste de disposer des données du nom de famille difficile à convertir et de le convertir exceptionnellement. Nous attendons le défi de ceux qui sont prêts à regarder dans les ténèbres.

Recommended Posts

J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
J'étais accro à la méthode du rouleau
J'étais accro au test Spring-Batch
J'étais accro à ne pas pouvoir me connecter à AWS-S3 à partir du conteneur Docker
J'ai été englouti par l'obscurité de Romaji essayant de convertir mon nom en Romaji
Je souhaite afficher le nom de l'affiche du commentaire
J'étais accro au réglage de laradock + VSCode + xdebug
J'ai essayé d'approfondir ma compréhension de l'orientation des objets de n%
Je veux limiter l'entrée en réduisant la plage de nombres
J'étais accro au paramètre API version min23 de registerTorchCallback
En vérifiant le fonctionnement de Java sous Linux, j'ai pu comprendre la compilation et la hiérarchie.
J'étais accro à la méthode du rouleau
[Circle CI] J'étais accro au test automatique de Circle CI (rails + mysql) [Memo]
J'étais accro au test Spring-Batch
Je veux obtenir le nom de champ du champ [Java]. (Vieux ton d'histoire)
Je veux que vous utilisiez Enum # name () pour la clé de SharedPreference
<Java> Quiz pour convertir par lots les noms de fichiers séparés par une chaîne de caractères spécifique avec une partie du nom de fichier
Je souhaite obtenir une liste de chaînes de caractères uniques uniquement en excluant les chaînes de caractères fixes du nom de fichier
Je veux var_dump le contenu de l'intention
J'ai essayé d'étudier le mécanisme d'Emscripten en l'utilisant avec un solveur allemand
La partie à laquelle j'étais accro dans "Introduction à Ajax dans les applications Web Java" de NetBeans
Notez que j'étais accro aux paramètres du projet Android d'IntelliJ IDEA
J'étais accro à NoSuchMethodError dans Cloud Endpoints
[Kotlin] Récupère le nom de l'argument du constructeur par réflexion
Convertit le tableau d'erreurs.full_messages en caractères et sortie
05. J'ai essayé de supprimer la source de Spring Boot
J'ai essayé de réduire la capacité de Spring Boot
Je veux connaître la réponse de l'application Janken
[Rails] Comment changer le nom de colonne de la table
[VBA] J'ai créé un outil pour convertir le type primitif de la classe Entity générée par Hibernate Tools en type de référence correspondant.
[Kotlin] Convertit ZonedDateTime en chaîne en spécifiant le format
Je veux retourner la position de défilement de UITableView!
J'ai dû déterminer où se trouvait le dossier des plugins eclipse sur mon Mac. (Note)
J'ai pu convertir une application GMS en support G + H en 10 minutes à l'aide de ToolKit
J'ai essayé d'implémenter la fonction similaire par communication asynchrone
Comment changer dynamiquement le nom de la colonne acquis par MyBatis
Ce à quoi j'étais accro lors de l'introduction de la bibliothèque JNI
Récupère le nom d'objet de l'instance créée par le nouvel opérateur
J'ai essayé de résumer les bases de kotlin et java
J'étais accro à la mise à jour de la déclaration dans MyBatis
Je souhaite modifier le paramètre de sortie du journal de UtilLoggingJdbcLogger
J'ai brièvement résumé la grammaire de base de Ruby
Ce à quoi j'étais accro avec l'API REST Redmine
Je veux mettre le JDK sur mon PC Mac
Je veux donner un nom de classe à l'attribut select
[Rails] Comment afficher une liste de messages par catégorie
[Ruby] Je souhaite inverser l'ordre de la table de hachage
L'histoire à laquelle j'étais accro lors de la création de STS
[Rails] Comment convertir l'URI de l'image envoyée par http en https lors de l'utilisation de l'API Twitter
Je veux juger de la nécessité de tester en comparant les différences des fichiers de classe lors de la refactorisation de Java.
J'ai essayé de me permettre de définir le délai pour le client Android UDP
[Controller] Je veux récupérer la valeur numérique d'une colonne spécifique de la base de données (mon mémo)
Quand j'étais inquiet des méthodes statiques dans l'interface java, je suis arrivé à l'ordre d'interprétation des noms
Quand j'ai retrouvé mon esprit sur Tribuo publié par Oracle, la personne à l'intérieur était une personne sexy.