Add comprehensive detailed design documents

This commit is contained in:
misyaguziya
2025-10-14 07:28:03 +09:00
parent fcb1295302
commit d1aef28c7a
20 changed files with 8590 additions and 0 deletions

View File

@@ -0,0 +1,465 @@
# 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"),
# ティ・トゥ・ドゥ
("ティー", ""),
("パーティー", "pātī"),
("トゥー", ""),
("ドゥー", "")
]
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`: 文脈依存ルール
- 外部のひらがな↔カタカナ変換モジュール(必要に応じて)
## 将来の改善点
- 更なる外来語音への対応
- 文脈依存の読み分け機能
- パフォーマンス最適化
- より詳細なヘボン式バリエーション対応
- 音韻変化ルールの追加