처음부터 모든 것을 다 할 수는 없습니다. 원어에 상관없이 로마자를 입력하면 거기에 대응하는 한글 표기를 출력하는 프로그램을 원하시는 것 같은데 예를 들어 London을 입력하면 '런던', Seoul을 입력하면 '서울', Tokyo를 입력하면 '도쿄', Berlin을 입력하면 '베를린', Shanghai를 입력하면 '상하이'를 출력하는 것은 정말로 방대한 데이터 없이는 머신러닝으로는 구현이 불가능합니다. 로마자 문자열을 보고 먼저 language recognition을 통해 원어가 무엇인지 파악한 후 해당 언어에 알맞은 표기 규칙을 적용해야 하는 것이니 영어의 한글 표기 뿐만이 아니라 로마자로 쓴 한국어, 로마자로 쓴 일본어, 독일어, 로마자로 쓴 중국어를 한글로 표기하는 모듈이 모두 필요한 것입니다.
이것은 마치 자동번역기를 만들면서 원어를 구분 없이 영어를 한국어로 번역한 문장, 독일어를 한국어로 번역한 문장, 프랑스어를 한국어로 번역한 문장 등을 구분 없이 모두 학습 데이터에 포함시키고 훈련시켜 모든 언어를 한국어로 번역할 수 있도록 하겠다는 것과 같습니다.
더구나 이것은 로마자 형태가 한글 표기에 쓰인 형태와 같다는 가정 아래서만 구현이 가능합니다. 예를 들어 뮌헨의 영어 이름인 Munich이나 모스크바의 영어 이름인 Moscow를 입력하면 어떻게 해야 할까요? Munich, Moscow란 영어 이름에서 '뮌헨', '모스크바'란 표기를 도출할 방법은 없습니다. 영어의 Munich, Moscow를 한국어로 번역하면 '뮌헨', '모스크바'라는 정보는 일일이 사전을 참조해야지 머신러닝을 통해 짐작할 방법이 없습니다.
일반인이 흔히 생각하기 쉬운 것 가운데 하나가 로마자로 적은 외국어는 다 영어이고 한자어나 일본어 외의 외래어는 모두 영어에서 왔다고 생각하는 것입니다. 절대 그렇지 않습니다. 프랑스어에서 온 '뷔페', '발레', '크레용', 독일어에서 온 '알레르기', '깁스', '헤게모니' 등 수없이 많고 말씀드린 것처럼 '니켈'는 영어 nickel이 아니라 독일어 Nickel의 표기이고 '오페라'는 영어 opera가 아니라 이탈리아어의 opera, '모자이크'는 영어의 mosaic이 아니라 프랑스어의 mosaïque의 표기입니다. 영어 발음대로 표기한다면 각각 '니클', '오퍼라', '모제이익'입니다. 영어 발음에 따라 적으면 어색한 이유는 우리에게 친숙한 외래어 가운데 상당수가 영어가 아닌 다른 언어를 기준으로 한 형태이기 때문입니다.
이게 제대로 이해해야 할 정말 중요한 점인데 이것을 간과하면 우리가 보통 영어를 한글로 옮겨 적는 방식이 바로 영어를 한글로 표기하는 것이라고 완전히 오해할 수가 있습니다. 예를 들어 영어로 restaurant라고 쓴 것을 보고 한글로 '레스토랑'이라고 옮겨 적는다면 이것은 영어 restaurant를 영어 발음에 따라 한글로 표기한 것이 아니라 이에 대응되는 외래어 '레스토랑'으로 번역한 것입니다. 영어의 restaurant과 한국어의 '레스토랑'은 둘 다 프랑스어의 restaurant에서 온 외래어이며 '레스토랑'은 프랑스어 발음을 따른 표기입입니다. restaurant을 '레스토랑'으로 적는 것은 영어를 한글로 표기하면서 발음 기호를 따르지 않고 대충 적은 결과가 아니라 어원이 같은 외래어로 번역하는 것입니다. 이런 번역을 머신러닝으로 구현하려는 것은 무리입니다. 자동번역기도 개별 단어를 어떻게 번역해야 하는지는 사전에 의지합니다.
외래어마다 국어에 들어온 경로와 시기에 따라 형태가 크게 차이가 나니 폭넓게 적용되는 규칙을 찾기는 힘듭니다. 같은 cut도 영화 용어로는 '컷', 미용이나 스포츠 용어로는 '커트'로 쓰는 것이 외래어입니다.
중구난방인 외래어 표기를 통일하기 위해 각 언어를 한글로 표기하는 규칙을 마련한 것이 외래어 표기법이지만 이미 굳어진 관용 표기는 규칙에 맞지 않더라도 인정했기 때문에 외래어 표기 용례집은 이런 예외로 가득합니다. 그래서 관용으로 인정되어 사전에 실린 외래어 표기 형태를 따르는 것이 목적이면 머신러닝이 필요한 것이 아니라 사전을 그냥 사용하면 그만입니다. 학습이 필요 없습니다.
머신러닝이 필요한 경우는 사전에 실리지 않은 외래어를 한글로 표기해야 할 때입니다. 이럴 때는 외래어 표기법을 규칙적으로 따라야 합니다. 불규칙 표기는 수가 한정된 유한 집합이지만 규칙 표기는 아직 사전에 실리지 않은 모든 외래어 표기가 포함된 무한 집합입니다. 머신러닝을 적용할 대상은 후자입니다.
영어 문법의 예로 설명을 드리겠습니다. 영어에는 go-went-gone, see-saw-seen, think-thought-thought, sing-sang-sung 등 현재형, 과거형, 과거분사형의 관계가 불규칙한 동사가 수백 개 있습니다. 그러나 이 제한된 목록해 들지 않은 동사는 모두 ask-asked-asked, count-counted-counted, fill-filled-filled 등으로 규칙적으로 변화합니다. 그러니 본 적이 없는 새로운 동사의 과거형이나 과거분사형을 만들 때는 현재형에 -ed를 붙이면 그만입니다(이 규칙을 알아내려고 머신러닝까지 필요한 것은 아니지만 어쨌든 예로 듭니다).
그런데 불규칙 동사 수백 개를 모두 학습 자료에 포함시키고 *kee라는 본 적이 없는 새로운 동사를 활용시키라 하면 see-saw-seen에서 유추해서 *kee-kaw-keen으로 활용할지 모릅니다. *kee-keed-keed가 실제 원어민이 쓸 규칙 활용인데도 말입니다.
그래서 불규칙 표기는 사전에는 포함시키지만 학습 자료에서는 제외시키고 외래어 표기법을 적용한 규칙 표기만을 학습 자료에 포함시켜야 한다고 말씀드리는 것입니다.
그런 의미에서 학습 자료와 사전 자료는 분리시켜야 할 것 같습니다. 이런 방법은 어떨까요? New York '뉴욕', Shakespeare '셰익스피어' 등은 불규칙이지만 관용으로 인정된 표준 표기이니 사전에 저장하여 사용자가 New York, Shakespeare를 그대로 입력하면 '뉴욕', '셰익스피어'로 표기하는 한편 학습 자료로 쓸 때에는 규칙을 따른 '뉴요크', '셰이크스피어'로 써서 -ork는 보통 '오크'로 적는다, 이중모음 뒤의 k는 '크'로 적는다 등의 규칙을 학습하는데 방해가 되지 않도록 하는 것입니다.
또 한글 표기를 여럿 제시하는 것은 구현이 가능할까요? 예를 들어 live는 경우에 따라 '라이브'가 될 수도 있고 '리브'가 될 수도 있으니 둘 다 출력하는 것입니다. 자동번역기에서 번역된 낱말을 클릭하면 다른 번역 예도 보여주는 것처럼요. 어차피 학습 자료를 만들려면 영어에서 live와 같이 같은 철자가 여러 발음이 나는 경우를 모두 입력해야 하긴 합니다.