# transliteration_kana_to_hepburn.py - カタカナ→ヘボン式変換 ## 概要 カタカナ文字列を標準的なヘボン式ローマ字に変換するモジュールです。マクロン(長音記号)対応、外来語音の変換、促音・撥音処理など、日本語のローマ字表記に必要な機能を包括的に提供します。 ## 主要機能 ### 標準的なヘボン式変換 - カタカナ文字の基本ローマ字変換 - マクロン(ā ī ū ē ō)による長音表現 - 連続母音表記の選択的対応 ### 特殊音処理 - 促音(ッ)の適切な子音重複処理 - 撥音(ン)のm/n使い分け - 長音符(ー)の前母音延長処理 ### 外来語対応 - シェ(she)、チェ(che)等の組み合わせ - ヴ音(vu, va, vi, ve, vo)の変換 - ファ行(fa, fi, fe, fo)の処理 ## 主要関数 ### katakana_to_hepburn ```python def katakana_to_hepburn(kata: str, use_macron: bool = True) -> str ``` カタカナ文字列をヘボン式ローマ字に変換 #### パラメータ - **kata**: 変換対象のカタカナ文字列 - **use_macron**: マクロン使用フラグ(True=ā ī ū ē ō、False=aa ii uu ee oo) #### 戻り値 - **str**: ヘボン式ローマ字文字列(小文字) ## 使用方法 ### 基本的な変換 ```python from models.transliteration.transliteration_kana_to_hepburn import katakana_to_hepburn # 基本的なカタカナ変換 result1 = katakana_to_hepburn("カタカナ") print(result1) # "katakana" # 長音のマクロン表記 result2 = katakana_to_hepburn("コンピューター", use_macron=True) print(result2) # "konpyūtā" # 長音の連続母音表記 result3 = katakana_to_hepburn("コンピューター", use_macron=False) print(result3) # "konpyuutaa" ``` ### 特殊音の処理 ```python # 促音(ッ)の処理 result1 = katakana_to_hepburn("キャッチ") print(result1) # "kyatchi" result2 = katakana_to_hepburn("マッチャ") print(result2) # "matcha" # 撥音(ン)の処理 result3 = katakana_to_hepburn("ホンバン") # ホン+バン print(result3) # "homban" (n→m変換) result4 = katakana_to_hepburn("ホンテン") # ホン+テン print(result4) # "honten" (nのまま) ``` ### 外来語音の変換 ```python # 外来語特殊音 result1 = katakana_to_hepburn("シェア") print(result1) # "shea" result2 = katakana_to_hepburn("チェック") print(result2) # "chekku" result3 = katakana_to_hepburn("ジェット") print(result3) # "jetto" # ヴ音の処理 result4 = katakana_to_hepburn("ヴァイオリン") print(result4) # "vaiorin" result5 = katakana_to_hepburn("ヴィーナス") print(result5) # "vīnasu" # ファ行の処理 result6 = katakana_to_hepburn("ファイル") print(result6) # "fairu" result7 = katakana_to_hepburn("フィルム") print(result7) # "firumu" ``` ### 長音処理の詳細 ```python # 長音符(ー)の処理 result1 = katakana_to_hepburn("スーパー", use_macron=True) print(result1) # "sūpā" result2 = katakana_to_hepburn("パーティー", use_macron=True) print(result2) # "pātī" # ou → ō の変換(東京型) result3 = katakana_to_hepburn("トウキョウ", use_macron=True) print(result3) # "tōkyō" # 連続母音表記との比較 result4 = katakana_to_hepburn("トウキョウ", use_macron=False) print(result4) # "toukyou" ``` ### 複雑な組み合わせ ```python # 拗音(ゃゅょ)の組み合わせ test_cases = [ ("キャンプ", "kyanpu"), ("シュート", "shūto"), ("チョコレート", "chokorēto"), ("ギュウニュウ", "gyūnyū"), ("リュックサック", "ryukkusakku"), ("ピョンピョン", "pyonpyon") ] for kata, expected in test_cases: result = katakana_to_hepburn(kata) print(f"{kata} -> {result}") # キャンプ -> kyanpu # シュート -> shūto # チョコレート -> chokorēto # ギュウニュウ -> gyūnyū # リュックサック -> ryukkusakku # ピョンピョン -> pyonpyon ``` ## 変換ルール詳細 ### 基本音対応表 ```python base_mapping = { # 清音 'ア':'a', 'イ':'i', 'ウ':'u', 'エ':'e', 'オ':'o', 'カ':'ka', 'キ':'ki', 'ク':'ku', 'ケ':'ke', 'コ':'ko', 'サ':'sa', 'シ':'shi', 'ス':'su', 'セ':'se', 'ソ':'so', 'タ':'ta', 'チ':'chi', 'ツ':'tsu', 'テ':'te', 'ト':'to', 'ナ':'na', 'ニ':'ni', 'ヌ':'nu', 'ネ':'ne', 'ノ':'no', 'ハ':'ha', 'ヒ':'hi', 'フ':'fu', 'ヘ':'he', 'ホ':'ho', 'マ':'ma', 'ミ':'mi', 'ム':'mu', 'メ':'me', 'モ':'mo', 'ヤ':'ya', 'ユ':'yu', 'ヨ':'yo', 'ラ':'ra', 'リ':'ri', 'ル':'ru', 'レ':'re', 'ロ':'ro', 'ワ':'wa', 'ヲ':'wo', 'ン':'n', # 濁音・半濁音 'ガ':'ga', 'ギ':'gi', 'グ':'gu', 'ゲ':'ge', 'ゴ':'go', 'ザ':'za', 'ジ':'ji', 'ズ':'zu', 'ゼ':'ze', 'ゾ':'zo', 'ダ':'da', 'ヂ':'ji', 'ヅ':'zu', 'デ':'de', 'ド':'do', 'バ':'ba', 'ビ':'bi', 'ブ':'bu', 'ベ':'be', 'ボ':'bo', 'パ':'pa', 'ピ':'pi', 'プ':'pu', 'ペ':'pe', 'ポ':'po', # 特殊音 'ヴ':'vu' } ``` ### 拗音組み合わせ ```python digraphs_mapping = { # キャ行 ('キ','ャ'):'kya', ('キ','ュ'):'kyu', ('キ','ョ'):'kyo', ('ギ','ャ'):'gya', ('ギ','ュ'):'gyu', ('ギ','ョ'):'gyo', # シャ行 ('シ','ャ'):'sha', ('シ','ュ'):'shu', ('シ','ョ'):'sho', ('ジ','ャ'):'ja', ('ジ','ュ'):'ju', ('ジ','ョ'):'jo', # チャ行 ('チ','ャ'):'cha', ('チ','ュ'):'chu', ('チ','ョ'):'cho', # その他の拗音 ('ニ','ャ'):'nya', ('ヒ','ャ'):'hya', ('ビ','ャ'):'bya', ('ピ','ャ'):'pya', ('ミ','ャ'):'mya', ('リ','ャ'):'rya', # 外来語音(ファ行等) ('フ','ァ'):'fa', ('フ','ィ'):'fi', ('フ','ェ'):'fe', ('フ','ォ'):'fo', ('シ','ェ'):'she', ('チ','ェ'):'che', ('テ','ィ'):'ti', ('ツ','ァ'):'tsa', ('ツ','ィ'):'tsi', ('ツ','ェ'):'tse', ('ツ','ォ'):'tso', # ヴ音組み合わせ ('ヴ','ァ'):'va', ('ヴ','ィ'):'vi', ('ヴ','ェ'):'ve', ('ヴ','ォ'):'vo', ('ヴ','ュ'):'vyu' } ``` ### マクロン変換規則 ```python macron_rules = { 'aa': 'ā', # カア → kā 'ii': 'ī', # キイ → kī 'uu': 'ū', # クウ → kū 'ee': 'ē', # ケエ → kē 'oo': 'ō', # コオ → kō 'ou': 'ō' # コウ → kō(東京型長音) } ``` ## 特殊処理アルゴリズム ### 促音(ッ)処理 ```python def handle_sokuon(current_pos, kata_string, result_list): """促音の処理アルゴリズム""" # 次の音を確認 if current_pos + 1 < len(kata_string): next_kana = kata_string[current_pos + 1] # 次の音のローマ字を取得 next_roman = get_next_roman(next_kana, kata_string[current_pos + 1:]) # 子音部分を抽出して重複 consonant = extract_initial_consonant(next_roman) if consonant: result_list.append(consonant[0]) # 先頭子音を重複 # 促音自体は消費 return current_pos + 1 # 例: # マッチャ -> ma + tcha (ッ -> t重複) -> matcha # キャッチ -> kya + tchi (ッ -> t重複) -> kyatchi ``` ### 撥音(ン)処理 ```python def handle_hatsuon(roman_string): """撥音のm/n使い分け処理""" # n の後に b/p/m が続く場合は m に変換 import re # パターン: n + [bmp] -> m + [bmp] result = re.sub(r'n(?=[bmp])', 'm', roman_string) return result # 例: # ホンバン -> honban -> homban # サンポ -> sanpo -> sampo # コンマ -> konma -> komma # but: ホンテン -> honten (変更なし) ``` ### 長音符(ー)処理 ```python def handle_choonpu(roman_list): """長音符の前母音延長処理""" result = [] i = 0 while i < len(roman_list): if roman_list[i] == '-': # 長音符マーカー if i > 0: prev_char = result[-1] # 直前の文字 if prev_char in 'aiueo': # 前が母音なら重複(後でマクロン処理) result.append(prev_char) # else: 子音の場合は無視 else: result.append(roman_list[i]) i += 1 return result # 例: # スー -> su + - -> suu -> sū (マクロン処理後) # パーティー -> pa + - + ti + - -> paatii -> pātī ``` ## 実装例・テストケース ### 基本テストセット ```python def run_basic_tests(): """基本変換テストセット""" test_cases = [ # 基本音 ("アイウエオ", "aiueo"), ("カキクケコ", "kakikukeko"), ("サシスセソ", "sashisuseso"), # 濁音・半濁音 ("ガギグゲゴ", "gagigugego"), ("ザジズゼゾ", "zajizuzezo"), ("バビブベボ", "babibubebo"), ("パピプペポ", "papipupepo"), # 特殊音 ("シャシュショ", "shashusho"), ("チャチュチョ", "chachucho"), ("ジャジュジョ", "jajujo"), # 促音 ("アッパ", "appa"), ("イッキ", "ikki"), ("エッサ", "essa"), # 撥音 ("アンパン", "ampan"), ("コンマ", "komma"), ("ホンテン", "honten") ] for kata, expected in test_cases: result = katakana_to_hepburn(kata) assert result == expected, f"Failed: {kata} -> {result} (expected {expected})" print(f"✓ {kata} -> {result}") run_basic_tests() ``` ### 外来語テストセット ```python def run_foreign_word_tests(): """外来語変換テストセット""" foreign_tests = [ # ファ行 ("ファイル", "fairu"), ("フィルム", "firumu"), ("フェイス", "feisu"), ("フォント", "fonto"), # シェ・チェ ("シェア", "shea"), ("シェル", "sheru"), ("チェック", "chekku"), ("チェイン", "chein"), # ヴ音 ("ヴァイオリン", "vaiorin"), ("ヴィーナス", "vīnasu"), ("ヴェール", "vēru"), ("ヴォーカル", "vōkaru"), # ティ・トゥ・ドゥ ("ティー", "tī"), ("パーティー", "pātī"), ("トゥー", "tū"), ("ドゥー", "dū") ] for kata, expected in foreign_tests: result = katakana_to_hepburn(kata, use_macron=True) print(f"✓ {kata} -> {result}") # 実際のexpectedとの比較は実装依存 run_foreign_word_tests() ``` ### 長音テストセット ```python def run_long_vowel_tests(): """長音処理テストセット""" long_vowel_tests = [ # マクロンあり ("コーヒー", "kōhī", True), ("スーパー", "sūpā", True), ("パーティー", "pātī", True), ("トウキョウ", "tōkyō", True), # ou -> ō # マクロンなし ("コーヒー", "koohii", False), ("スーパー", "suupaa", False), ("パーティー", "paatii", False), ("トウキョウ", "toukyou", False) ] for kata, expected, use_macron in long_vowel_tests: result = katakana_to_hepburn(kata, use_macron=use_macron) print(f"✓ {kata} -> {result} (macron={use_macron})") run_long_vowel_tests() ``` ## パフォーマンス考慮事項 ### 効率的な処理 - 単一パス処理による高速変換 - 正規表現の最小限使用 - 辞書ルックアップの最適化 ### メモリ効率 - 文字列連結の最適化 - 不要な中間オブジェクトの削減 - 大量テキスト処理への対応 ## 制限事項・注意点 ### 変換精度の制限 - 文脈に依存する読み分けは非対応 - 固有名詞の特殊読みは非対応 - 方言・古語の特殊音は非対応 ### ヘボン式の範囲 - 標準的なヘボン式に準拠 - 一部の外来語音は近似変換 - 撥音の文脈依存ルールは簡略化 ### 入力制限 ```python # 適切な入力例 good_inputs = ["カタカナ", "シャープ", "コンピューター"] # 問題のある入力例 problematic_inputs = [ "ひらがな", # ひらがな混在(処理されるがそのまま) "English", # 英字混在(処理されるがそのまま) "123数字", # 数字混在(処理されるがそのまま) "", # 空文字列(空文字列を返す) ] # 混在入力の処理例 mixed_result = katakana_to_hepburn("カタカナと英語English") print(mixed_result) # "katakanaと英語english" ``` ## 関連モジュール - `transliteration_transliterator.py`: メイン転写クラス - `transliteration_context_rules.py`: 文脈依存ルール - 外部のひらがな↔カタカナ変換モジュール(必要に応じて) ## 将来の改善点 - 更なる外来語音への対応 - 文脈依存の読み分け機能 - パフォーマンス最適化 - より詳細なヘボン式バリエーション対応 - 音韻変化ルールの追加