新增学习资料生成器模块(learner),从权威库生成多维日语学习资料: - 拼音/假名/汉字/熟字训四类索引,带拼音↔假名↔汉字交叉跳转 - 逐字音训分类(KANJIDIC2 精确查表 + 启发式回退 + 排序键) - 音变标注体系:浊化(連濁)、半浊化、促音变(促音便)、连声(れんじょう) 独立配色 + 合并逻辑 + 音变规律说明 - 显式标注表:rendaku_marks(连用形连浊)、renjou_marks(连声) - 每索引独立例词数配置(jlearn.toml + --config) - HTML 单页应用 + 静态 HTML + PDF(playwright) 清洗工具增强: - 拼音校验器(pinyin_checker)集成到 jclean - 多音字拼音校正、ます形サ変動詞转原型 数据: - 权威库补充连声词(反応/天皇/陰陽/観音/因縁/三位/輪廻/安穏) - KANJIDIC2 音训分类表、拼音校正字典 整理 .gitignore:忽略生成产物(output/study_materials)、词典数据库、 任务运行日志、备份文件
78 lines
2.6 KiB
Python
78 lines
2.6 KiB
Python
"""连浊关联模块测试。"""
|
|
from pl_japanese.learner.rendaku import (
|
|
to_dakuon, to_handakuon, to_seion, rendaku_variants, find_rendaku_links,
|
|
load_rendaku_marks,
|
|
)
|
|
|
|
|
|
class TestDakuon:
|
|
def test_seion_to_dakuon(self):
|
|
assert to_dakuon('はこ') == 'ばこ' # 箱
|
|
assert to_dakuon('かみ') == 'がみ' # 紙
|
|
assert to_dakuon('と') == 'ど'
|
|
assert to_dakuon('す') == 'ず'
|
|
|
|
def test_no_dakuon_returns_none(self):
|
|
assert to_dakuon('あき') is None # あ 不可浊化
|
|
assert to_dakuon('') is None
|
|
|
|
def test_handakuon(self):
|
|
assert to_handakuon('はし') == 'ぱし'
|
|
assert to_handakuon('ほん') == 'ぽん'
|
|
|
|
def test_handakuon_only_h_row(self):
|
|
assert to_handakuon('かみ') is None # か 行无半浊
|
|
|
|
def test_to_seion(self):
|
|
assert to_seion('ばこ') == 'はこ'
|
|
assert to_seion('がみ') == 'かみ'
|
|
assert to_seion('ぱし') == 'はし'
|
|
|
|
def test_to_seion_none_for_seion(self):
|
|
assert to_seion('はこ') is None # 已是清音
|
|
|
|
|
|
class TestRendakuVariants:
|
|
def test_seion_variants(self):
|
|
# はこ → ばこ(浊)、ぱこ(半浊)
|
|
variants = rendaku_variants('はこ')
|
|
assert 'ばこ' in variants
|
|
assert 'ぱこ' in variants
|
|
|
|
def test_dakuon_variant(self):
|
|
# ばこ → はこ(清)
|
|
assert 'はこ' in rendaku_variants('ばこ')
|
|
|
|
|
|
class TestFindLinks:
|
|
def test_links_within_dataset(self):
|
|
# 数据集里同时有 はこ 和 ばこ 才建立关联
|
|
all_kana = {'はこ', 'ばこ', 'かみ', 'がみ', 'あき'}
|
|
links = find_rendaku_links(all_kana)
|
|
assert 'ばこ' in links['はこ']
|
|
assert 'はこ' in links['ばこ']
|
|
assert 'がみ' in links['かみ']
|
|
assert 'あき' not in links # 无变体,不建关联
|
|
|
|
def test_missing_variant_not_linked(self):
|
|
# ばこ 不在数据集,はこ 不应关联到它
|
|
all_kana = {'はこ', 'かみ'}
|
|
links = find_rendaku_links(all_kana)
|
|
assert 'はこ' not in links # ばこ/ぱこ 都不在集合
|
|
|
|
|
|
class TestRendakuMarks:
|
|
"""显式连浊标注表测试(连用形连浊)。"""
|
|
|
|
def test_load_marks(self):
|
|
marks = load_rendaku_marks()
|
|
# 表里应包含连用形连浊条目
|
|
assert marks['付|づけ'] == 'つ'
|
|
assert marks['引|びき'] == 'ひ'
|
|
assert marks['語|がたり'] == 'かた'
|
|
|
|
def test_mark_key_format(self):
|
|
"""标注表 key 必须是 汉字|读音 格式。"""
|
|
for key in load_rendaku_marks():
|
|
assert '|' in key, f'标注 key 缺 | 分隔: {key}'
|