사전 표제어 뜻풀이의 자동 기계 번역(PHP, MySQL)

Posted by 적분 ∫2tdt=t²+c
2015.08.01 12:53 프로그래밍

네! 휴가나왔습니다~ 소중한 휴가 시간을 일일히 라틴어 사전 단어를 번역하면서 보낼수는 없다는 생각이 번뜩 들었습니다. 번역이라는 작업이 굉장히 고도로 복잡하고 어려운 작업이면서도 또 동시에 지루하고 단순한 반복작업이 되기도 합니다. 구문 번역이 아니라 외국어 사전에 실린 뜻풀이를 번역하는 일은 특히 더 반복적이고 지루합니다. (8000여 단어 번역을 직접 해본결과 하는 일은 1.단어를 본다  2.아는 단어면 바로 뜻을 적는다  3.모르는 단어면 사전을 찾아서 적는다  4.1번으로 돌아가 반복)


그래서 생각했습니다. 제 인생과 코딩의 모토는 

단순하고 반복적인 작업은 기계에게 맡기고 사람은 창의적인 일에 시간을 써야한다.

-적분, 2015, 군복무 중에

(ㅋㅋㅋ) 이기 때문에, 이 단순하고 짜증하는 사전번역의 윤회 고리를 끊어야겠다는 계획이 생겼습니다. 아이디어는 다음과 같습니다.


외국어 사전은 일반적으로 다음과 같은 형태로 구성되어 있습니다.

A. 표제어

B. 갈래뜻별 뜻풀이

C. 용례


예를 들어 라틴어 단어 ager를 예로 들어보죠.


A. ager

B. 1) field, farm

  2) land, estate, park

  3) territory, country

  4) terrain

  5) soil

C. 생략


여기서 주목할 것은 B의 갈래뜻입니다. 1)~5)은 단어 ager가 가질수 있는 뜻을 보여줍니다. ager는 5개의 갈래뜻이 있는거죠. 그리고 그 갈래뜻 안에 영어 뜻풀이가 1~3개씩 들어있습니다. 이렇게 표현되어있는 이유는 한 언어에서 특정 뜻을 나타내는 단어가 다른언어의 단어와 일대일로 대응하지 않기 때문이죠. 즉 ager의 첫번째 뜻은 field와 farm을 포함하는 그 어떤 의미가 되는데 영어로는 한 단어로 대응하는 단어가 없다는 겁니다. (아마 한국어로 표현하면 밭이나 토지 정도가 되겠죠) 이때 field와 farm은 하나의 갈래뜻 ager 1)을 나타내므로 서로 어느정도 유사한 의미를 가질 수 밖에 없습니다. 즉 1)의 field는 분야, 경기장, 장 등의 의미가 아니라 토지, 농장과 유사한 의미를 가진다는 거죠. 여기서 우리는 유의어를 골라내고, 동음이의어를 구별할 수 있는 정보를 얻을 수 있습니다.

영한 사전에 경우로 설명하자면 영어 단어 ask의 갈래뜻으로 묻다, 질문하다가 표제되어 있다고 합시다. 여기서 묻다는 물어보다의 뜻이 되지, 매장하다의 뜻은 될수가 없습니다. 그것은 뒤의 질문하다라는 단어랑 묻다라는 단어가 유의어가 되어야만 하기 때문입니다.


라틴어 사전을 번역하면서 저는 아래와 같은 자료를 만들고 있었습니다.


A. 라틴어 표제어

B. 갈래뜻별 영어 뜻풀이

C. 갈래뜻별 한국어 뜻풀이

D. 용례


또다시 ager의 예를 들겠습니다.


A. ager

B. 1) field, farm

  2) land, estate, park

  3) territory, country

  4) terrain

  5) soil

C. 1) 밭, 토지, 농장

  2) 땅, 사유지, 공원

  3) 영토, 국가

  4) 지형

  5) 토양

D. 생략


여기서 우리는 영어로 된 갈래뜻 1)~5)와 한국어로 된 갈래뜻 1)~5)를 비교할 수 있습니다. 이를 통해 영어단어 field가 한국어로는 밭/토지/농장 등의 의미를 가질 수 있다고 추측할 수 있죠. farm의 경우도 마찬가지 입니다.


단어 categoria를 보죠.

A. categoria

B. 1) predicament

  2) category, field

C. 1) 상태, 경우

  2) 분야, 부분


갈래뜻2)에 field가 등장합니다. 여기서는 field가 분야/부분이라는 의미로 쓰였습니다. (실제로는 field가 등장하는 표제어가 무지하게 많겠지만 여기서는 설명의 편의를 위해 2개만 제시하겠습니다.) 이제 영단어 field가 어떤 의미를 가질지 확률적으로 계산할 수 있습니다. 완전 랜덤은 아니죠. 갈래뜻풀이에 같이 등장하는 단어에 따라 의미가 밭에서 분야로 바뀌는거니깐, 조건부 확률이랑 유사할거라고 생각할 수 있습니다.


이제 각 영단어별로 한국어 의미 가중치를 고려해봅시다.

ager 1)의 field는 그 의미가 밭/토지/농장이 될 수 있습니다. 셋 중 어떤게 의도하는 의미일지는 여기서는 알수 없으니 균등분포한다고 가정하고 진행하겠습니다. 그러면 다음 표와 같이 가중치 테이블을 만들 수 있습니다.


영단어 A한국어단어 BA가 B의미일 확률 
field

0.333
field토지0.333
field농장0.333




categoria 2)를 표로 만들면

영단어 A한국어단어 BA가 B의미일 확률 
field

분야

0.500
field

부분

0.500


다른 영단어에 대해서도 마찬가지로 표를 만들어봅시다. (귀찮아서 다 합쳐버렸어요)

영단어 A한국어단어 BA가 B의미일 확률 
farm

0.333
farm토지0.333
farm농장

0.333

category

분야

0.500
category

부분

0.500


이 표들을 바탕으로 갈래뜻풀이가 여럿일때의 의미를 추정해봅시다. 의미 확률을 가중치로 생각해서 그냥 합쳐버립시다. 그게 계산이 간단해서 편하고 빠르더라구요.

즉, 


이를 바탕으로 field, farm의 의미별 가능성을 계산해볼수 있습니다.

한국어단어 BA가 B의미일 확률 

0.666
토지0.666
농장

0.666

분야

0.500

부분

0.500


이제 PHP, MySQL을 통해 구현해봅시다. 생각보다 간단합니다.

사전 표제어는 word 테이블에 있고, 우리는 이를 바탕으로 영단어별 한국어의미 가중치를 담는 테이블 ek를 채워넣을 것입니다.



이제 이 가중치 테이블 ek를 이용해 기계번역을 하는 함수를 만들어봅시다.


실제로 어떤 결과가 나올까요? 라틴어 사전의 이미 번역된 8000여 쌍의 영어-한국어 단어를 바탕으로 가중치 테이블을 구축하고 실험해보았습니다.

getTranslation(array('go', 'proceed', 'advance'), 'v'); // go, proceed, advance라는 뜻풀이를 가진 동사의 한국어의미를 추정합니다.



한국어 의미가중치
전진하다8.2831
나아가다5.0331
가다3.1500
행진하다1.1666
행군하다1.0000
들어오다1.0000
나타나다0.9999
앞서 가다0.9999
전진시키다0.7500
움직이다0.7000
발전하다0.6666
진보하다0.6666
늙다0.6666
앞으로 내보내다0.5000
딛고 넘다0.5000
진전하다0.5000
순환하다0.5000
다시 지나다0.5000
돌다0.5000
한도를 넘다0.5000
공격하다0.5000
재횡단하다0.5000


상위권 3~4개정도만 추려서 보면 의미 추정이 생각보다 괜찮게 되었음을 알 수 있습니다. 하지만 이 결과는 가중치를 구축하는데에 8000여쌍의 영어-한국어 단어쌍에 크게 의존합니다. 단어쌍이 생각보다 고르지 않아서 전혀 뜻풀이가 안되는 영단어들도 많고 오히려 엉뚱한 뜻을 추정해내는 경우도 자주 있네요. 이런 것들 추려내고 나니 2만1천개의 라틴어 표제어 중 번역이 안된 1만3천개 중에 5천개 정도가 자동번역으로 뜻풀이를 붙일 수 있었습니다.


한 두 시간 코딩한거에 비해 결과는 생각보다 잘 나왔어요. (단어 5000개를 순식간에 번역 끝냈것도 그렇고)

그리고 이 방법을 제작 중인 헬라어 사전에도 적용하면 되겠다싶어서 헬라어-영어 사전에 사용해서 헬라어-한국어 사전을 반쯤 완성시키는데 성공했습니다. 짜잔!

Tags
이 댓글을 비밀 댓글로
  1. 다른 reference 없이 이 정도 생각해 내셨다니 정말 대단합니다.
    참고로, Word A가 Word B로 번역 될 확률은 P(A, B)가 아닌 조건부확률로 P(B|A) 표기 되어야 합니다.
    따라서 후보들의 합은 1이 되는 것이겠죠.

    조금 더 나아가자면,
    farm, field가 주어졌을 때에 "밭"으로 번역 될 확률을 표기하자면, P(밭|farm, field)가 될 겁니다.
    이것을 일반화 하면, k개의 단어가 주어지고 이것이 B가 될 확률을 구한다면

    P(B|A1, ,,, Ak)
    여기에 Bayes rule을 대입하여
    P(B|A1, ,,, Ak) = P(A1, ,,, Ak|B)P(B) / P(A1,,,Ak)
    우리는 정확한 확률값을 필요로 하는 것이 아닌, 확률 값을 최대로 하는 B'를 찾는 것이기 때문에,
    B는 바뀌더라도 A1~Ak까지는 바뀌지 않으므로 분모는 삭제할 수 있습니다.
    B' = argmax(P(A1,,,Ak|B)P(B))

    여기서 A들이 서로 독립이라고 가정하면, 곱으로 나타낼 수 있습니다.
    P(A1,,,Ak|B) = P(A1|B)*P(A2|B)*...*P(Ak|B)

    여기에 사전의 단어들을 count 해서 해당 확률값에 넣어주면 좀 더 정확한 번역이 되지 않을까 생각 해 봅니다...
    그나저나 이런 것들을 사전 지식 없이 생각 해 내실 정도라면 대학원 진학하시면 정말 재미있게 공부하실 것 같습니다.
    • 부가설명감사합니다~!
      베이즈 정리를 어디에 쓴다고 들었었는데
      이런데에 적용하는거였군요 더 공부하도록 하겠습니다 감사합니다!