MorPHP(형태 규칙 서술 언어 MorPHP)를 만들었으니 얘를 얼마나 써먹을수 있는지 확인해봐야겠지요. 다양한 언어의 형태 규칙을 서술하는게 가능한지를 확인해보기 위해 그 성격이 각기 다른 언어들 몇개를 뽑아야했습니다. 먼저 교착어를 대표해서 한국어, 굴절이 극도로 발전한 라틴어/헬라어, 수많은 형태소들이 한 단어에 삽입되는 스와힐리어, 그리고 마지막으로 자음어근 사이에 모음이 삽입되는 히브리어/아랍어. (단어가 형태변화를 보이지 않는 중국어와 같은 고립어들은 제외했습니다. 형태규칙 서술이 목표다보니 고립어를 가지고는 딱히 뭘 할게 없더라구요.) 지금 뽑은 5개 언어의 형태규칙을 MorPHP가 잘 서술해낼 수 있다면, 사실상 전세계의 모든 언어들을 서술하는게 가능하다가 과감하고도 희망적인 추정을 내릴 수 있을 겁니다. 그래서 바로 실험을 시작해보았죠.
근데 문제는 스와힐리어 문법에 관해서 제가 알고있는 바가 없다는거죠. 최대한 쉽게 쓰인 자료를 찾아 빠르게 공부할 필요가 있었습니다. 다행히도 훌륭한 사이트를 발견했어요!
https://www2.ku.edu/~kiswahili/ (영어)
위 사이트들의 내용을 바탕으로 문법 규칙을 서술해보았습니다.
//Swahili Inflector
[SPerson] := [sp1, sp2, sc1, sc2, sc3, sc4, sc5, sc6, sc7, sc8, sc9, sc10]
[SNumber] := [ssng, splr]
[OPerson] := [on, op1, op2, oc1, oc2, oc3, oc4, oc5, oc6, oc7, oc8, oc9, oc10]
[ONumber] := [osng, oplr]
[Modifier] := [gnom, def, perf, past, ftr, cond, regret, subj, habit, imp]
[Neg] := [pos, neg]
[Voice] := [act, psv]
<<Verb>> := <Neg> <Subj> <MNeg> <Mod> <Obj> <Ku> <*VStem> <Voice> <VE>;
<*VStem> := {
morph stem '' []
}
<Neg> := {
empty [pos] [cond|regret|subj, neg] [sp1, ssng] [sp2, ssng],
morph 'h'{nd_a} [sp1, splr, gnom|def|perf|past|ftr|habit, neg]
[sp2, splr, gnom|def|perf|past|ftr|habit, neg]
[sc1|sc2|sc3|sc4|sc5|sc6|sc7|sc8|sc9|sc10, gnom|def|perf|past|ftr|habit, neg]
}
<Subj> := {
empty [habit, pos] [imp],
morph 'ni' [sp1, ssng, pos] [sp1, ssng, cond|regret|subj, neg],
morph 'u' [sp2, ssng, pos] [sp2, ssng, cond|regret|subj, neg],
morph 'tu' [sp1, splr],
morph 'm' [sp2, splr],
morph 'a' [sc1, ssng],
morph 'wa' [sc1, splr],
morph 'u' [sc2, ssng],
morph 'i' [sc2, splr],
morph 'li' [sc3, ssng],
morph 'ya' [sc3, splr],
morph 'ki' [sc4, ssng],
morph 'vi' [sc4, splr],
morph 'i' [sc5, ssng],
morph 'zi' [sc5, splr],
morph 'u' [sc6, ssng],
morph 'zi' [sc6, splr],
morph 'ku' [sc7],
morph 'pa' [sc8],
morph 'ku' [sc9],
morph 'm' [sc10],
morph 'si' [sp1, ssng, gnom|def|perf|past|ftr|habit, neg],
morph 'hu' [sp2, ssng, gnom|def|perf|past|ftr|habit, neg]
}
<MNeg> := {
empty [pos] [gnom|def|perf|past|ftr|habit, neg],
morph 'si' [cond|regret|subj, neg]
}
<Mod> := {
morph 'a' [gnom, pos],
morph 'na' [def, pos],
morph 'me' [perf, pos],
morph 'ja' [perf, neg],
morph 'li' [past, pos],
morph 'ku' [past, neg],
morph 'ta' [ftr],
morph 'hu' [habit, pos],
morph 'nge' [cond],
morph 'ngali' [regret],
empty [imp|subj] [gnom|def|habit, neg]
}
<Ku> := {
empty [gnom|habit|subj|cond|regret] [def|perf|past, neg],
morph {mov_ku} [def|perf|past, pos] [ftr|imp]
}
{mov_ku} := {
'' / _ %[aeiou]%,
'ku'
}
<Obj> := {
empty [on],
morph 'ni' [op1, osng],
morph 'ku' [op2, osng],
morph 'tu' [op1, oplr],
morph 'wa' [op2, oplr],
morph 'm'{weak_w} [oc1, osng],
morph 'w'{weak_a} [oc1, oplr],
morph 'u' [oc2, ssng],
morph 'i' [oc2, splr],
morph 'li' [oc3, ssng],
morph 'ya' [oc3, splr],
morph 'ki' [oc4, ssng],
morph 'vi' [oc4, splr],
morph 'i' [oc5, ssng],
morph 'zi' [oc5, splr],
morph 'u' [oc6, ssng],
morph 'zi' [oc6, splr],
morph 'ku' [oc7],
morph 'pa' [oc8],
morph 'ku' [oc9]
}
<Voice> := {
empty [act],
morph {m_psv} [psv]
}
<VE> := {
morph 'a' [perf|past|ftr|cond|regret] [gnom|def|habit, pos],
morph {ae} [imp, ssng],
morph 'eni' [imp, splr],
morph 'e' [subj],
morph 'i' [gnom|def|habit, neg]
}
{nd_a} := {
'' / _ %^a%,
'a'
}
{weak_a} := {
'' / _ %^[aeiou]%,
'a'
}
{weak_w} := {
'' / _ %^[^aeiou]%,
'w'
}
{ae} := {
'e' / _ in [^on],
'a'
}
combine <Subj> <Mod> {
%[ai]% %a% => 'a',
%u% %a% => 'wa',
%m% %a% => 'mwa'
}
{m_psv} := {
'liw' / %[aiu]$% _,
'lew' / %[eo]$% _,
'w'
}
아직 개선의 여지가 많을겁니다. 문법을 급하게 공부해서 오류가 있을 수도 있구요. 하지만 확실한건 MorPHP로 포합어 형태 규칙을 서술하는데 제한사항이 없다는것이죠.
위 MorPHP를 사전에 적용해보았습니다.
예시는 자주 쓰이는 단어 soma '읽다'로 들어보았어요.
http://lab.bab2min.pe.kr/sk?pid=soma
코퍼스 분석용 SQL도구 KorpuSQL 개발! (3) | 2016.01.27 |
---|---|
MorPHP를 통한 한국어 동사 변화 규칙 서술 (0) | 2015.12.22 |
XpressEngine, PHP5.5 + MySQL에서 PHP7.0 + MariaDB로 갈아탄 후기 (4) | 2015.12.21 |
형태 규칙 서술 언어 MorPHP (0) | 2015.11.15 |
[PHP, MySQL] 클러스터링을 이용한 동음이의어 분리 (0) | 2015.10.18 |
XE 페이지 주소 통일하기 (0) | 2015.09.19 |
댓글 영역