Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Hunspell 한국어 맞춤법 검사의 원리

4,116 views

Published on

Hunspell 한국어 맞춤법 검사의 원리

2013 GNOME Asia Seoul

Published in: Software
  • Be the first to comment

Hunspell 한국어 맞춤법 검사의 원리

  1. 1. Hunspell 한국어 맞춤법 검사의 원리 류창우 <cwryu@debian.org> GNOME.asia 2013
  2. 2. 소개 ● 1995년 이후 리눅스 유저 ● SW 프로젝트 재미를 들여 여러 가지 참여 ● Debian developer - 한국어 관련 패키지 ● GNOME 한국어 번역 coordinator ● Embedded software engineer for media & broadcasting devices
  3. 3. 목표: F/OSS 환경의 맞춤법 검사 ● 2008년 부터 시작 ● 아직 많이 부족한 상태 (뒤에) ● 사람들의 반응 ● 칭찬 AND/OR 고정관념과 오해 ● 이 발표를 통해 이해하는 시간을
  4. 4. 흔한 오해: 오픈소스 맞춤법 검사 ● 오해: 어렵고 복잡한 것이니 오픈소스는 별 로 안 좋을 것이다? ● 진실: 맞춤법 검사는 오래전부터 널리 알려 져 있고 오픈소스 맞춤법 검사는 항상 독점 소프트웨어의 검사보다 더 뛰어났다. ● 적어도 유럽 주요 언어에 대해서는.
  5. 5. F/OSS 맞춤법 검사 ● ispell ● GNU aspell ● myspell ● hunspell
  6. 6. ispell ● Since 1971 on PDP-10 ● Usenet
  7. 7. GNU aspell ● GNU version ● 아직도 릴리스되지만 사용 거의 없어짐 ● 8비트 내부 구조 고집 ● Manual A.2 “Notes on 8-bit characters” ● Manual B.2.4 “Unsupported” / “Hangul”
  8. 8. myspell ● ispell 기반 ● OpenOffice.org를 위해 작성 - 더 나은 연 동 ● 복잡한 규칙 가능 - 더 복잡한 언어 지원 가 능 ● 여전히 8비트
  9. 9. hunspell ● László Németh, 헝가리어를 위해 myspell 개선 ● GPL/LGPL/MPL tri-license relicensing ● Mozilla Firefox & LibreOffice ● 내부 유니코드 사용 ● 8비트 인코딩에 없는 헝가리어 부호 ● Man 4 hunspell / Character Encoding ● 어떤 다른 맞춤법 프로그램보다 더 널리 이용됨 ● Mozilla, LibreOffice, Charome, Mac OS X
  10. 10. 흔한 오해 - 모국어 ● 오해: 한국어는 어렵고 특이한 언어이므로, 전통적인 맞춤법 검사 방식으로 동작하지 않 을 것이다. ● 진실: 한국어는 인류가 쓰는 다른 언어에 비 해 별로 특이하지 않다. ● 아마도 국어 시험의 트라우마?
  11. 11. 맞춤법 검사의 범위 ● 단어 단위 맞춤법 검사 – 형태론 (morphology) ● 단일한 단어에만 적용 ● 주로 white listing - 가능한 단어가 무엇인지 데이터에 저 장 ● 띄어쓰기가 없는 언어에서는 별도 처리 필요 (kakasi) ● 문법 검사 - 통사론 (syntax) ● 문장의 전체/일부에 적용 ● 주로 black listing - 많이 틀리는 오류 패턴
  12. 12. 맞춤법 검사가 하는 일 ● 주어진 단어가 올바른 단어인지 판단 ● 가능한 단어의 목록을 만든다 ● 가능한 단어의 파생 형태 규칙을 기술한다 ● 틀린 단어이면 가능성 높은 올바른 단어를 제시
  13. 13. 맞춤법 검사가 하는 일 (계속)
  14. 14. 맞는 단어를 찾는 기준 Q: 무엇이 가능성 높은 올바른 단어? A: 최소한의 “편집”을 통해 만들 수 있는 단 어. 편집 거리 (edit distance, Levenshtein distance): A, B 두 개의 단어가 있을 때 단 어 A에 몇 번의 최소한의 편집으로 단어 B를 만들 수 있는가.
  15. 15. Insertion / Deletion 맞추법 → 맞춤법 ㅁㅏㅈㅊㅜㅂㅓㅂ ㅁㅏㅈㅊㅜㅁㅂㅓㅂ
  16. 16. Replace 잇습니다 ㅇㅣㅅㅅㅡㅂㄴㅣㄷㅏ ㅇㅣㅆㅅㅡㅂㄴㅣㄷㅏ
  17. 17. Swap ㅇ벗어 ㅇㅂㅓㅅㅇㅓ ㅇㅓㅂㅅㅇㅓ
  18. 18. 바퀴를 다시 만들지 말라 ● hunspell이 처리해 주니 그대로 사용 ● 잘 동작하게 “사전”(?)을 만들자 ● 코딩은 여전히 필요 ● hunspell 사용하는 프로그램과 상호 연동은 덤.
  19. 19. 추가하면 끝? $ cat test.dic 1 ㄱㅡㄴㅗㅁ $ hunspell -d test Hunspell 1.3.2 ㄱㅡㄴㅗㅁ * ㄱㅡㄴㅗㅇ 1 0: ㄱㅡㄴㅗㅁ 그놈 # 그놈 0 $ ㅠㅠ
  20. 20. 모아쓰기 & 풀어쓰기 전략 ● 자모로 풀기 ● 잇습니다 -> ㅇㅣㅅㅅㅡㅂㄴㅣㄷㅏ ● 검사 ● →ㅇㅣㅅㅅㅡㅂㄴㅣㄷㅏ ㅇㅣㅆㅅㅡㅂㄴㅣㄷ ㅏ ● 음절로 모으기 ● →ㅇㅣㅆㅅㅡㅂㄴㅣㄷㅏ 있습니다
  21. 21. 모아쓰기 & 풀어쓰기 (계속) ● Hunspell 1.1.x – 인코딩 변환 필터 프로그 램으로 테스트 ● Hunspell 1.2 or later – ICONV/OCONV ICONV 가 ㄱㅏ ICONV 각 ㄱㅏㄱ ... OCONV ㄱㅏ 가 OCONV ㄱㅏㄱ 각 ...
  22. 22. 모아쓰기 & 풀어쓰기 (계속) ● 문제점 - 종성은 초성을 다시 쓰라고 가르쳐 주셨지만 유니코드는.. ● 예: ㅎㅏㅂㅣㄴㄷㅏ / ㅎㅏㅂㄴㅣㄷㅏ ● 초성/종성이 같으면 검사가 용이하지만 변환 구현 어려움 ● 다르면 불필요한 편집 거리 증가 (현재 상태)
  23. 23. 모아쓰기 & 풀어쓰기 (계속) ● 복자음/복모음 분해? ● 예: ㅇㅂㅓㅅㅇㅓ / ㅇㅓㅂㅅㅇㅓ ● 역시 분해하면 검사가 용이하지만 변환 구현 어려움 ● 다르면 불필요한 편집 거리 증가 (현재 상태)
  24. 24. 모아쓰기 & 풀어쓰기 (계속) ● hunspell의 수정 / 기능 추가 필요 ● 현재 상태 - 케이스별로만 대응. REP ㅂㅣㄴ ㅂㄴㅣ REP ㅇㅂㅓㅅ ㅇㅓㅄ
  25. 25. 파생형 구현 ● hunspell의 suffix 규칙 $ cat test.dic 1 가다/A $ cat test.aff SFX A Y 1 SFX A 다 시다 . $ hunspell -d test Hunspell 1.3.2 가다 * 가시다 + 가다
  26. 26. 파생형 구현 (계속) ● 조사는 명사에 그냥 추가 ● 한국어는 교착어 (Agglunative language) ● 안녕하세요 : 안녕하다 + 높임 선어말 어미 -시- + 종결 어미 -요 ● 용언의 가능한 파생형이 너무 많다. ● 이론상 무한 (있었음이었음이었음이었음...) ● hunspell에서는 2단계 규칙으로만 정의 가능 하므로 개별 규칙으로 정의 못함 ● 가다 → 가시다 → 가셨다 → 가셨고 (x) ???
  27. 27. 파생형 구현 (계속) ● 선어말 어미 + 어말 어미 조합을 미리 “빌드 ” ● Python 코딩이 필요한 맞춤법 사전 탄생 ● 용언은 보통 수천가지 SFX A 다 시다 . SFX A 다 셨다 . SFX A 다 셨고 . SFX A 다 셨으 며 . ...
  28. 28. 파생형 구현 (계속) ● 정의하기 힘든 어미 조합 있음. ● 공손 선어말 어미 ● 가옵시고(o), 가시옵고(o), 가시옵시고(x) ● 문제점 - 가능한 조합이 단어 수 만큼 많다. 빌드 및 런타임 속도 저하의 주범. ● 빌드 방법 최적화 필요. 가능하면 hunspell 수 정.
  29. 29. 파생형 구현 (계속) ● 앗! 불규칙 용언 ● ㄷ불규칙: 듣다 → 들어 ● ㅂ불규칙: 아름답다 → 아름다워 ● ㅅ불규칙: 긋다 → 그어 ● ㅎ불규칙: 빨갛다 → 빨개 ● 러불규칙: 이르다 → 이르러 ● 우불규칙: 푸다 → 퍼 ● 으불규칙: 크다 → 커
  30. 30. 파생형 구현 (계속) ● 단어별로 규칙 다르게 지정 ● 조합 생성이 더욱 복잡해짐.
  31. 31. 합성어 처리 ● 명사 + 명사, 명사 + 접사, 접사 + 명사 ● 유리지갑, 가죽지갑, ~式, ~用 ● 기준이 그 단어가 의미가 있는지이기 때문에 구현 쉽지 않음 ● 다른 맞춤법 검사도 기준이 가지각색 ● 광범위한 허용 vs 소극적 허용 ● 현재 구현되지 않음
  32. 32. 그 밖의 이슈 ● 명확하지 않은 표준 ● 1988년 표준어 개정안 ● 초중고 국어 교육 과정 ● 국립국어원 사전 ● 예: 거라/너라 불규칙 ● 표준어 규정: 가다/오다 동사에 대해 불규칙 ● 7차 교육 과정: 가다/오다 및 추가 동사에 대해 가능한 어미 ● 실생활: 가라! 와라! 이거 좀 하거라!
  33. 33. 그 밖의 이슈 (계속) ● Hunspell 버전 별로 구현 한계 ● 특정 규칙에서 버그 ● 예: 오천백일만 팔천사백육십팔 (1.2.14 필요) ● Mac OS X는 아직 1.2.8
  34. 34. 단어 데이터 편집 ● http://galkwi.appspot.com/ ● 온라인 단어 + 품사 + 속성 등 입력, 간단한 리 뷰 ● 정기적으로 릴리스에 통합 ● 웹 잘 몰라요 ● 구글 앱 엔진 나빠요 - 개편 예정
  35. 35. 결론 ● 사실 별 것 아니다. 국어 시험 트라우마 극 복 ● hunspell 및 맞춤법 SW 개선이 필요.
  36. 36. Thank you ● http://code.google.com/p/spellcheck-ko ● https://github.com/changwoo/hunspell-dict-ko ● http://groups.google.com/group/spellcheck-ko

×