こんにちは!
大学生の時から、プログラミングを学びはじめ、今回初めてブログを書いてみます。
みなさんは外国の方から「自分の名前って日本語で書いたらどうなるの?」と聞かれたことはありませんか?
私も聞かれたことがあるのですが、なかなかすぐに答えるのは難しいですよね。
そこで今回は、英語の名前を日本語の漢字風に変換してみるプログラムをPythonで作ってみました。
完成したコード
import random
sound_to_kanji = {
"ja": ["邪", "蛇", "雅"],
"da": ["田", "打", "雫"],
"ka": ["香", "花", "加"],
"ki": ["希", "貴", "紀"],
"ch": ["知", "千", "智"],
"ke": ["慧", "景", "桂"],
"ko": ["光", "湖", "幸"],
"sa": ["沙", "咲", "佐"],
"shi": ["志", "詩", "紫"],
"su": ["澄", "寿", "須"],
"se": ["聖", "瀬", "世"],
"so": ["聡", "蘇", "曽"],
"ta": ["多", "太", "汰"],
"te": ["天", "照", "典"],
"to": ["翔", "登", "藤"],
"na": ["菜", "奈", "那"],
"ni": ["仁", "新", "虹"],
"ne": ["音", "根", "寧"],
"no": ["乃", "野", "能"],
"ha": ["羽", "葉", "波"],
"hi": ["陽", "日", "妃"],
"fu": ["風", "富", "芙"],
"he": ["平", "辺", "碧"],
"ho": ["穂", "帆", "保"],
"ma": ["真", "舞", "麻"],
"mi": ["美", "実", "巳"],
"m": ["夢", "武", "睦"],
"me": ["芽", "愛", "明"],
"mo": ["望", "桃", "藻"],
"ya": ["也", "八", "夜"],
"yu": ["優", "由", "祐"],
"yo": ["世", "陽", "代"],
"ra": ["羅", "蘭", "螺"],
"la": ["羅", "蘭", "螺"],
"li": ["利", "李", "吏"],
"ru": ["琉", "瑠", "流"],
"le": ["連", "恋", "蓮"],
"re": ["連", "恋", "蓮"],
"lo": ["路", "呂", "芦"],
"ck": ["玖", "句"],
"sh": ["紫", "志", "詩"],
"th": ["聖", "帝", "泰"],
"phi": ["日", "富", "干"],
"qu": ["久", "究", "球"],
"vi": ["微", "美", "維"],
"va": ["馬", "葉", "芭"],
"wi": ["外", "初", "憂"],
"x": ["克", "久", "疾"],
"z": ["善", "瑞", "図"],
"ly": ["理", "里", "利"],
"b": ["武", "歩", "分"],
"ca": ["加", "華", "佳"],
"co": ["小", "弧", "己"],
"tho": ["素", "蘇", "祖"],
"jo": ["徐", "序", "所"],
"s": ["須", "素", "栖"],
"a": ["亜", "愛", "安"],
"e": ["恵", "江", "慧"],
"i": ["伊", "以", "衣"],
"o": ["央", "桜", "王"],
"u": ["羽", "宇", "有"],
}
def sort_syllables_key(s):
# 子音+母音のように2文字以上のものを優先する
consonant_priority = 1 if len(s) > 1 else 0
return (consonant_priority, len(s))
def name_to_kanji(name):
name = name.lower()
# 母音が先にマッチしないように、長い音節から順番に探す
syllables = sorted(sound_to_kanji.keys(), key=sort_syllables_key, reverse=True)
print("Syllables order:", syllables)
result = ""
while name:
matched = False
for s in syllables:
if name.startswith(s):
print(f"Matched syllable: {s}")
result += random.choice(sound_to_kanji[s])
name = name[len(s):]
matched = True
break
if not matched:
print(f"Skipping '{name[0]}'")
name = name[1:]
return result
if __name__ == "__main__":
while True:
english_name = input("\nEnter an English name (or 'q' to quit): ").strip()
if english_name.lower() in ["q", "quit", "exit"]:
print("終了します。")
break
kanji_version = name_to_kanji(english_name)
print(f"漢字風表記: {kanji_version}")
ポイント① 名前の音を漢字に対応づける
まず「sound_to_kanji
」という辞書を作り、
「英語の音 → 漢字の候補」という対応表を用意しています。
たとえば:
-
"da"
→ 「田」「打」「雫」 -
"ka"
→ 「香」「花」「加」 -
"jo"
→ 「徐」「序」「所」
のように、よくある音と漢字を対応させました。
今回の辞書ではよく使われる文字やローマ字を主に登録してみました。
ポイント② 母音が先に変換されてしまう問題
最初に作ったときは、
「da」を入れても「a」と誤認識される
という問題が起きてしまいました。
理由は、プログラムが 「短い音(a)」を先にチェックしてしまっていた からです。
解決方法
そこで、長い音(da, shi, chi,など)を優先して探すように、
sorted()
でキーを並べ替えました。
これで "da"
と入力したとき、最初に "da"
を見つけてくれるので、 "a"
に取られることがなくなりました。
実際に動かしてみる
Enter an English name (or 'q' to quit): daniel
Syllables order: ['shi', 'phi', 'tho', 'ja', 'da', 'ka', 'ki', 'ch', 'ke', 'ko', 'sa', 'su', 'se', 'so', 'ta', 'te', 'to', 'na', 'ni', 'ne', 'no', 'ha', 'hi', 'fu', 'he', 'ho', 'ma', 'mi', 'me', 'mo', 'ya', 'yu', 'yo', 'ra', 'la', 'li', 'ru', 'le', 're', 'lo', 'ck', 'sh', 'th', 'qu', 'vi', 'va', 'wi', 'ly', 'ca', 'co', 'jo', 'm', 'x', 'z', 'b', 's', 'l', 'a', 'e', 'i', 'o', 'u']
Matched syllable: da
Matched syllable: ni
Matched syllable: e
Matched syllable: l
漢字風表記: 雫虹江留
ちゃんと 「da」→「雫」 が変換されました!
まとめ
このプログラムでは、英語の名前を日本語の「音」に分解して、対応する漢字を当てはめることができます。外国の人に「名前を日本語で書いたらどうなるの?」と聞かれたときに、入力するとすぐに結果が出てきます。
ただし、今回の辞書にはすべての音が入っているわけではないです。また「da」を「デ」と読んで別の漢字を当てるなど、日本語の発音に合わせた工夫はまだできていません。まだまだ改良の余地が残っているので、辞書にすべての音を網羅したり、同じ音で複数の漢字を使い分けたりする工夫を加えると、より自然で汎用性が高い変換ができるようになると思います。