-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathresult2word.py
126 lines (97 loc) · 4.23 KB
/
result2word.py
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
import sys
BASE_IDX = 0xAC00
MAPPING_TABLE = {
'g': 'ㄱ', 'gg': 'ㄲ', 'kh': 'ㅋ', 'g2': 'ㄱ',
'n': 'ㄴ', 'n2': 'ㄴ',
'd': 'ㄷ', 'dd': 'ㄸ', 't': 'ㅌ', 'd2': 'ㄷ',
'l': 'ㄹ', 'l2': 'ㄹ',
'm': 'ㅁ', 'm2': 'ㅁ',
'b': 'ㅂ', 'bb': 'ㅃ', 'p': 'ㅍ', 'b2': 'ㅂ',
's': 'ㅅ', 'ss': 'ㅆ',
'ng': 'ㅇ',
'j': 'ㅈ', 'jj': 'ㅉ', 'ch': 'ㅊ',
'h': 'ㅎ',
'i': 'ㅣ', 'wi': 'ㅟ', 'eu': 'ㅡ', 'u': 'ㅜ',
'e': 'ㅔ', 'oe': 'ㅚ', 'o': 'ㅗ',
'ae': 'ㅐ', 'eo': 'ㅓ',
'a': 'ㅏ',
'ya': 'ㅑ', 'yae': 'ㅒ', 'yeo': 'ㅕ', 'ye': 'ㅖ',
'wae': 'ㅙ', 'yo': 'ㅛ', 'wo': 'ㅝ', 'we': 'ㅞ',
'yu': 'ㅠ', 'ui': 'ㅢ', 'wa': 'ㅘ'
}
CHOSUNG = (
"ㄱ", "ㄲ", "ㄴ", "ㄷ", "ㄸ", "ㄹ", "ㅁ", "ㅂ",
"ㅃ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅉ", "ㅊ", "ㅋ",
"ㅌ", "ㅍ", "ㅎ")
JUNGSUNG = (
"ㅏ", "ㅐ", "ㅑ", "ㅒ", "ㅓ", "ㅔ", "ㅕ", "ㅖ",
"ㅗ", "ㅘ", "ㅙ", "ㅚ", "ㅛ", "ㅜ", "ㅝ", "ㅞ",
"ㅟ", "ㅠ", "ㅡ", "ㅢ", "ㅣ")
JONGSUNG = (
"", "ㄱ", "ㄲ", "ㄳ", "ㄴ", "ㄵ", "ㄶ", "ㄷ",
"ㄹ", "ㄺ", "ㄻ", "ㄼ", "ㄽ", "ㄾ", "ㄿ", "ㅀ",
"ㅁ", "ㅂ", "ㅄ", "ㅅ", "ㅆ", "ㅇ", "ㅈ", "ㅊ",
"ㅋ", "ㅌ", "ㅍ", "ㅎ")
def parse_text(src, dst):
input_file = open(src, 'r')
l = input_file.readlines()
seq = l[1].split(' ')
phone_word_list = [[]]
phone_word_idx = 0
for i in range(1, len(seq)):
if seq[i] == '' or seq[i] == '\n': continue
elif seq[i] == 'SIL': # 띄어쓰기일 경우
phone_word_idx+=1
phone_word_list.append([])
else: phone_word_list[phone_word_idx].append(seq[i].split('_')[0])
input_file.close()
word_list = []
for word_idx in range(len(phone_word_list)):
current_idx = 0
word_list.append('')
if len(phone_word_list[word_idx]) == 0: # 빈 array이면 넘어감
continue
while(True):
if current_idx >= len(phone_word_list[word_idx]): break # 현재 인덱스가 array 크기 초과하면 넘어감
el = phone_word_list[word_idx][current_idx]
# 자음 없이 모음으로 시작하는 경우를 감지
flag = False
for mo in 'aeiouw':
if mo in el:
flag = True
if flag:
cho = 'ㅇ'
else:
cho = MAPPING_TABLE[phone_word_list[word_idx][current_idx]]
current_idx += 1
# 다음 글자가 마지막이고 그 글자가 종성이거나, 다음 글자가 마지막이 아닌데 종성 초성이 연달아 나온다면 받침이 있는 경우
if (current_idx + 2 == len(phone_word_list[word_idx]) \
and MAPPING_TABLE[phone_word_list[word_idx][current_idx+1]] in JONGSUNG) \
or (current_idx + 2 < len(phone_word_list[word_idx]) \
and MAPPING_TABLE[phone_word_list[word_idx][current_idx+1]] in JONGSUNG \
and MAPPING_TABLE[phone_word_list[word_idx][current_idx+2]] in CHOSUNG):
jung = MAPPING_TABLE[phone_word_list[word_idx][current_idx]]
jong = MAPPING_TABLE[phone_word_list[word_idx][current_idx+1]]
cho_idx = CHOSUNG.index(cho)
jung_idx = JUNGSUNG.index(jung)
jong_idx = JONGSUNG.index(jong)
word_list[word_idx] += chr(0xAC00 + ((cho_idx*21)+jung_idx)*28+jong_idx)
current_idx += 2
else: # 받침이 없는 경우
jung = MAPPING_TABLE[phone_word_list[word_idx][current_idx]]
cho_idx = CHOSUNG.index(cho)
jung_idx = JUNGSUNG.index(jung)
word_list[word_idx] += chr(0xAC00 + ((cho_idx*21)+jung_idx)*28)
current_idx += 1
word_list = [el for el in word_list if el != '']
# 파일로 저장
f = open(dst, 'w')
for word in word_list:
f.write(word + ' ')
f.close()
if __name__ == '__main__':
print(sys.argv[1], sys.argv[2])
parse_text(sys.argv[1], sys.argv[2])
# src = '/home/marble/PycharmProjects/ali/1595071594619/temp.txt'
# dst = '/home/marble/PycharmProjects/ali/1595071594619/result.txt'
# parse_text(src, dst)