0. 들어가는 말
한글을 입력하면 철자 그대로 충실히 IPA로 자동 전사하는 '기계'에 대해서는 다른 글에서 소개하였습니다. 본 글에서는 거기에서 한걸음 더 나아가 transformer 모델을 이용해서 한글 철자 입력하면 구어체 서울한국어 발화형을 예측하는 모델을 다룹니다.
혹시 그냥 "한글"을 쓰면 [hɑŋɡɯl]로 자동전사해주기 원하시면 아래 페이지를 참고해주세요.
https://linguisting.tistory.com/84
내가 만든 Hangul to IPA가 큰 호응을 얻는 게 참 신기하다. 언어치료사 분들이나 언어치료 공부하시는 분들께 특히 도움이 된 것 같아 기쁘다.
그러나 그 툴에 한계가 두 개 있다.
한계1:
그건 아주 오래 전 R로 구현했던 '논리적 표면형 도출 장치'에 단순히 UI를 입힌 것이기 때문에, 처음부터 끝까지 R로 구현했다. 몇몇 분들 지적처럼 파이썬으로 코드가 제공되지 않아 재사용이 어렵다.
한계2:
그리고 무엇보다 규칙기반이다. G2P conversion을 위해서는 규칙기반이 항상 옳지 않을 수 있다.
그런데 사실 두 한계 모두 크게 문제가 되지는 않는다. R로 짰더라도 직관적으로 짰기 때문에 파이썬으로 구현하고 싶으면 그냥 파이썬으로 포팅(porting)하든가 아님 어찌어찌했나 로직 따라 다시 짜면 된다. 한계 2도 사실 대미지가 없는데 왜냐면 그 툴의 목적이 음운론적이기 때문이다. 그저 표면형을 도출해내는 것보다는 음운 규칙에 더 포커스가 있다. 그래서 규칙을 적용한다/안한다를 선택할 수 있도록 되어있다.
마지막으로, 댓글을 쓰셨다가 내가 답변을 다니까 지우신 분이 있었는데, 머신러닝을 이용해서 같은 task를 구현해보면 어떻겠냐는 제안이 있었다.
마침 주말에 잠시 시간이 되어서 1transformer model을 이용해 "한글 쓰면 [hɑŋɡɯl]로 전사하는 기계"를 재구현했다. Transformer model은 sequence-to-sequence encoder-decoder model이다. Fairseq툴킷을 이용해서 만들었다. Fairseq에 입문하던 이야기는 [여기]있다.
목차
1. 학습 자료
한글 집어넣으면 IPA로 변환시켜주는 건 여기에 이미 있으니까, 기왕 할거면 아스트랄하고 미친 기계를 만들어내야겠다는 집념 하에, 자연발화 코퍼스인 Seoul Corpus of Spontaneous Speech 일체를 집어넣었다. 2
이게 왜 아스트랄하고 미친짓이냐하면, 이 기계가 진짜로 성공하면 "오빠 뭐 먹었어요?" 를 마치 "오빠 머머거써여?" [op*ɑ mʌmʌɡʌs*ʌjʌ] 처럼 전사할 것이기 때문이다.ㅋㅋㅋㅋㅋ 한글을 넣으면 싸이월드 말투로 만들어드립니다. IPA 표기는 덤 [정말 그렇게 전사하나 확인하기]
1.1 준비물: Seoul Corpus
Seoul Corpus는 각자 준비해오셔요! CC BY-NC 2.0 라이선스로 배포되고 [이곳] 등에서 다운로드 가능함. 자 이제 Seoul Corpus 있다는 전제하에, 나는 'utt.ortho.' tier에 있는 한글 입력형과 'phoneme' tier에 있는 음소 전사형을 원데이터로 삼았다. 아래에 있는 그림을 보시라.
예를 들어 "거리도 정말 많이 변했고요"와 "p0 yv nn aa kk uu yv" 가 학습 데이터다. 변했고요를 벼나꾸여 처럼 발음했다.
1.2 textgrid에서 학습 데이터 추출
이 일은 음성 녹음 부분이랑은 상관 없으니까, 서울코퍼스의 .textgrid 파일만 보면 된다. 근데 .textgrid 파일이 240개이고, 각각의 파일에서 수작업으로 추출해내는 건 불가능하니까 아래의 파이썬 스크립트 textgrid_parser.py
를 썼다. 이 스크립트의 main
function은, 모든 .textgrid 파일들이 들어있는 경로를 textgrid_path
argument로 받고, 입력형(한글철자)과 출력형(IPA 전사형) 추출한 결과를 저장할 경로를 output_path
argument로 받는다.
worker.py
는 뭐냐, 악성코드 아니냐 할 수 있는데, 악성코드 아니다. 한글 자모 분리하고 "Seoul Corpus 특색 전사기호"를 IPA에 가까운 전사기호로 바꿔주는 귀찮은 작업 하는 스크립트다. 혹시 한글을 자모분리하는 거 어떻게 하나 궁금하면 3 worker.py
의 to_jamo
function보자.
textgrid_parser.py
의 main
function을 돌리면 나오는 결과는 아래와 같이 파일 2개다. ur-sr.ur
은 입력형인 한글자모 분리된 파일이고, ur-sr.sr
은 출력형인 IPA 전사 파일. 4
각 줄이 서로 대응된다. 예를 들어 284번째 줄을 보자. 아마도 "벽보에 네" 라고 말하려고 했던 것 같다.
UR: ㅂㅕㄱㅂㅗㅔ ㄴㅔ
SR: p jʌ k p* o ɛ n ɛ
자! 이제 ur-sr.sr
과 ur-sr.ur
두 파일로 transformer 모델을 훈련해보자. Transformer 모델은 딥러닝 모델 중 하나이다.
2. 도출은 곧 번역이라는 패러다임
본격적으로 기계학습 모델 훈련하기 전에, 진짜 거칠게 음운론이 뭐하는 건지 잠깐 말해보자. 음운론은 음운 과정(phonological process)에 대한 학문이다. 즉, 입력형이 이래 저래 어떻게 해서 출력형으로 도출되는데, 그걸 어떻게 하느냐에 대한 연구다. 입력형은 통사부나 형태부, 의미부 등 음운부 외부의 장치로부터 주어지고, 음운부는 열심히 여러 과정들을 이래저래 적용해서 음성장치(스피커)에다가 내보낼 형태를 도출해낸다. 5
쉽게 다시 말하면, 형태부가 얼기설기 반쯤 완성된 퍼즐을 던져주면 음운부가 "으이구 형태부 이 모지리같은 morphology" 이러며 반짝반짝🌟한 발음형을 만든다. 그 반짝반짝한 발음형을 받은 음성학은 또 "으이구 왜 logy로 끝나는 애들은 왜 다 모지리같냐 morphology phonology" 이러며 물리적으로 입과 혀를 움직여 발음되는 형태를 만들겠지.
어쨌든, 음운부가 하는 일은 [이것] 을 받아서 [저것] 으로 변환하는 일이다.
기계번역이랑 비슷하다. [English is difficult]를 받아서 [영어는 어려워] 으로 변환하는 게 기계번역이다. 6
따라서 한글입력형이 뭔지 모를 과정들을 여럿 거친 다음 뚝딱하고 IPA출력형으로 나오는 것도 기계번역의 일종으로 생각하자.
sequence to sequence encoder-decoder model인 Transformer 모델들은 기계번역에 잘 쓰인다. 그러므로 아마도 한글도 IPA로 잘 변환할 것이다.
3. 모델 훈련하기
훈련과정은 주요 포인트만 언급하고 jupyter notebook로 갈음하고자 한다. 아래에 업로드했다.
fairseq-train \
"bin" \
--fp16 \
--arch transformer_tiny \
--task translation \
--source-lang ur \
--target-lang sr \
--share-all-embeddings \
--reset-optimizer \
--optimizer adam \
--adam-betas '(0.9, 0.98)' \
--clip-norm 0.0 \
--lr 5e-4 \
--lr-scheduler inverse_sqrt \
--warmup-updates 4000 \
--warmup-init-lr 1e-07 \
--dropout 0.1 \
--weight-decay 0.0 \
--criterion cross_entropy \
--save-dir "model_output_transformer" \
--log-format json \
--log-interval 100 \
--max-tokens 8000 \
--max-epoch 200 \
--seed 3921 \
--maximize-best-checkpoint-metric \
--batch-size 32
뭐 주목할 만한 건 아키텍처는 transformer-tiny
를 사용했고, 80-10-10 (training-validation-test) 비율로 학습 데이터를 나누었다. 즉, 80% 데이터로 학습함. 100 epochs 돌렸다가 underfitting인 듯하여 100 epochs를 추가로 돌렸다. 즉 총 200 epochs. 그러나 여전히 underfit인 듯하다.
learning curve (loss)는 아래와 같다. 앞부분 50 epochs는 생략.
Google colab에서 T4 runtime으로 100 epoch를 돌리는데 1시간 정도가 걸렸다.
3.1 중간 평가
epoch 200이 validation loss 기준으로 최적이라서 checkpoint200.pt
에서 어떤 퍼포먼스를 보이나 야매로 평가해보았다.
여러번 실험을 했다.
실험1: "너무 졸립니다."
이건 필수적 위치동화 (졸립니다 => 졸림니다) 할줄 아는지 확인하기 위한 것이다. 잘 하는 것같다. 근데 "너무 졸렴니다" 라고 말을.... 할... 수도 있겠지?ㅋㅋㅋㅋ
n ʌ m u tɕ o l l jʌ m m i t ɑ
실험2: "저희 분가할래요."
이건 수의적 작용을 얼마나 재현해내는가를 보기 위함이다 (분가 => 붕가) .
놀랍게도??? 붕가한다! 기계는 "저이붕가알래여" 라고 전사했다. 엄청 ㅋㅋㅋㅋㅋ 재수없어.ㅋㅋㅋㅋ
tɕ ʌ i p u ŋ k ɑ ɑ l l ɛ jʌ
실험3: "나름 자연스러운가요?" 아 이 결과는 좀. "나름자연스러우가항겨" 라니???? 안드로메다 어디쯤에서 한국어를 한다면 이렇게 하려나.
n ɑ l ɯ m tɕ ɑ jʌ n s ɯ l ʌ u k ɑ h ɑ ŋ k jʌ
실험4: "물질" 그리고 "질소" 이건 개인적으로 정말 관심있는 지점이다. 한국어의 ㄹ경음화는 한자어에만 적용된다. 더 흥미롭게도 ㄹ뒤에 치경음(alveolar sound)인 ㅈㄷㅅ만 경음화된다! 두 배로 신기한 음운 작용. 한자어가 아니면 ㄹ뒤에 치경음이 경음화 안 되고 한자어면 ㄹ뒤에 치경음이 경음화된다. 제주도에서 하는 것은 '물질'[물질] 인데, 삼라만상을 구성하는 건 '물질'[물찔]物質 이다.
이제 닥치고 기계가 뭐라고 전사했나 보자.
물질 [m u l tɕ i l]
질소 [tɕ i l s* o]
물질은, 한자어일수도 아닐수도 있기 때문에 ㄹ경음화를 안하는 것도 맞고 하는 것도 맞다. 질소는 반드시 한자어이기 때문에 반드시 경음화해서 [질쏘]가 되어야 한다. 정확하게 해냈다. 와 이건 좀 신기했다.
실험4.5: 물건, 불가
그렇다면 '물건'과 '불가'는 어떤가? 물건과 불가는 한자어지만 ㄹ뒤에 오는 자음이 치경음이 아니다. 그래서 경음화를 하면 안 된다.
이제 닥치고 기계가 뭐라고 전사했나 또 보자.
물건 [m u l k ʌ n]
불가 [p u l k ɑ]
👏👏👏👏
실험 5: "오빠, 뭐 먹었어요?"
수미상관을 위하여 "오빠 뭐 먹었어요?"도 전사 시켜보자.
오빠 뭐 먹었어요? [o p* ɑ m o m ʌ k ʌ s* ʌ jʌ]
3.2 이렇게 좋은 모델 타이어보다 싸다
내가 기른 아이는 아니지만 checkpoint200.pt
기특하다. 그래서 공유한다. (용량이 커서 드롭박스 링크로 공유한다)
4. 다음 단계
인터페이스를 입혔다 [여기]. 자모-IPA 쌍으로 training했기 때문에 입력을 자모로만 받는다는 점에서 불편했는데, 인터페이스를 쓰면 편하게 한글 입력형으로 쓸 수 있다.
- 아래에 댓글창이 열려있습니다. 로그인 없이도 댓글 다실 수 있습니다.
- 글과 관련된 것, 혹은 글을 읽고 궁금한 것이라면 무엇이든 댓글을 달아주세요.
- 반박이나 오류 수정을 특히 환영합니다.
- 로그인 없이 비밀글을 다시면, 거기에 답변이 달려도 보실 수 없습니다. 답변을 받기 원하시는 이메일 주소 등을 비밀글로 남겨주시면 이메일로 답변드리겠습니다.
- 여기는 2월 17일부터 19일까지 long weekend이었다 [본문으로]
- Yun, W., Yoon, K., Park, S., Lee, J., Cho, S., Kang, D., Byun, K., Hahn, H., & Kim, J. (2015). The Korean corpus of spontaneous speech. Phonetics and Speech Sciences, 7(2), 103–109. https://doi.org/10.13064/ksss.2015.7.2.103 [본문으로]
- textgrid에서 데이터 추출하는 성스러운 작업은 textgrid_parser가 하고, 귀찮은 단순변환(?) 작업은 일꾼 worker에게 떠넘기기.ㅋㅋㅋ [본문으로]
- UR, SR이면 기저형 표면형 아니냐고 반문할 수 있는데, 맞다. 습관 무시못한다. 그리고 기저형 표면형이라고 부르면 안 되는 거 안다. 오개념 맞다. [본문으로]
- 생각해보면 음운 과정이라는 표현도 '정치적으로 올바른'(politically correct) 용어가 아닐까한다. '음운 과정'을 최적성 이론에서는 제약군과 제약들의 서열로 읽을 것이고, 조화문법 연구자들은 표면형에 점수매겨서 승자 선택하기 등으로 읽을 것이며, 다른 연구자들은 음운 규칙의 순차적 적용으로 읽을 것이기 때문이다. [본문으로]
- 왜 기계번역이라고 부르냐 하면, "To be or not to be that is the question"을 "죽느냐 사느냐 그것이 문제로다"로 번역하는 것이랑은 차원이 다르기 때문. [본문으로]
'Bouncing ideas 생각 작업실 > exp sharing 경험.실험 나누기' 카테고리의 다른 글
Fairseq transformer model에서 attention 뽑아내기 (2) | 2024.03.08 |
---|---|
'JKDY' 테스트 돌리기 + 배포🎉 (2) | 2024.02.23 |
음운론 전공자가 공부해본 통사론 (0) | 2023.09.01 |
Mac에서 받은 파일 한글 깨짐 해결 (0) | 2023.08.20 |
자동으로 한국어 praat textgrid 생성 - Montreal Forced Aligner 사용법 (8) | 2023.07.26 |