first jiwoos commit
This commit is contained in:
32
mapping_overrides/README.md
Normal file
32
mapping_overrides/README.md
Normal file
@@ -0,0 +1,32 @@
|
||||
# Mapping Overrides
|
||||
|
||||
이 폴더는 `네이버 야구 텍스트 -> 관리자 사이트 입력 라벨` 매핑을 사람이 직접 검토하고 수정하기 쉽게 정리한 참조용 폴더입니다.
|
||||
|
||||
목적:
|
||||
- 자동입력 로직에서 쓰는 주요 매핑을 한 곳에 모아 보기 쉽게 관리
|
||||
- 새로운 예외 케이스가 생겼을 때 사용자가 직접 규칙을 추가
|
||||
- 코드 수정 전에 어떤 라벨이 어떤 의미인지 확인
|
||||
|
||||
현재 상태:
|
||||
- 이 폴더의 파일들은 "수정/검토용 참조 데이터"입니다.
|
||||
- 아직 모든 스크립트가 이 파일을 직접 읽는 구조는 아닙니다.
|
||||
- 즉, 지금은 사람이 안전하게 확인/편집하기 위한 기준 문서 역할입니다.
|
||||
- 표준 스키마는 [`standard_schema.md`](./standard_schema.md)를 따른다.
|
||||
|
||||
파일 설명:
|
||||
- `pitch_result_map.json`
|
||||
- 투구 결과 텍스트 매핑
|
||||
- `batter_result_map.json`
|
||||
- 타자 결과 타입/텍스트 매핑
|
||||
- `runner_event_map.json`
|
||||
- 주루 이벤트 매핑
|
||||
- `review_item_map.json`
|
||||
- 합의판정 항목/최종결과 매핑
|
||||
- `special_rules.md`
|
||||
- 특수 예외 규칙 정리
|
||||
|
||||
권장 사용법:
|
||||
1. 실제로 잘못 입력된 사례를 먼저 적습니다.
|
||||
2. 어떤 텍스트가 들어왔는지 확인합니다.
|
||||
3. 이 폴더의 JSON/문서에 원하는 매핑 규칙을 먼저 정리합니다.
|
||||
4. 그 다음 코드에 반영합니다.
|
||||
167
mapping_overrides/batter_result_map.json
Normal file
167
mapping_overrides/batter_result_map.json
Normal file
@@ -0,0 +1,167 @@
|
||||
{
|
||||
"by_type": {
|
||||
"walk": "포볼",
|
||||
"intentional_walk": "고의사구",
|
||||
"strikeout": "스윙 스트라이크-아웃",
|
||||
"hit_by_pitch": "몸에 맞는 볼",
|
||||
"single": "1루타",
|
||||
"double": "2루타",
|
||||
"triple": "3루타",
|
||||
"home_run": "홈런",
|
||||
"sacrifice_fly": "희생 플라이",
|
||||
"sacrifice_bunt": "희생 번트",
|
||||
"reach_on_error": "수비실책",
|
||||
"reach_on_fielder_choice": "야수선택",
|
||||
"bunt_hit": "번트안타",
|
||||
"double_play": "병살-아웃",
|
||||
"out": "아웃"
|
||||
},
|
||||
"by_text_priority": [
|
||||
{
|
||||
"contains_all_in_runner_text": ["보크", "진루"],
|
||||
"label": "보크-볼"
|
||||
},
|
||||
{
|
||||
"when_runner_event_type": "wild_pitch_advance",
|
||||
"label": "폭투-볼"
|
||||
},
|
||||
{
|
||||
"when_runner_event_type": "wild_pitch_advance",
|
||||
"when_last_pitch_contains_any": ["스트라이크", "헛스윙"],
|
||||
"label": "폭투-스트라이크"
|
||||
},
|
||||
{
|
||||
"when_runner_event_type": "passed_ball_advance",
|
||||
"label": "포일-볼"
|
||||
},
|
||||
{
|
||||
"when_runner_event_type": "passed_ball_advance",
|
||||
"when_last_pitch_contains_any": ["스트라이크", "헛스윙"],
|
||||
"label": "포일-스트라이크"
|
||||
},
|
||||
{
|
||||
"contains": "번트 아웃",
|
||||
"label": "번트-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "병살",
|
||||
"label": "병살-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "트리플-아웃",
|
||||
"label": "트리플-아웃"
|
||||
},
|
||||
{
|
||||
"contains_all": ["낫아웃", "폭투"],
|
||||
"label": "폭투 낫아웃 진루"
|
||||
},
|
||||
{
|
||||
"contains_all": ["낫아웃", "포일"],
|
||||
"label": "포일 낫아웃 진루"
|
||||
},
|
||||
{
|
||||
"contains": "낫아웃",
|
||||
"label": "스트라이크-낫아웃"
|
||||
},
|
||||
{
|
||||
"contains": "병살",
|
||||
"label": "병살-아웃"
|
||||
},
|
||||
{
|
||||
"contains_any": ["파울희생플라이", "파울 희생플라이"],
|
||||
"label": "희생 플라이"
|
||||
},
|
||||
{
|
||||
"contains": "파울플라이",
|
||||
"label": "파울플라이-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "희생 플라이",
|
||||
"label": "희생 플라이"
|
||||
},
|
||||
{
|
||||
"contains": "희생 번트",
|
||||
"label": "희생 번트"
|
||||
},
|
||||
{
|
||||
"contains_any": ["1루타 후 주루아웃", "1루타 후 주자아웃"],
|
||||
"label": "1루타 후 주루아웃"
|
||||
},
|
||||
{
|
||||
"contains_any": ["2루타 후 주루아웃", "2루타 후 주자아웃"],
|
||||
"label": "2루타 후 주루아웃"
|
||||
},
|
||||
{
|
||||
"contains_any": ["3루타 후 주루아웃", "3루타 후 주자아웃"],
|
||||
"label": "3루타 후 주루아웃"
|
||||
},
|
||||
{
|
||||
"contains": "몸에 맞는 타구",
|
||||
"label": "몸에 맞는 타구"
|
||||
},
|
||||
{
|
||||
"contains": "수비방해",
|
||||
"label": "수비방해"
|
||||
},
|
||||
{
|
||||
"contains": "루킹스트라이크-아웃",
|
||||
"label": "루킹스트라이크-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "스윙 스트라이크-아웃",
|
||||
"label": "스윙 스트라이크-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "스트라이크-아웃",
|
||||
"label": "스트라이크-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "파울희생플라이-아웃",
|
||||
"label": "파울희생플라이-아웃"
|
||||
},
|
||||
{
|
||||
"contains": "인필드플라이",
|
||||
"label": "인필드플라이"
|
||||
},
|
||||
{
|
||||
"contains_all": ["땅볼출루", "실책"],
|
||||
"label": "땅볼출루-실책"
|
||||
},
|
||||
{
|
||||
"contains": "땅볼출루",
|
||||
"label": "땅볼출루(무안타)"
|
||||
},
|
||||
{
|
||||
"contains_any": ["내야안타", "내야 안타"],
|
||||
"label": "내야안타"
|
||||
},
|
||||
{
|
||||
"contains": "야수선택",
|
||||
"label": "야수선택"
|
||||
},
|
||||
{
|
||||
"contains": "포일-낫아웃",
|
||||
"label": "포일-낫아웃"
|
||||
},
|
||||
{
|
||||
"contains": "폭투-스트라이크",
|
||||
"label": "폭투-스트라이크"
|
||||
},
|
||||
{
|
||||
"contains": "번트-파울-아웃",
|
||||
"label": "번트-파울-아웃"
|
||||
},
|
||||
{
|
||||
"contains_any": ["기타아웃", "기타 아웃"],
|
||||
"label": "기타아웃"
|
||||
},
|
||||
{
|
||||
"contains": "몸에 맞는 볼",
|
||||
"label": "몸에 맞는 볼"
|
||||
},
|
||||
{
|
||||
"contains": "고의사구",
|
||||
"label": "고의사구"
|
||||
}
|
||||
]
|
||||
}
|
||||
10
mapping_overrides/pitch_result_map.json
Normal file
10
mapping_overrides/pitch_result_map.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"볼": "볼",
|
||||
"스트라이크": "스트라이크(루킹)",
|
||||
"헛스윙": "헛스윙(스트라이크)",
|
||||
"번트헛스윙": "번트시도-스트라이크",
|
||||
"파울": "파울",
|
||||
"번트파울": "번트-파울",
|
||||
"고의사구": "고의사구",
|
||||
"자동 고의사구": "고의사구"
|
||||
}
|
||||
47
mapping_overrides/review_item_map.json
Normal file
47
mapping_overrides/review_item_map.json
Normal file
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"item_rules": [
|
||||
{
|
||||
"contains": "홈런",
|
||||
"item": "홈런타구 페어 파울",
|
||||
"result_group": ["페어", "파울"]
|
||||
},
|
||||
{
|
||||
"contains_any": ["내야타구 페어", "외야타구 페어", "페어/파울", "파울/페어"],
|
||||
"item": "외야타구 페어 파울",
|
||||
"result_group": ["페어", "파울"]
|
||||
},
|
||||
{
|
||||
"contains_any": ["세이프", "아웃", "태그", "견제", "도루"],
|
||||
"item": "포수/태그플레이 아웃/세이프",
|
||||
"result_group": ["아웃", "세이프"]
|
||||
},
|
||||
{
|
||||
"contains_any": ["포구", "바운드", "노바운드", "캐치"],
|
||||
"item": "야수의 포구",
|
||||
"result_group": ["아웃", "세이프"]
|
||||
},
|
||||
{
|
||||
"contains_any": ["몸에 맞는 공", "몸에 맞는 볼"],
|
||||
"item": "몸에 맞는 공",
|
||||
"result_group": ["인정", "불인정"]
|
||||
},
|
||||
{
|
||||
"contains_any": ["체크스윙", "헛스윙"],
|
||||
"item": "헛스윙",
|
||||
"result_group": ["인정", "불인정"]
|
||||
},
|
||||
{
|
||||
"contains": "파울",
|
||||
"item": "파울",
|
||||
"result_group": ["인정", "불인정"]
|
||||
},
|
||||
{
|
||||
"fallback": true,
|
||||
"item": "기타",
|
||||
"result_group": ["인정", "불인정"]
|
||||
}
|
||||
],
|
||||
"check_swing_rule": {
|
||||
"description": "체크스윙은 헛스윙 항목으로 처리한다. 최종 판정이 스윙이면 인정, 아니면 불인정이다."
|
||||
}
|
||||
}
|
||||
134
mapping_overrides/runner_event_map.json
Normal file
134
mapping_overrides/runner_event_map.json
Normal file
@@ -0,0 +1,134 @@
|
||||
{
|
||||
"default_by_type": {
|
||||
"advance": "일반 진루",
|
||||
"score": "일반 진루",
|
||||
"steal": "도루성공",
|
||||
"steal_fail": "도루실패아웃",
|
||||
"force_out": "포스아웃",
|
||||
"tag_out": "태그아웃",
|
||||
"error_advance": "수비 실책",
|
||||
"wild_pitch_advance": "폭투-진루성공",
|
||||
"passed_ball_advance": "기타 진루"
|
||||
},
|
||||
"priority_rules": [
|
||||
{
|
||||
"contains": "견제-세이프",
|
||||
"label": "견제-세이프"
|
||||
},
|
||||
{
|
||||
"contains": "견제사 아웃",
|
||||
"label": "견제 아웃"
|
||||
},
|
||||
{
|
||||
"contains": "도루사",
|
||||
"label": "도루사"
|
||||
},
|
||||
{
|
||||
"contains": "도실-세이프",
|
||||
"label": "도실-세이프"
|
||||
},
|
||||
{
|
||||
"contains_all": ["보크", "진루"],
|
||||
"label": "보크 진루"
|
||||
},
|
||||
{
|
||||
"contains": "보크",
|
||||
"label": "보크"
|
||||
},
|
||||
{
|
||||
"when_batter_result_contains_any": ["라인드라이브", "직선타"],
|
||||
"event_type_in": ["force_out", "tag_out"],
|
||||
"label": "베이스 터치 아웃"
|
||||
},
|
||||
{
|
||||
"contains": "몸에 맞는 타구",
|
||||
"label": "몸에 맞는 타구"
|
||||
},
|
||||
{
|
||||
"contains": "견제",
|
||||
"label": "견제 에러"
|
||||
},
|
||||
{
|
||||
"contains_all": ["도루", "실책"],
|
||||
"label": "도루성공&실책"
|
||||
},
|
||||
{
|
||||
"contains_all": ["이중도루 실패", "아웃"],
|
||||
"label": "도루실패아웃"
|
||||
},
|
||||
{
|
||||
"contains_all": ["실책", "무진루"],
|
||||
"label": "실책-무진루"
|
||||
},
|
||||
{
|
||||
"contains": "진루 방해",
|
||||
"label": "진루 방해"
|
||||
},
|
||||
{
|
||||
"contains": "보크 진루",
|
||||
"label": "보크 진루"
|
||||
},
|
||||
{
|
||||
"contains": "무관심도루",
|
||||
"label": "무관심도루"
|
||||
},
|
||||
{
|
||||
"contains": "도루 저지 에러",
|
||||
"label": "도루 저지 에러"
|
||||
},
|
||||
{
|
||||
"contains_all": ["이중도루 실패", "진루"],
|
||||
"label": "기타 진루"
|
||||
},
|
||||
{
|
||||
"contains_all": ["포일", "진루"],
|
||||
"label": "기타 진루"
|
||||
},
|
||||
{
|
||||
"contains_all": ["낫아웃", "폭투"],
|
||||
"label": "폭투 낫아웃 진루"
|
||||
},
|
||||
{
|
||||
"contains_all": ["낫아웃", "포일"],
|
||||
"label": "포일 낫아웃 진루"
|
||||
},
|
||||
{
|
||||
"when_batter_result_type": "walk",
|
||||
"event_type_in": ["advance", "score"],
|
||||
"label": "볼넷 진루"
|
||||
},
|
||||
{
|
||||
"contains": "실책",
|
||||
"event_type_in": ["advance", "score", "error_advance"],
|
||||
"label": "수비 실책"
|
||||
},
|
||||
{
|
||||
"contains": "사전 출발",
|
||||
"label": "사전 출발"
|
||||
},
|
||||
{
|
||||
"contains": "베이스 실수",
|
||||
"label": "베이스 실수"
|
||||
},
|
||||
{
|
||||
"contains": "수비방해",
|
||||
"label": "수비방해"
|
||||
},
|
||||
{
|
||||
"contains": "몸에 맞는 타구",
|
||||
"label": "몸에 맞는 타구"
|
||||
},
|
||||
{
|
||||
"contains_any": ["기타아웃", "기타 아웃"],
|
||||
"label": "기타아웃"
|
||||
},
|
||||
{
|
||||
"contains_any": ["기타세이프", "기타 세이프"],
|
||||
"label": "기타 세이프"
|
||||
},
|
||||
{
|
||||
"contains_any": ["기타진루", "기타 진루"],
|
||||
"label": "기타 진루"
|
||||
}
|
||||
]
|
||||
}
|
||||
107
mapping_overrides/special_rules.md
Normal file
107
mapping_overrides/special_rules.md
Normal file
@@ -0,0 +1,107 @@
|
||||
# Special Rules
|
||||
|
||||
이 문서는 JSON으로 넣기 애매한 예외 규칙을 적는 곳입니다.
|
||||
|
||||
## 병살
|
||||
- 타자 결과는 `병살-아웃`
|
||||
- 첫 번째 팝업:
|
||||
- 타자 결과 텍스트의 수비 시퀀스만 사용
|
||||
- 마지막 포스아웃/주자아웃 팝업:
|
||||
- `runner_event.text`의 수비 시퀀스만 사용
|
||||
|
||||
## 파울플라이
|
||||
- 파울라인 밖 좌표로 찍는다.
|
||||
- 기준 파울라인:
|
||||
- `(5, 50)` ~ `(50, 100)`
|
||||
- `(95, 50)` ~ `(50, 100)`
|
||||
- 파울플라이는 이 직선 밖이어야 한다.
|
||||
|
||||
## 일반 플라이
|
||||
- 일반 플라이는 파울라인 안쪽이어야 한다.
|
||||
- 즉 `좌익수/중견수/우익수`, `좌중간/우중간`, `중전` 쪽 플라이는 위의 파울라인 두 직선 안에 들어가야 한다.
|
||||
- 파울플라이와 일반 플라이는 좌표 규칙이 다르다.
|
||||
|
||||
## 파울희생플라이
|
||||
- 결과 라벨은 `희생 플라이`
|
||||
- 위치만 파울플라이처럼 처리
|
||||
|
||||
## 낫아웃
|
||||
- 일반 낫아웃: `스트라이크-낫아웃`
|
||||
- 폭투 낫아웃: `폭투 낫아웃 진루`
|
||||
- 포일 낫아웃: `포일 낫아웃 진루`
|
||||
|
||||
## 번트 헛스윙
|
||||
- 네이버 텍스트 `번트헛스윙` / `번트 헛스윙` 은 리포트에서 `BS` 로 저장한다.
|
||||
- 사이트에서는 `번트시도-스트라이크` 로 입력한다.
|
||||
|
||||
## 보크
|
||||
- `보크 진루`는 그대로 `보크 진루`
|
||||
- `보크 스트라이크`는 한 번에 처리하지 않는다.
|
||||
1. `보크` 입력
|
||||
2. 입력완료
|
||||
3. `스트라이크` 입력
|
||||
|
||||
## 포일/폭투/이중도루 실패 진루
|
||||
- 포일이나 이중도루 실패 시의 추가 진루는 `기타 진루`
|
||||
- 폭투는 `폭투-진루성공`
|
||||
- 주자가 폭투로 진루하는 상황에서는 마지막 투구 결과가 `볼`이면 `폭투-볼`, `스트라이크/헛스윙`이면 `폭투-스트라이크`로 처리한다.
|
||||
- 주자가 포일로 진루하는 상황에서는 마지막 투구 결과가 `볼`이면 `포일-볼`, `스트라이크/헛스윙`이면 `포일-스트라이크`로 처리한다.
|
||||
- 주자가 보크로 진루하는 상황에서는 마지막 투구 결과가 `볼`이면 `보크-볼`, `스트라이크/헛스윙`이면 `보크` 입력 후 추가로 스트라이크를 따로 입력한다.
|
||||
|
||||
## 라인드라이브 아웃
|
||||
- 타자 결과가 라인드라이브/직선타 아웃이면
|
||||
- 주자 아웃은 `포스아웃`, `태그아웃`보다 `베이스 터치 아웃` 우선
|
||||
|
||||
## 몸에 맞는 타구
|
||||
- 라벨은 `몸에 맞는 타구`
|
||||
- 타구 위치는 `1루수` 쪽
|
||||
- 타구 종류는 `땅볼`
|
||||
|
||||
## 실책 팝업
|
||||
- 포구 실책: 실책 선수 1회 클릭
|
||||
- 송구/악송구 실책: 같은 선수 2회 클릭
|
||||
|
||||
## 도루
|
||||
- 일반 도루: `도루성공`
|
||||
- 견제 실책 도루: `견제 에러`
|
||||
- 도루 후 실책 추가 진루: `도루성공&실책`
|
||||
|
||||
## 화면에 실제 보이는 주루/아웃 관련 라벨
|
||||
- `견제-세이프`
|
||||
- `견제 아웃`
|
||||
- `도루사`
|
||||
- `도실-세이프`
|
||||
- `실책-무진루`
|
||||
- `진루 방해`
|
||||
- `보크`
|
||||
- `도루 저지 에러`
|
||||
- `베이스 터치 아웃`
|
||||
- `베이스 실수`
|
||||
- `사전 출발`
|
||||
- `기타 세이프`
|
||||
- `기타아웃`
|
||||
|
||||
## 화면에 실제 보이는 타자 결과 라벨
|
||||
- `번트-아웃`
|
||||
- `병살-아웃`
|
||||
- `트리플-아웃`
|
||||
- `1루타 후 주루아웃`
|
||||
- `2루타 후 주루아웃`
|
||||
- `3루타 후 주루아웃`
|
||||
- `몸에 맞는 타구`
|
||||
- `수비방해`
|
||||
- `루킹스트라이크-아웃`
|
||||
- `스트라이크-아웃`
|
||||
- `포일-낫아웃`
|
||||
- `폭투-스트라이크`
|
||||
- `번트-파울-아웃`
|
||||
- `땅볼출루(무안타)`
|
||||
- `내야안타`
|
||||
- `야수선택`
|
||||
|
||||
## 야수 -> 투수 교체 문장
|
||||
- `야수 A : 투수 B (으)로 교체`는 잘못 붙은 네이버 텍스트일 가능성이 높다.
|
||||
- 보통 의미:
|
||||
- `A`는 `지명타자` 이동
|
||||
- `B`는 현재 투수 교체
|
||||
- 이 경우 `merged_pitcher_substitution`처럼 별도 취급한다.
|
||||
175
mapping_overrides/standard_schema.md
Normal file
175
mapping_overrides/standard_schema.md
Normal file
@@ -0,0 +1,175 @@
|
||||
# Standard Mapping Schema
|
||||
|
||||
이 문서는 `mapping_overrides` 폴더의 매핑 파일을 하나의 공통 형태로 정리하기 위한 기준입니다.
|
||||
|
||||
목표:
|
||||
- 매핑 파일마다 다른 키 이름과 구조를 줄인다
|
||||
- 단순 치환, 우선순위 룰, 그룹 선택 규칙을 같은 방식으로 읽게 한다
|
||||
- 코드 적용 전 사람이 검토하기 쉬운 형태를 유지한다
|
||||
|
||||
## 공통 원칙
|
||||
|
||||
- 모든 파일은 `schema_version`을 가진다.
|
||||
- 모든 규칙은 가능한 한 `ordered` 목록으로 표현한다.
|
||||
- 먼저 매칭되는 규칙이 우선한다.
|
||||
- 최종 저장값은 항상 표준값 1개다.
|
||||
- 예외 규칙은 일반 규칙보다 뒤가 아니라 우선순위 숫자로 조정한다.
|
||||
|
||||
## 공통 헤더
|
||||
|
||||
모든 JSON 매핑 파일은 아래 공통 헤더를 가진다.
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"kind": "alias_map",
|
||||
"id": "team_name_map",
|
||||
"description": "팀명 별칭을 표준 팀명으로 정규화한다",
|
||||
"field": "team_name"
|
||||
}
|
||||
```
|
||||
|
||||
필드 의미:
|
||||
- `schema_version`: 스키마 버전
|
||||
- `kind`: 파일 타입
|
||||
- `id`: 사람이 읽는 식별자
|
||||
- `description`: 파일 목적 설명
|
||||
- `field`: 이 매핑이 적용되는 대상 필드
|
||||
|
||||
## 스키마 종류
|
||||
|
||||
### 1. `alias_map`
|
||||
|
||||
단순 문자열 치환용 스키마다.
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"kind": "alias_map",
|
||||
"id": "game_type_map",
|
||||
"field": "game_type",
|
||||
"entries": [
|
||||
{ "source": "와일드카드", "target": "wildcard" },
|
||||
{ "source": "준플레이오프", "target": "semi_playoff" },
|
||||
{ "source": "플레이오프", "target": "playoff" },
|
||||
{ "source": "한국시리즈", "target": "korean_series" }
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
권장 사용처:
|
||||
- 팀명
|
||||
- 경기 구분
|
||||
- 구장명
|
||||
- 투구 결과처럼 문자열이 1:1로 대응되는 경우
|
||||
|
||||
### 2. `ordered_rule_map`
|
||||
|
||||
우선순위가 필요한 문자열 룰용 스키마다.
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"kind": "ordered_rule_map",
|
||||
"id": "batter_result_map",
|
||||
"field": "batter_result",
|
||||
"default": { "target": "아웃" },
|
||||
"rules": [
|
||||
{
|
||||
"priority": 100,
|
||||
"when": {
|
||||
"text_contains_any": ["병살", "더블플레이"]
|
||||
},
|
||||
"then": { "target": "병살-아웃" }
|
||||
},
|
||||
{
|
||||
"priority": 90,
|
||||
"when": {
|
||||
"result_type_in": ["walk"]
|
||||
},
|
||||
"then": { "target": "포볼" }
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
권장 조건 키:
|
||||
- `text_contains`
|
||||
- `text_contains_any`
|
||||
- `text_contains_all`
|
||||
- `event_type_in`
|
||||
- `result_type_in`
|
||||
- `last_pitch_contains_any`
|
||||
- `role_in`
|
||||
|
||||
권장 결과 키:
|
||||
- `target`: 표준 출력값
|
||||
- `group`: 선택 그룹 이름
|
||||
- `note`: 사람이 읽는 설명
|
||||
|
||||
### 3. `group_map`
|
||||
|
||||
판독/선택형 UI처럼 결과 그룹이 따로 필요한 규칙용 스키마다.
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": "1.0",
|
||||
"kind": "group_map",
|
||||
"id": "review_item_map",
|
||||
"field": "review_item",
|
||||
"items": [
|
||||
{
|
||||
"priority": 100,
|
||||
"when": { "text_contains_any": ["홈런"] },
|
||||
"item": "홈런타구 페어 파울",
|
||||
"result_group": ["페어", "파울"]
|
||||
},
|
||||
{
|
||||
"priority": 10,
|
||||
"fallback": true,
|
||||
"item": "기타",
|
||||
"result_group": ["인정", "불인정"]
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
권장 사용처:
|
||||
- 합의판정 항목
|
||||
- 결과 버튼 2개 이상이 붙는 UI
|
||||
|
||||
### 4. `special_rules`
|
||||
|
||||
JSON으로 표현하기 어려운 예외는 문서로 남긴다.
|
||||
|
||||
권장 항목:
|
||||
- 조건
|
||||
- 예외 사유
|
||||
- UI 처리 순서
|
||||
- 금지 규칙
|
||||
|
||||
## 현재 파일의 표준화 방향
|
||||
|
||||
- `pitch_result_map.json`
|
||||
- `alias_map`으로 정리
|
||||
- `batter_result_map.json`
|
||||
- `ordered_rule_map`으로 정리
|
||||
- `runner_event_map.json`
|
||||
- `ordered_rule_map`으로 정리
|
||||
- `review_item_map.json`
|
||||
- `group_map`으로 정리
|
||||
- `special_rules.md`
|
||||
- `special_rules` 문서로 유지
|
||||
|
||||
## 우선순위 규칙
|
||||
|
||||
- 숫자가 큰 규칙이 먼저다.
|
||||
- 같은 priority면 위에서 아래 순서가 우선이다.
|
||||
- `fallback: true`는 마지막 규칙만 허용한다.
|
||||
|
||||
## 표준값 규칙
|
||||
|
||||
- 저장값은 항상 하나의 표준 문자열이어야 한다.
|
||||
- 표준 문자열은 코드에서 다시 해석하지 않아도 되도록 짧고 일관되게 유지한다.
|
||||
- 별칭, 공백, 한국어/영문 혼용은 입력 단계에서만 흡수한다.
|
||||
|
||||
Reference in New Issue
Block a user