상세 컨텐츠

본문 제목

MorPHP를 이용한 스와힐리어 문법 서술

프로그래밍

by ∫2tdt=t²+c 2015. 12. 15. 10:13

본문

MorPHP(형태 규칙 서술 언어 MorPHP)를 만들었으니 얘를 얼마나 써먹을수 있는지 확인해봐야겠지요. 다양한 언어의 형태 규칙을 서술하는게 가능한지를 확인해보기 위해 그 성격이 각기 다른 언어들 몇개를 뽑아야했습니다. 먼저 교착어를 대표해서 한국어, 굴절이 극도로 발전한 라틴어/헬라어, 수많은 형태소들이 한 단어에 삽입되는 스와힐리어, 그리고 마지막으로 자음어근 사이에 모음이 삽입되는 히브리어/아랍어. (단어가 형태변화를 보이지 않는 중국어와 같은 고립어들은 제외했습니다. 형태규칙 서술이 목표다보니 고립어를 가지고는 딱히 뭘 할게 없더라구요.) 지금 뽑은 5개 언어의 형태규칙을 MorPHP가 잘 서술해낼 수 있다면, 사실상 전세계의 모든 언어들을 서술하는게 가능하다가 과감하고도 희망적인 추정을 내릴 수 있을 겁니다. 그래서 바로 실험을 시작해보았죠.


근데 문제는 스와힐리어 문법에 관해서 제가 알고있는 바가 없다는거죠. 최대한 쉽게 쓰인 자료를 찾아 빠르게 공부할 필요가 있었습니다. 다행히도 훌륭한 사이트를 발견했어요!


http://allafrica.co.kr/category/%EC%96%B8%EC%96%B4/%EC%8A%A4%EC%99%80%ED%9E%90%EB%A6%AC%EC%96%B4%20%EC%97%B0%EA%B5%AC (한국어)

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




관련글 더보기

댓글 영역