상세 컨텐츠

본문 제목

형태 규칙 서술 언어 MorPHP

프로그래밍

by ∫2tdt=t²+c 2015. 11. 15. 20:03

본문

형태 규칙 서술 언어 MorPHP를 소개합니다!

MorPHP는 Morphology + PHP로 PHP로 형태소 처리를 위해서 만들어졌습니다. 직접적인 동기는 살아있는 라틴어 사전에서 제공하던 어형 변화표 기능이 여러모로 확장성도 부족하고, 코드도 스파게티화되어가고 있어서, 아예 굴절 규칙을 별도의 서술 언어로 빼버리고, 해석기를 통해서 굴절 변화표를 생성하는 방식이 기존 방식보다 좋겠다는 생각이 들어서였죠.


MorPHP를 통한 형태소 처리 프로그램은 다음과 같은 순서로 개발됩니다.

  1. MorPHP 규칙을 따라 개발하고자 하는 언어의 형태소 규칙을 서술한다.
  2. 1번에서 작성된 규칙 파일을 MorPHP 해석기에 집어넣는다.
  3. 해석기에서 생성한 PHP 또는 JS코드를 프로그램에 삽입하여 사용한다.


2012년인가 13년도에 Derivae라고해서 범용 언어 규칙 서술 언어를 개발하던게 있었는데, 모든 언어 규칙을 망라할 수 있어야한다는 생각에 막강한 규칙을 지원하려다보니, 해석기가 너무 복잡해지고 오히려 언어 규칙 서술마저 지저분해져서 목표한 바를 이루지 못하고 휴지통에 버려야만 했던 프로젝트였죠. 이번 MorPHP는 그 Derivae의 축소판 PHP버전인셈입니다. 최대한 단순하게 제한된 규칙만을 제공하면서 되도록이면 많은 언어들의 형태론을 묘사하는게 목표입니다. 최근 주로하는 작업이 라틴어와 헬라어 사전이다보니 MorPHP로 서술 가능한 언어가 인구어족 계통의 굴절어로 한정되어버린 경향이 없잖아 있긴합니다. (하지만 해보니 한국어 동사변화도 서술가능하고, 스와힐리어 등 포합어에 대해서도 실험중에 있습니다. 최종 보스는 어근 사이사이에 각종 모음들이 막 끼어들어가는 아랍어나 히브리어가 될듯합니다.)


계획을 세운것은 꽤 오래되었는데, 실제로 코딩작업을 한 것은 저번 휴가즈음부터였습니다. 백엔드로 Javascript와 PHP를 지원하는데, PHP 문법이 영 뒤죽박죽이라서 백엔드를 작성하는데 상당히 오래걸렸습니다. 그래도 오늘 드디어 PHP 백엔드를 완성하고 테스트를 끝냈습니다! 짝짝짝~!


서론이 길었는데, 실제로 MorPHP가 어떤 녀석인지 만나보시죠. MorPHP로 라틴어 명사 곡용 규칙을 서술한 예제입니다.


/* 라틴어 명사 곡용 규칙 */

 

// 언어 자질 정의

[Gender] := [mas, fem, neu]

[Number] := [sng, plr]

[Case] := [nom, gen, dat, acc, abl, voc]

[NClass] := [n1, n2, n3, n3i, n4, n5, ng1, ng2, ng4, ng5]

[Clitic] := [noclitic, and, or, rog]

 

// 명사 규칙 정의

<<Noun>> := <*NStem> <Ending> <Clitics>;

 

// 어근 형태소 패턴 정의

<*NStem> := {

    morph nominative '' [sng, nom|voc, mas|fem] [sng, nom|voc|acc, neu],

    morph genitive '' [sng, gen|dat|acc|abl, mas|fem] [sng, gen|dat|abl, neu] [plr]

}

 

// 어미 형태소 패턴 정의

<Ending> := {

    morph 'a' [n1, sng, nom|voc],

    morph 'ae' [n1, sng, gen|dat] [n1, plr, nom|voc],

    morph 'am' [n1, sng, acc],

    morph 'a:' [n1, sng, abl],

    morph 'a:rum' [n1, plr, gen],

    morph 'i:s' [n1|n2, plr, dat|abl],

    morph 'a:s' [n1, plr, acc],

    morph 'us' [n2|n4, sng, nom, mas|fem] [n4, sng, voc],

    morph 'i:' [n2, sng, gen] [n2, plr, nom|voc, mas|fem],

    morph 'o:' [n2, sng, dat|abl],

    morph 'um' [n2|n4, sng, acc, mas|fem] [n2, sng, nom|voc|acc, neu],

    morph 'e' [n2, sng, voc, mas|fem],

    morph 'o:rum' [n2, plr, gen],

    morph 'o:s' [n2, plr, acc, mas|fem],

    morph 'a' [n2|n3, plr, nom|voc|acc, neu],

    morph '' [n3|n3i, sng, nom|voc, mas|fem] [n3|n3i, sng, nom|voc|acc, neu],

    morph 'is' [n3|n3i, sng, gen],

    morph 'i:' [n3|n3i, sng, dat],

    morph 'em' [n3|n3i, sng, acc],

    morph 'e' [n3|n3i, sng, abl],

    morph 'e:s' [n3|n3i, plr, nom|voc|acc],

    morph 'um' [n3, plr, gen],

    morph 'ium' [n3i, plr, gen],

    morph 'ia' [n3i, plr, nom|voc|acc, neu],

    morph 'ibus' [n3|n3i|n4, plr, dat|abl],

    morph 'u:s' [n4, sng, gen] [n4, plr, nom|voc|acc, mas|fem],

    morph 'ui:' [n4, sng, dat],

    morph 'u:' [n4, sng, abl, mas|fem] [n4, sng, neu],

    morph 'uum' [n4, plr, gen],

    morph 'ua' [n4, plr, nom|voc|acc, neu],

    morph 'e:s' [n5, sng, nom|voc] [n5, plr, nom|voc|acc],

    morph 'ei:' [n5, sng, gen|dat],

    morph 'em' [n5, sng, acc],

    morph 'e:' [n5, sng, abl],

    morph 'e:rum' [n5, plr, gen],

    morph 'e:bus' [n5, plr, dat|abl]

}

 

// 접어 형태소 패턴 정의

<Clitics> := {

    empty [],

    morph 'que' [and],

    morph 've' [or],

    morph 'ne' [rog]

}


이 소스코드를 MorPHP 해석기에 넣으면 해석기가 규칙을 번역하여 PHP 또는 JS로 실행가능한 소스코드를 만들어줍니다. 이 프로그램을 이용하여 프로그래밍 단에서는 별도의 형태소 규칙 프로그래밍 없이 형태소 처리를 간편하게 하고, 언어 규칙 단에서는 별도의 프로그래밍 없이 규칙만 서술하는 것이죠. 이렇게되면 언어 규칙과 프로그래밍 부분이 분할되면서 유지보수가 용이해지고, 분업이 간편해집니다. 또한 하나의 언어 규칙을 다양한 백엔드 언어(현재는 PHP, JS뿐이지만, 앞으로 C++, JAVA도 지원하는게 목표입니다.)에 활용할 수 있고, 한 규칙으로 형태소 합성과 형태소 분석을 동시에 할 수 있어서 매우 편리합니다. 


위 형태 규칙을 MorPHP 해석기를 통해 PHP, JS로 번역하면 다음과 같은 결과가 나오는데, 가독성 좋은 코드와는 거리가 머므로 숨겨두었습니다. 궁금하신 분만 살펴보세요.




지금 남은 문제는 속도입니다. 이 녀석 해석기가 PHP를 기반으로 작성되어서 규칙 서술 언어를 파싱할때도, 그리고 추상트리에서 목적 언어를 생성해낼때도 상당히 느립니다. 이것은 번역결과를 캐싱하는 방식으로 일단 해결했는데, 그래도 느립니다. 아직은 제가 직접 손수 작성한 PHP 라틴어 단어 굴절 코드가 더 빠르다는게 함정이죠. (그래서 아직 살아있는 라틴어 사전에는 전격 도입하지 못하고 살아있는 헬라어 사전 명사 굴절에만 부분 도입해서 사용하고 있습니다.) 컴파일 타임 최적화를 통해 속도를 높일 수 있는 부분은 높이도록 좀더 공부를 해봐야할것 같습니다.


아직 전격적으로 공개하기에는 좀더 개선할부분이 있어서 코드 공개는 좀 미루고, 대신 웹에서 MorPHP의 동작원리를 살펴볼수있는 페이지를 만들었습니다. 관심있는 분들은 참고하시면될듯합니다.

관련글 더보기

댓글 영역