Korean

A library for Korean morphology

Introduction

우리는 프로젝트를 한글화해야 할 때가 있습니다. 하지만, Gettext 같은 국제화(Internationalization) 도구들은 인도유럽어족이 아닌 언어에 대해선 썩 만족스럽게 동작하지 않습니다. 한국어도 예외는 아니어서, 국제화 도구들 대부분이 한국어 고유의 형태론적 특징을 제대로 이해하지 못해, 불가피하게도 부자연스러운 한국어 문장이 만들어지곤 합니다.

korean 파이썬 모듈은 자연스러운 한국어 문장을 위해 한국어 형태론에 기반한 여러 유용한 기능을 제공합니다.

이형태 조사

영어의 “be” 동사는 이형태입니다. 따라서 영어 현지화 시스템들은 “is”, “am”, “are” 등 중에서 적절한 표현형을 고를 수 있어야합니다. 다행히 Gettext는 자연스러운 복수형 문장을 위한 ngettext 함수를 제공하고 있습니다. 만약 그렇지 않았다면 다음과 같은 우스꽝스러운 문장을 보게 됐을지도 모릅니다:

>>> print _('Here is(are) %d apple(s).') % 1
Here is(are) 1 apple(s).

몇몇 한국어 조사 역시 이형태입니다. 그런데 이들은 전혀 다른 선택 규칙을 필요로 합니다. 바로 앞 음소를 파악하는 것이죠. 아쉽게도 대부분의 국제화 도구들에 이런 기능은 포함되어있지 않습니다. 물론 korean 모듈은 포함합니다:

>>> from korean import Noun, NumberWord, Loanword
>>> fmt = u'{subj:은} {obj:을} 먹었다.'
>>> fmt2 = u'{subj:은} 레벨 {level:이} 되었다.'
>>> print fmt.format(subj=Noun(u'나'), obj=Noun(u'밥'))
나는 밥을 먹었다.
>>> print fmt.format(subj=Noun(u'학생'), obj=Noun(u'돈까스'))
학생은 돈까스를 먹었다.
>>> print fmt2.format(subj=Noun(u'용사'), level=NumberWord(4))
용사는 레벨 4가 되었다.
>>> print fmt2.format(subj=Noun(u'마왕'), level=NumberWord(98))
마왕은 레벨 98이 되었다.
>>> print fmt2.format(subj=Loanword(u'Leonardo da Vinci', 'ita'),
...                   level=NumberWord(67))
Leonardo da Vinci는 레벨 67이 되었다.

Gettext와 연동하기

koran.l10n.patch_gettetxt() 함수를 사용하면 간단히 Gettext와 Korean을 연동시킬 수 있습니다:

msgid ""
msgstr ""
"Locale: ko_KR\n"
"Content-Type: text/plain; charset=utf-8\n"
"Content-Transfer-Encoding: 8bit\n"

msgid "I like a {0}."
msgstr "나는 {0:을} 좋아합니다."

msgid "banana"
msgstr "바나나"

msgid "game"
msgstr "게임"
>>> from babel.support import Translations
>>> import korean
>>> translations = Translations.load('i18n', 'ko_KR')
>>> korean.l10n.patch_gettext(translations)
>>> _ = translations.ugettext
>>> _(u'I like a {0}.').format(_(u'banana'))
나는 바나나를 좋아합니다.
>>> _(u'I like a {0}.').format(_(u'game'))
나는 게임을 좋아합니다.

기존 문장 교정하기

이미 기존 문장들이 “을(를)” 같은 표현법을 사용하고 있었다면 korean.l10n.proofread() 함수를 사용하여 자연스러운 문장으로 바꿀 수 있습니다:

>>> import korean
>>> korean.l10n.proofread(u'용사은(는) 검을(를) 획득했다.')
용사는 검을 획득했다.
>>> korean.l10n.proofread(u'집(으)로 가자.')
집으로 가자.

API

korean.morphology

copyright:
  1. 2012-2013 by Heungsub Lee
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

class korean.morphology.Morpheme(*forms)

이 클래스는 형태소를 표현합니다. 형태소는 하나 또는 그 이상의 표현형을 지닐 수 있습니다. 복수의 표현형을 설정했을 때 첫 번째로 지정한 표현형이 그 이형태의 기본형이 됩니다.

매개 변수:forms – each forms of allomorph. the first form will be basic allomorph.
basic()

이형태의 기본형

classmethod get(key)

미리 정의된 형태소를 찾습니다.

read()

형태소를 제대로 된 한글 문자열로 만듭니다.

classmethod register(key, obj)

주어진 키에 형태소를 등록합니다.

class korean.morphology.Particle(after_vowel, after_consonant=None, after_rieul=None)

한국어의 조사를 표현하는 클래스로, 앞선 음소에 따라 달라지는 이형태를 지원합니다.

class korean.morphology.Substantive(*forms)

한국어의 체언

class korean.morphology.Noun(*forms)

한국어의 명사

read()

명사를 제대로 된 한글 문자열로 만듭니다.

>>> Noun('레벨42').read()
'레벨사십이'
class korean.morphology.NumberWord(number)

한국어의 수사

read()

수사를 제대로 된 한글 문자열로 만듭니다.

>>> NumberWord(1234567890).read()
'십이억삼천사백오십육만칠천팔백구십'
>>> NumberWord.read(0)
'영'
classmethod read_phases(number)

숫자를 만의 자리마다 끊어 읽어 제대로 된 한글 문자열로 만듭니다.

>>> NumberWord.read_phases(1234567890)
('십이억', '삼천사백오십육만', '칠천팔백구십')
>>> NumberWord.read_phases(0)
('영',)
class korean.morphology.Loanword(word, code=None, iso639=None, lang=None)

한국어의 외래어. 한글 전사를 위해 한글라이즈 모듈이 필요합니다.

버전 0.1.4에 추가.

read()

외래어를 한글로 전사합니다.

>>> Loanword('Guido van Rossum', 'nld').read()
'히도 판로쉼'
>>> Loanword('საქართველო', 'kat').read()
'사카르트벨로'
>>> Loanword('Leonardo da Vinci', 'ita').read()
'레오나르도 다 빈치'

korean.l10n

한국어 현지화 도구

copyright:
  1. 2012-2013 by Heungsub Lee
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

class korean.l10n.Proofreading(token_types)

A function-like class. These __call__() replaces naive particles to be correct. First, it finds naive particles such as “을(를)” or “(으)로”. Then it checks the forward character of the particle and replace with a correct particle.

매개 변수:token_types – specific types to make as token.
parse(text)

Tokenizes the given text with unicode text or Particle.

매개 변수:text – the string that has been written with naive particles.
korean.l10n.proofread = <korean.l10n.Proofreading object at 0x17e7e90>

Default Proofreading object. It tokenizes unicode and korean.Particle. Use it like a function.

class korean.l10n.Template

The Template object extends unicode and overrides format() method. This can format particle format spec without evincive Noun or NumberWord arguments.

Basically this example:

>>> import korean
>>> korean.l10n.Template('{0:을} 좋아합니다.').format('향수')
'향수를 좋아합니다.'

Is equivalent to the following:

>>> import korean
>>> '{0:을 좋아합니다.}'.format(korean.Noun('향수'))
'향수를 좋아합니다.'

korean.ext.gettext

Gettext is an internationalization and localization system commonly used for writing multilingual programs on Unix-like OS. This module contains utilities to integrate Korean and the Gettext system. It also works well with Babel.

copyright:
  1. 2012-2013 by Heungsub Lee
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

korean.ext.gettext.patch_gettext(translations)

Patches Gettext translations object to wrap the result with korean.l10n.Template. Then the result can work with a particle format spec.

For example, here’s a Gettext catalog for ko_KR:

msgid "{0} appears."
msgstr "{0:이} 나타났다."

msgid "John"
msgstr "존"

msgid "Christina"
msgstr "크리스티나"

You can use a particle format spec in Gettext messages after translations object is patched:

>>> translations = patch_gettext(translations)
>>> _ = translations.ugettext
>>> _('{0} appears.').format(_('John'))
'존이 나타났다.'
>>> _('{0} appears.').format(_('Christina'))
'크리스티나가 나타났다.'
매개 변수:translations – the Gettext translations object to be patched that would refer the catalog for ko_KR.

korean.ext.jinja2

Jinja2 is one of the most used template engines for Python. This module contains Jinja2 template engine extensions to make korean easy to use.

버전 0.1.5에 추가.

버전 0.1.6으로 변경: Moved from korean.l10n.jinja2ext to korean.ext.jinja2.

copyright:
  1. 2012-2013 by Heungsub Lee
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

class korean.ext.jinja2.ProofreadingExtension(environment)

A Jinja2 extention which registers the proofread filter and the proofread block:

<h1>ProofreadingExtension Usage</h1>

<h2>Single filter</h2>
{{ (name ~ '은(는) ' ~ obj ~ '을(를) 획득했다.')|proofread }}

<h2>Filter chaining</h2>
{{ '%s은(는) %s을(를) 획득했다.'|format(name, obj)|proofread }}

<h2><code>proofread</code> block</h2>
{% proofread %}
  {{ name }}은(는) {{ obj }}을(를) 획득했다.
{% endproofread %}

<h2>Conditional <code>proofread</code> block</h2>
{% proofread locale.startswith('ko') %}
  {{ name }}은(는) {{ obj }}을(를) 획득했다.
{% endproofread %}

The import name is korean.ext.jinja2.proofread. Just add it into your Jinja2 environment by the following code:

from jinja2 import Environment
jinja_env = Environment(extensions=['korean.ext.jinja2.proofread'])

버전 0.1.5에 추가.

버전 0.1.6으로 변경: Added enabled argument to {% proofread %}.

korean.ext.jinja2.proofread

alias of ProofreadingExtension

korean.ext.django.templatetags.korean

A module containing Django template tag and filter for korean.

버전 0.1.7에 추가.

copyright:
  1. 2012-2013 by Heungsub Lee, Hyunwoo Park
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

korean.ext.django.templatetags.korean.do_proofread(parser, token)

A Django tag for proofread

<h1>proofread tag Usage</h1>

{% load korean %}
{% proofread %}
  {{ name }}은(는) {{ obj }}을(를) 획득했다.
{% endproofread %}
korean.ext.django.templatetags.korean.proofread(*args, **kwargs)

A Django filter for proofread

<h1>proofread filter Usage</h1>

{% load korean %}
{{ 용사은(는) 검을(를) 획득했다.|proofread }}

korean.hangul

한글로 작성된 문자열을 다루는 모듈입니다. 2003년에 장혜식 님이 공개한 hangul.py 를 참고했습니다.

copyright:
  1. 2012-2013 by Heungsub Lee and 2003 by Hye-Shik Chang
license:

BSD 허가서, 자세한 내용은 LICENSE 파일에

korean.hangul.char_offset(char)

“가”로부터 주어진 한글 문자가 떨어져있는 거리를 반환합니다.

korean.hangul.is_hangul(char)

주어진 문자가 한글인지 확인합니다.

korean.hangul.is_vowel(char)

주어진 문자가 한글 홀소리인지 확인합니다.

korean.hangul.is_consonant(char)

주어진 문자가 한글 닿소리인지 확인합니다.

korean.hangul.is_initial(char)

주어진 문자를 한글 초성으로 사용할 수 있는지 확인합니다.

korean.hangul.is_final(char)

주어진 문자를 한글 종성으로 사용할 수 있는지 확인합니다. 빈 문자도 종성으로 간주합니다.

korean.hangul.get_initial(char)

주어진 문자의 한글 초성을 반환합니다.

korean.hangul.get_vowel(char)

주어진 문자의 한글 중성을 반환합니다.

korean.hangul.get_final(char)

주어진 문자의 한글 종성을 반환합니다.

korean.hangul.split_char(char)

주어진 문자의 초성, 중성, 종성을 분리해 순서쌍으로 반환 반환합니다.

korean.hangul.join_char(splitted)

``(초성, 중성, 종성)``으로 구성된 순서쌍을 한글 문자로 합칩니다.

설치

easy_install 또는 pip 커맨드를 이용해 설치하세요:

$ easy_install korean
$ pip install korean

개발 중인 소스코드도 받을 수 있습니다:

$ git clone git://github.com/sublee/korean.git

변경 이력

Version 0.1.7

Version 0.1.6

  • Moves korean.l10n.jinja2ext to korean.ext.jinja2.
  • Renames {% autoproofread %} to {% proofread %}.
  • Moves korean.l10n.patch_gettext() to korean.ext.gettext.patch_gettext().
  • Adds a condition argument to enable behind autoproofread Jinja2 block.
  • Fixes PEP8 errors without E301.

Version 0.1.5

2013년 1월 30일 출시.

  • Supports Python 3.
  • Jinja2 템플릿 엔진 용 korean.l10n.jinja2ext.ProofreadingExtension 확장 추가.

Version 0.1.4

2012년 8월 26일 출시.

Adds korean.morphology.Loanword.

Version 0.1.3

2012년 8월 15일 출시.

korean.l10n.Proofreading supports more various naive particle forms.

Version 0.1.2

2012년 8월 15일 출시.

korean.l10n.Proofreading 오류 수정.

Version 0.1.1

2012년 8월 15일 출시.

Python 2.5 지원 중단.

Version 0.1

첫 출시.

사용범위와 제작자

이 프로젝트는 BSD 허가서를 따릅니다. BSD 허가서의 범위 내에서 자유롭게 사용해주세요. 더 자세한 내용은 LICENSE 파일에 실려있습니다.

저는 이흥섭 입니다. 질문과 패치는 언제든 환영입니다.

Fork me on GitHub