File size: 5,604 Bytes
41bdb13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f101223
 
 
41bdb13
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9d7970d
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207

import re
import unicodedata

jp_pos_to_en_pos = {
    '投': 'P',
    '捕': 'C',
    '一': '1B',
    '二': '2B',
    '三': '3B',
    '遊': 'SS',
    '左': 'LF',
    '中': 'CF',
    '右': 'RF',
    '右中': 'RCF',
    '左中': 'LCF'
}

def translate_pa_outcome(outcome):

  partial_outcomes = {
      'ファウルフライ': 'FF',
      'ファウルライナー': 'FL',
      'ゴロ': 'GB',
      'フライ': 'FB',
      'ライナー': 'LD',
      '安打': '1B',
      '2塁打': '2B',
      '3塁打': '3B',
      'ランニング本塁打': 'IHR', # inside-the-park home run
      '本塁打': 'HR',
      '犠打': 'SH',
      '犠飛': 'SF',
      '併殺打': 'DP', # what about triple plays?
      'エラー': 'E',
      '犠打野選': 'SH FC',
      '野選': 'FC'
  }

  if outcome.endswith('三振'):
    if outcome.startswith('空振り'):
      return 'K'
    elif outcome.startswith('見逃し'):
      return 'inv_K'
  elif outcome == '四球':
    return 'BB'
  elif outcome == '死球':
    return 'HBP'
  elif outcome == '敬遠(申告敬遠)':
    return 'IBB'
  elif outcome == 'スリーバント失敗':
    return 'bunt_K' # have to confirm
  elif outcome == '犠打失':
    return 'failed_SH' # have to confirm
  elif outcome == '犠飛失':
    return 'failed_SF' #have to confirm
  elif outcome.endswith('走塁妨害'):
    return 'obstruction'
  elif outcome.endswith('走塁妨害'):
    return 'dropped_K_safe'
  elif outcome == '振り逃げ' or '暴投' in outcome:
    return 'WP' # reached base on WP; on another search, 振り逃げ is an uncaught third strike
  elif outcome.endswith('塁けん制 アウト'):
    return outcome.replace('塁けん制 アウト', 'B PK')
  elif 'けん制アウト' in outcome:
    return 'XB PK' # pickoff at unknown base
  elif outcome == '守備妨害':
    return 'defensive_interference'
  elif '盗塁失敗' in outcome:
    return 'CS'
  elif tag_search:= re.search(r'[123本](・[123本])*塁(間|上)タッチアウト', outcome):
    outcome = unicodedata.normalize('NFKC', tag_search.group(0))
    outcome = outcome.replace('本', 'H')
    bases = re.findall(r'\d|H', outcome)
    return ' '.join(bases) + 'TO' # tag out
  elif '捕逸' in outcome:
    return 'PB' # reached base on passed ball

  for _outcome in partial_outcomes.keys():
    if outcome.endswith(_outcome):
      return f'{jp_pos_to_en_pos[outcome.removesuffix(_outcome)]} {partial_outcomes[_outcome]}'

  return outcome

jp_pitch_to_en_pitch = {
    # fastballs
    'ストレート': '4-Seam Fastball',
    'ツーシーム': '2-Seam Fastball',
    'カットボール': 'Cutter',
    'ワンシーム': '1-Seam Fastball',
    'シンカー': 'Sinker',
    'シュート': 'Shootball',

    # breaking balls
    'スライダー': 'Slider',
    '縦スライダー': 'Vertical Slider',
    '高速スライダー': 'Hard Slider',
    'スラーブ': 'Slurve',
    'カーブ': 'Curveball',
    'ナックルカーブ': 'Knuckle Curve',
    'スローカーブ': 'Slow Curve',
    'パワーカーブ': 'Power Curve',
    'スクリュー': 'Screwball',

    # off speed
    'チェンジアップ': 'Changeup',
    'スプリット': 'Splitter',
    'フォーク': 'Forkball',
    'パーム': 'Palmball',

    # other
    'スローボール': 'Eephus',
}

jp_pitch_to_pitch_code = {
    # fastballs
    'ストレート': 'FF',
    'ツーシーム': 'FT',
    'カットボール': 'FC',
    'ワンシーム': 'FE',
    'シンカー': 'SI',
    'シュート': 'SH',

    # breaking balls
    'スライダー': 'SL',
    '縦スライダー': 'VS',
    '高速スライダー': 'HS',
    'スラーブ': 'SV',
    'カーブ': 'CU',
    'ナックルカーブ': 'KC',
    'スローカーブ': 'CS',
    'パワーカーブ': 'PC',
    'スクリュー': 'SC',

    # off speed
    'チェンジアップ': 'CH',
    'スプリット': 'FS',
    'フォーク': 'FO',
    'パーム': 'PA',

    # other
    'スローボール': 'EP',
}

def translate_pitch_outcome(outcome):

  partial_outcomes = {
      '失': 'E',
      '犠打': 'SH',
      '犠飛': 'SF',
      '邪直': 'FLD', # foul line drive
      '邪飛': 'FF',
      'ゴロ': 'GB',
      '飛': 'FB',
      '直': 'LD',
      '安': '1B',
      '2': '2B',
      '3': '3B',
      '走本': 'IHR', # inside-the-park home run, should confirm
      '本': 'HR',
      '併打': 'DP',
      '犠野': 'SH FC',
      '野選': 'FC'

  }

  if outcome == 'ボール':
    return 'B'
  elif outcome == 'ファウル':
    return 'F'
  elif outcome == '空振り':
    return 'SS' # swinging strike
  elif outcome == '見逃し':
    return 'LS' # swinging strike
  elif outcome == '空三振':
    return 'K'
  elif outcome == '見三振':
    return 'inv_K'
  elif outcome == 'バ三振':
    return 'bunt_K'
  elif outcome == '四球':
    return 'BB'
  elif outcome == '死球':
    return 'HBP'
  elif outcome == '犠打失':
    return 'SH_E' # or SBE? sac hit error
  elif outcome == '犠飛失':
    return 'SF_E' # sac fly error
  elif outcome == '走妨':
    return 'obstruction'
  elif outcome == '反則投球':
    return 'illegal_pitch'
  elif outcome == '守妨':
    return 'defensive_interference'
  elif outcome == '暴振逃':
    return 'WP_S'
  elif outcome == '逸振逃':
    return 'PB_S'

  for _outcome in partial_outcomes.keys():
    if outcome.endswith(_outcome):
      return f'{jp_pos_to_en_pos[outcome.removesuffix(_outcome)]} {partial_outcomes[_outcome]}'

  return outcome

max_pitch_types = len(jp_pitch_to_en_pitch)