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

Contenu connexe

Tendances

미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
NAVER Engineering
 
기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용
Kenneth Jung
 

Tendances (20)

Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)Open domain dialogue Chatbot(잡담봇 삽질기)
Open domain dialogue Chatbot(잡담봇 삽질기)
 
딥 러닝 자연어 처리를 학습을 위한 파워포인트. (Deep Learning for Natural Language Processing)
딥 러닝 자연어 처리를 학습을 위한 파워포인트. (Deep Learning for Natural Language Processing)딥 러닝 자연어 처리를 학습을 위한 파워포인트. (Deep Learning for Natural Language Processing)
딥 러닝 자연어 처리를 학습을 위한 파워포인트. (Deep Learning for Natural Language Processing)
 
Attention is All You Need (Transformer)
Attention is All You Need (Transformer)Attention is All You Need (Transformer)
Attention is All You Need (Transformer)
 
딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향딥러닝 기반의 자연어처리 최근 연구 동향
딥러닝 기반의 자연어처리 최근 연구 동향
 
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
Clova Tech Summit 2: 대화모델 엔진 구조와 Chatbot 개발 최적화 방안
 
오토인코더의 모든 것
오토인코더의 모든 것오토인코더의 모든 것
오토인코더의 모든 것
 
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
미등록단어 문제 해결을 위한 비지도학습 기반 한국어자연어처리 방법론 및 응용
 
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
2011 H3 컨퍼런스-파이썬으로 클라우드 하고 싶어요
 
Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거Phrase Tagger, 구문 태거
Phrase Tagger, 구문 태거
 
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
[부스트캠프 Tech Talk] 진명훈_datasets로 협업하기
 
KorQuAD introduction
KorQuAD introductionKorQuAD introduction
KorQuAD introduction
 
Albert
AlbertAlbert
Albert
 
코딩테스트 합격자 되기 1주차 스터디 - 시간복잡도.pptx
코딩테스트 합격자 되기 1주차 스터디 - 시간복잡도.pptx코딩테스트 합격자 되기 1주차 스터디 - 시간복잡도.pptx
코딩테스트 합격자 되기 1주차 스터디 - 시간복잡도.pptx
 
기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용기계독해를 위한 BERT 언어처리 모델 활용
기계독해를 위한 BERT 언어처리 모델 활용
 
머신러닝의 자연어 처리기술(I)
머신러닝의 자연어 처리기술(I)머신러닝의 자연어 처리기술(I)
머신러닝의 자연어 처리기술(I)
 
Toward wave net speech synthesis
Toward wave net speech synthesisToward wave net speech synthesis
Toward wave net speech synthesis
 
Attention is all you need
Attention is all you needAttention is all you need
Attention is all you need
 
[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
<Little Big Data #1> 한국어 채팅 데이터로 머신러닝 하기
<Little Big Data #1> 한국어 채팅 데이터로  머신러닝 하기<Little Big Data #1> 한국어 채팅 데이터로  머신러닝 하기
<Little Big Data #1> 한국어 채팅 데이터로 머신러닝 하기
 
Auto encoding-variational-bayes
Auto encoding-variational-bayesAuto encoding-variational-bayes
Auto encoding-variational-bayes
 

En vedette

原理講論 要約訓読チャート 12時間用 前編
原理講論 要約訓読チャート 12時間用 前編原理講論 要約訓読チャート 12時間用 前編
原理講論 要約訓読チャート 12時間用 前編
Takayuki Hatada
 
자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6
KoChungWook
 

En vedette (20)

한글 언어 자원과 R: KoNLP 개선과 활용
한글 언어 자원과 R: KoNLP 개선과 활용한글 언어 자원과 R: KoNLP 개선과 활용
한글 언어 자원과 R: KoNLP 개선과 활용
 
딥러닝을 이용한 자연어처리의 연구동향
딥러닝을 이용한 자연어처리의 연구동향딥러닝을 이용한 자연어처리의 연구동향
딥러닝을 이용한 자연어처리의 연구동향
 
2 d asozo1 - PRINCIPLE OF CREATION
2 d asozo1 - PRINCIPLE OF CREATION2 d asozo1 - PRINCIPLE OF CREATION
2 d asozo1 - PRINCIPLE OF CREATION
 
創造原理
創造原理創造原理
創造原理
 
原理講論 要約訓読チャート 12時間用 前編
原理講論 要約訓読チャート 12時間用 前編原理講論 要約訓読チャート 12時間用 前編
原理講論 要約訓読チャート 12時間用 前編
 
原理本体論
原理本体論原理本体論
原理本体論
 
파이썬 유니코드 이해하기
파이썬 유니코드 이해하기파이썬 유니코드 이해하기
파이썬 유니코드 이해하기
 
자료구조 Project6
자료구조 Project6자료구조 Project6
자료구조 Project6
 
Knowing when to look : Adaptive Attention via A Visual Sentinel for Image Cap...
Knowing when to look : Adaptive Attention via A Visual Sentinel for Image Cap...Knowing when to look : Adaptive Attention via A Visual Sentinel for Image Cap...
Knowing when to look : Adaptive Attention via A Visual Sentinel for Image Cap...
 
A neural image caption generator
A neural image caption generatorA neural image caption generator
A neural image caption generator
 
인공지능시대의 한국어 정보처리
인공지능시대의 한국어 정보처리인공지능시대의 한국어 정보처리
인공지능시대의 한국어 정보처리
 
MNIST for ML beginners
MNIST for ML beginnersMNIST for ML beginners
MNIST for ML beginners
 
Cascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the StreamsCascadia.js: Don't Cross the Streams
Cascadia.js: Don't Cross the Streams
 
Learning to remember rare events
Learning to remember rare eventsLearning to remember rare events
Learning to remember rare events
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
Functional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwiftFunctional Reactive Programming With RxSwift
Functional Reactive Programming With RxSwift
 
Meta-Learning with Memory Augmented Neural Networks
Meta-Learning with Memory Augmented Neural NetworksMeta-Learning with Memory Augmented Neural Networks
Meta-Learning with Memory Augmented Neural Networks
 
InfoGAN: Interpretable Representation Learning by Information Maximizing Gene...
InfoGAN: Interpretable Representation Learning by Information Maximizing Gene...InfoGAN: Interpretable Representation Learning by Information Maximizing Gene...
InfoGAN: Interpretable Representation Learning by Information Maximizing Gene...
 
Q Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object LocalizationQ Learning과 CNN을 이용한 Object Localization
Q Learning과 CNN을 이용한 Object Localization
 
선박식별정보를 이용한 어업활동 공간밀도 가시화
선박식별정보를 이용한 어업활동 공간밀도 가시화선박식별정보를 이용한 어업활동 공간밀도 가시화
선박식별정보를 이용한 어업활동 공간밀도 가시화
 

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

개영한줄영작_Giving Advice on Debugging
개영한줄영작_Giving Advice on Debugging개영한줄영작_Giving Advice on Debugging
개영한줄영작_Giving Advice on Debugging
Nasol Kim
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
tcaesvk
 
외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview
민태 김
 
훌륭한 개발자로 성장하기
훌륭한 개발자로 성장하기훌륭한 개발자로 성장하기
훌륭한 개발자로 성장하기
Changyol BAEK
 

Similaire à Hunspell 한국어 맞춤법 검사의 원리 (20)

3주차 language
3주차 language3주차 language
3주차 language
 
한글라이즈 재제작기
한글라이즈 재제작기한글라이즈 재제작기
한글라이즈 재제작기
 
개영한줄영작_Giving Advice on Debugging
개영한줄영작_Giving Advice on Debugging개영한줄영작_Giving Advice on Debugging
개영한줄영작_Giving Advice on Debugging
 
Deep Learning for Chatbot (1/4)
Deep Learning for Chatbot (1/4)Deep Learning for Chatbot (1/4)
Deep Learning for Chatbot (1/4)
 
C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법C++ 코드 품질 관리 비법
C++ 코드 품질 관리 비법
 
NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계NDC 2014, 피할 수 없는 문자열의 세계
NDC 2014, 피할 수 없는 문자열의 세계
 
유한상태변환기를 이용한 한국어_형태소_분석_이상호
유한상태변환기를 이용한 한국어_형태소_분석_이상호유한상태변환기를 이용한 한국어_형태소_분석_이상호
유한상태변환기를 이용한 한국어_형태소_분석_이상호
 
유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호유한 상태 기반의 한국어 형태소 분석기_이상호
유한 상태 기반의 한국어 형태소 분석기_이상호
 
07.intermediate level patching, kanal in PEiD hangul
07.intermediate level patching, kanal in PEiD hangul07.intermediate level patching, kanal in PEiD hangul
07.intermediate level patching, kanal in PEiD hangul
 
(Kor ver.)NLP embedding(word2vec) tutorial & implementation(Tensorflow)
(Kor ver.)NLP embedding(word2vec) tutorial & implementation(Tensorflow)(Kor ver.)NLP embedding(word2vec) tutorial & implementation(Tensorflow)
(Kor ver.)NLP embedding(word2vec) tutorial & implementation(Tensorflow)
 
외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview외계어 스터디 1/5 - Overview
외계어 스터디 1/5 - Overview
 
개발자가 무슨 직업인지 궁금한 학생들 보세요
개발자가 무슨 직업인지 궁금한 학생들 보세요개발자가 무슨 직업인지 궁금한 학생들 보세요
개발자가 무슨 직업인지 궁금한 학생들 보세요
 
Pycon Korea 2020
Pycon Korea 2020 Pycon Korea 2020
Pycon Korea 2020
 
훌륭한 개발자로 성장하기
훌륭한 개발자로 성장하기훌륭한 개발자로 성장하기
훌륭한 개발자로 성장하기
 
06.the plain stupid patching method, searching for textstrings hangul
06.the plain stupid patching method, searching for textstrings hangul06.the plain stupid patching method, searching for textstrings hangul
06.the plain stupid patching method, searching for textstrings hangul
 
토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.Pptx토이 프로젝트를 하자.Pptx
토이 프로젝트를 하자.Pptx
 
[114]파파고 서비스 2년의 경험
[114]파파고 서비스 2년의 경험[114]파파고 서비스 2년의 경험
[114]파파고 서비스 2년의 경험
 
4th.Lecture.The.Visual.Principles.of.Typhography.pdf
4th.Lecture.The.Visual.Principles.of.Typhography.pdf4th.Lecture.The.Visual.Principles.of.Typhography.pdf
4th.Lecture.The.Visual.Principles.of.Typhography.pdf
 
네이버 SW교육 교사 연수자료_ 송상수
네이버 SW교육 교사 연수자료_ 송상수네이버 SW교육 교사 연수자료_ 송상수
네이버 SW교육 교사 연수자료_ 송상수
 
스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향스타트업 인턴 개발자 3달간의 고군분투기 김은향
스타트업 인턴 개발자 3달간의 고군분투기 김은향
 

Plus de Changwoo Ryu

Plus de Changwoo Ryu (13)

리눅스 데스크톱의 한국어 입력 개요
리눅스 데스크톱의 한국어 입력 개요리눅스 데스크톱의 한국어 입력 개요
리눅스 데스크톱의 한국어 입력 개요
 
오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3오픈소스 번역 기여하기 v3
오픈소스 번역 기여하기 v3
 
그놈 3.30 번역 모임
그놈 3.30 번역 모임그놈 3.30 번역 모임
그놈 3.30 번역 모임
 
그놈 3.28 번역 모임
그놈 3.28 번역 모임그놈 3.28 번역 모임
그놈 3.28 번역 모임
 
오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2오픈소스 번역 기여하기 v2
오픈소스 번역 기여하기 v2
 
국립국어원 오픈소스 어휘 정보 활용 사례
국립국어원 오픈소스 어휘 정보 활용 사례국립국어원 오픈소스 어휘 정보 활용 사례
국립국어원 오픈소스 어휘 정보 활용 사례
 
날림 학습: 컴퓨터의 시간 처리
날림 학습: 컴퓨터의 시간 처리날림 학습: 컴퓨터의 시간 처리
날림 학습: 컴퓨터의 시간 처리
 
그놈 3.26 번역 모임 2회차
그놈 3.26 번역 모임 2회차그놈 3.26 번역 모임 2회차
그놈 3.26 번역 모임 2회차
 
그놈 3.26 번역 모임
그놈 3.26 번역 모임그놈 3.26 번역 모임
그놈 3.26 번역 모임
 
오픈소스 번역 기여하기
오픈소스 번역 기여하기오픈소스 번역 기여하기
오픈소스 번역 기여하기
 
C/c++ 표준 int 타입
C/c++ 표준 int 타입C/c++ 표준 int 타입
C/c++ 표준 int 타입
 
Reprap 소개
Reprap 소개Reprap 소개
Reprap 소개
 
오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)오픈소스 라이선스 세미나 (2014/07/15)
오픈소스 라이선스 세미나 (2014/07/15)
 

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

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