리뷰 지적(포터블에서 transformers 제외 -> NLLB 로드 실패)을 고치려고 실제
NLLB 를 받아 돌려봤고, 그 과정에서 용어집이 사실상 동작하지 않고 있었다는
것을 발견했다. 단위 테스트는 "모델이 자리표시자를 통과시킨다"는 틀린 전제
위에 서 있었다.
1) 포터블 패키징 (리뷰 지적)
transformers 를 제외 목록에서 빼고 hiddenimports 에 넣었다. NLLB
토크나이저가 AutoTokenizer 를 쓰기 때문이다. transformers 는 torch 가
없으면 토크나이저 전용 모드로 뜨며 그게 우리 용도와 정확히 맞는다.
torch 없는 환경에서 ctranslate2/transformers/faster-whisper import 와
앱 기동을 검증하는 test_portable.py 를 추가했다.
2) 자리표시자 형식 (실측으로 발견)
`⟦0⟧` 는 NLLB 가 괄호를 날려 생존률 0/3 이었다. 용어가 자막에서 그냥
사라지고 있었다 ("Third party incoming" -> "0 들어오는"). 후보 8종을
실제 모델로 비교해 `#0#` 로 교체 (3/3, 다중 4/5).
3) 소실 대비
모델이 문장 일부를 누락하면 자리표시자도 사라진다. 그대로 복원하면
용어가 증발하므로, 하나라도 없으면 보호 없이 재번역한다.
4) 서술어는 문장 전체일 때만 (whole_only)
절/서술어를 문장 중간에서 치환하면 문법이 무너진다.
before: "탄 필요해와 구급상자"
after : "탄약과 구급상자가 필요합니다"
해당 56개 항목을 whole_only 로 지정해 단독 발화일 때만 적용한다.
("Cover me!" -> "엄호해줘" 는 그대로 유지)
5) 조사 교정
역어 받침이 달라 "자기장를" 이 남던 것을 fix_particles() 로 고친다.
을/를, 이/가, 은/는, 과/와, (으)로 — 한글 코드에서 받침을 읽어 판정.
검증: pytest 189개 통과, ruff clean
실제 NLLB-600M(torch 없이 CPU)로 번역 품질 직접 확인
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
323 lines
5.9 KiB
JSON
323 lines
5.9 KiB
JSON
{
|
|
"key": "streaming",
|
|
"name": "방송·스트리밍",
|
|
"description": "해외 방송을 볼 때 자주 나오는 말. 게임 용어집과 같이 켜면 좋습니다.",
|
|
"scope": "generic",
|
|
"entries": [
|
|
{
|
|
"source": "stream",
|
|
"targets": {
|
|
"ko": "방송",
|
|
"ja": "配信",
|
|
"zh": "直播"
|
|
}
|
|
},
|
|
{
|
|
"source": "streamer",
|
|
"targets": {
|
|
"ko": "스트리머",
|
|
"ja": "配信者",
|
|
"zh": "主播"
|
|
}
|
|
},
|
|
{
|
|
"source": "chat",
|
|
"targets": {
|
|
"ko": "채팅",
|
|
"ja": "チャット",
|
|
"zh": "弹幕"
|
|
}
|
|
},
|
|
{
|
|
"source": "donation",
|
|
"targets": {
|
|
"ko": "후원",
|
|
"ja": "投げ銭",
|
|
"zh": "打赏"
|
|
}
|
|
},
|
|
{
|
|
"source": "donate",
|
|
"targets": {
|
|
"ko": "후원하다",
|
|
"ja": "投げ銭する",
|
|
"zh": "打赏"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "sub",
|
|
"targets": {
|
|
"ko": "구독",
|
|
"ja": "サブスク",
|
|
"zh": "订阅"
|
|
}
|
|
},
|
|
{
|
|
"source": "subscriber",
|
|
"targets": {
|
|
"ko": "구독자",
|
|
"ja": "登録者",
|
|
"zh": "订阅者"
|
|
}
|
|
},
|
|
{
|
|
"source": "follow",
|
|
"targets": {
|
|
"ko": "팔로우",
|
|
"ja": "フォロー",
|
|
"zh": "关注"
|
|
}
|
|
},
|
|
{
|
|
"source": "raid",
|
|
"targets": {
|
|
"ko": "합방 몰아주기",
|
|
"ja": "レイド",
|
|
"zh": "转播"
|
|
}
|
|
},
|
|
{
|
|
"source": "mod",
|
|
"targets": {
|
|
"ko": "매니저",
|
|
"ja": "モデレーター",
|
|
"zh": "房管"
|
|
}
|
|
},
|
|
{
|
|
"source": "clip",
|
|
"targets": {
|
|
"ko": "클립",
|
|
"ja": "クリップ",
|
|
"zh": "切片"
|
|
}
|
|
},
|
|
{
|
|
"source": "highlight",
|
|
"targets": {
|
|
"ko": "하이라이트",
|
|
"ja": "ハイライト",
|
|
"zh": "高光"
|
|
}
|
|
},
|
|
{
|
|
"source": "VOD",
|
|
"targets": {
|
|
"ko": "다시보기",
|
|
"ja": "アーカイブ",
|
|
"zh": "录播"
|
|
}
|
|
},
|
|
{
|
|
"source": "lag",
|
|
"targets": {
|
|
"ko": "렉",
|
|
"ja": "ラグ",
|
|
"zh": "卡"
|
|
}
|
|
},
|
|
{
|
|
"source": "ping",
|
|
"targets": {
|
|
"ko": "핑",
|
|
"ja": "ピン",
|
|
"zh": "延迟"
|
|
}
|
|
},
|
|
{
|
|
"source": "frame drop",
|
|
"targets": {
|
|
"ko": "프레임 드랍",
|
|
"ja": "フレーム落ち",
|
|
"zh": "掉帧"
|
|
}
|
|
},
|
|
{
|
|
"source": "patch",
|
|
"targets": {
|
|
"ko": "패치",
|
|
"ja": "パッチ",
|
|
"zh": "补丁"
|
|
}
|
|
},
|
|
{
|
|
"source": "meta",
|
|
"targets": {
|
|
"ko": "메타",
|
|
"ja": "メタ",
|
|
"zh": "版本环境"
|
|
}
|
|
},
|
|
{
|
|
"source": "nerf",
|
|
"targets": {
|
|
"ko": "너프",
|
|
"ja": "ナーフ",
|
|
"zh": "削弱"
|
|
}
|
|
},
|
|
{
|
|
"source": "buff",
|
|
"targets": {
|
|
"ko": "버프",
|
|
"ja": "バフ",
|
|
"zh": "加强"
|
|
}
|
|
},
|
|
{
|
|
"source": "ranked",
|
|
"targets": {
|
|
"ko": "랭크",
|
|
"ja": "ランク",
|
|
"zh": "排位"
|
|
}
|
|
},
|
|
{
|
|
"source": "casual",
|
|
"targets": {
|
|
"ko": "일반전",
|
|
"ja": "カジュアル",
|
|
"zh": "休闲"
|
|
}
|
|
},
|
|
{
|
|
"source": "smurf",
|
|
"targets": {
|
|
"ko": "부계정",
|
|
"ja": "サブ垢",
|
|
"zh": "小号"
|
|
}
|
|
},
|
|
{
|
|
"source": "grind",
|
|
"targets": {
|
|
"ko": "노가다",
|
|
"ja": "周回",
|
|
"zh": "刷"
|
|
}
|
|
},
|
|
{
|
|
"source": "carry",
|
|
"targets": {
|
|
"ko": "캐리",
|
|
"ja": "キャリー",
|
|
"zh": "带飞"
|
|
}
|
|
},
|
|
{
|
|
"source": "throw",
|
|
"targets": {
|
|
"ko": "던지다",
|
|
"ja": "スローする",
|
|
"zh": "送"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "griefing",
|
|
"targets": {
|
|
"ko": "트롤링",
|
|
"ja": "荒らし",
|
|
"zh": "演员"
|
|
}
|
|
},
|
|
{
|
|
"source": "toxic",
|
|
"targets": {
|
|
"ko": "매너 나쁜",
|
|
"ja": "民度が低い",
|
|
"zh": "喷子"
|
|
}
|
|
},
|
|
{
|
|
"source": "cracked",
|
|
"targets": {
|
|
"ko": "미쳤다",
|
|
"ja": "ヤバい",
|
|
"zh": "太强了"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "insane",
|
|
"targets": {
|
|
"ko": "대박",
|
|
"ja": "やばい",
|
|
"zh": "离谱"
|
|
}
|
|
},
|
|
{
|
|
"source": "clutch",
|
|
"targets": {
|
|
"ko": "클러치",
|
|
"ja": "クラッチ",
|
|
"zh": "关键时刻"
|
|
}
|
|
},
|
|
{
|
|
"source": "let's go",
|
|
"targets": {
|
|
"ko": "가자",
|
|
"ja": "行くぞ",
|
|
"zh": "冲"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "no way",
|
|
"targets": {
|
|
"ko": "말도 안 돼",
|
|
"ja": "ありえない",
|
|
"zh": "不可能吧"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "give me a second",
|
|
"targets": {
|
|
"ko": "잠깐만",
|
|
"ja": "ちょっと待って",
|
|
"zh": "等一下"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "hold on",
|
|
"targets": {
|
|
"ko": "잠깐",
|
|
"ja": "待って",
|
|
"zh": "等等"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "be right back",
|
|
"targets": {
|
|
"ko": "금방 올게",
|
|
"ja": "すぐ戻る",
|
|
"zh": "马上回来"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "thanks for the sub",
|
|
"targets": {
|
|
"ko": "구독 고마워",
|
|
"ja": "サブありがとう",
|
|
"zh": "谢谢订阅"
|
|
},
|
|
"whole_only": true
|
|
},
|
|
{
|
|
"source": "welcome back",
|
|
"targets": {
|
|
"ko": "다시 왔네",
|
|
"ja": "おかえり",
|
|
"zh": "欢迎回来"
|
|
},
|
|
"whole_only": true
|
|
}
|
|
]
|
|
}
|