Kiwi : 지능형 한국어 형태소 분석기(Korean Intelligent Word Identifier)
Kiwi는 빠른 속도와 범용적인 성능을 지향하는 한국어 형태소 분석기 라이브러리입니다. 한국어 처리에 관심 있는 사람이면 누구나 쉽게 사용할 수 있도록 오픈 소스로 공개 중이며, C++로 구현된 코어 라이브러리를 래핑하여 다양한 프로그래밍 언어에 사용할 수 있도록 준비 중입니다.
형태소 분석은 세종 품사 태그 체계를 기반으로 하고 있으며 모델 학습에는 세종계획 말뭉치와 모두의 말뭉치를 사용하고 있습니다. 웹 텍스트의 경우 약 87%, 문어 텍스트의 경우 약 94% 정도의 정확도로 한국어 문장의 형태소를 분석해 낼 수 있습니다. 또한 간단한 오타의 경우 모델 스스로 교정하는 기능을 지원합니다(0.13.0버전 이후).
아직 부족한 부분이 많기에 개발자분들의 많은 관심과 기여 부탁드립니다.
특징
텍스트 분석 속도가 다른 한국어 형태소분석기들과 비교하여 꽤 빠른 편입니다. (속도 측정은 이 코드를 통해 수행 가능합니다. )
또한 자체적으로 경량 언어모델을 탑재하여 모호성이 있는 경우에도 제법 정확하게 형태소를 분석해냅니다. 특히 SBG모델을 사용 시 모호성 해소 성능이 크게 향상됩니다. (모호성 해소 성능 평가는 이 페이지에서 수행가능합니다. )
문장 분리 기능을 비롯한 다양한 편의기능을 제공합니다. (문장 분리 성능 평가는 이 페이지에서 수행가능합니다. )
라이브러리 차원에서 멀티스레딩을 지원하기 때문에 대량의 텍스트를 분석해야할 경우 멀티코어를 활용하여 빠른 분석이 가능합니다. 또한 다양한 시스템에서 상황에 맞춰 선택할 수 있도록 소형/중형/대형 모델을 제공합니다.
설치
C++
컴파일된 바이너리 다운로드
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
Windows
Visual Studio 2019 이상을 사용하여 Kiwi.sln
파일을 실행하여 컴파일할 수 있습니다.
Linux
이 레포지토리를 clone한 뒤 cmake>=3.12를 사용하여 컴파일합니다.
모델 파일은 용량이 큰 관계로 Git LFS를 통해 공유됩니다. 따라서 git clone
에 앞서 Git LFS가 설치되어있는지 확인해주세요.
gcc >= 5.0 이상 혹은 다른 c++11 호환 컴파일러 사용가능 환경
$ git clone https://github.com/bab2min/Kiwi
$ cd Kiwi
$ git lfs pull
$ git submodule sync
$ git submodule update --init --recursive
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../
$ make
$ make install
$ ldconfig
gcc >= 4.8, < 5.0
Centos5와 같이 gcc 4.8까지만 지원하는 환경에서는 googletest의 버전을 1.8.x로 낮춰야 컴파일 가능합니다.
$ git clone https://github.com/bab2min/Kiwi
$ cd Kiwi
$ git lfs pull
$ git submodule sync
$ git submodule update --init --recursive
$ cd third_party/googletest && git checkout v1.8.x && cd ../../
$ mkdir build && cd build
$ cmake -DCMAKE_BUILD_TYPE=Release ../
$ make
$ make install
$ ldconfig
설치가 잘 됐는지 확인하기 위해서는 kiwi-evaluator
를 실행해봅니다.
$ ./kiwi-evaluator --model ../ModelGenerator ../eval_data/* --sbg
Loading Time : 981.745 ms
ArchType : avx2
LM Size : 34.1853 MB
Mem Usage : 278.129 MB
Test file: eval_data/web.txt
0.862114, 0.852863
Total (158 lines) Time : 301.702 ms
Time per Line : 1.9095 ms
================
Test file: eval_data/written.txt
0.942892, 0.943506
Total (33 lines) Time : 62.3999 ms
Time per Line : 1.89091 ms
================
Test file: eval_data/web_with_typos.txt
0.754417, 0.720886
Total (97 lines) Time : 99.7661 ms
Time per Line : 1.02852 ms
================
================
Avg Score
0.853141, 0.839085
================
0.13.0 버전부터 추가된 오타 교정 기능이 잘 작동하는지 확인하기 위해서는 다음과 같이 실행합니다.
$ ./kiwi-evaluator --model ../ModelGenerator ../eval_data/* --sbg --typo 6
Loading Time : 9414.45 ms
ArchType : avx2
LM Size : 34.1853 MB
Mem Usage : 693.945 MB
Test file: eval_data/web.txt
0.86321, 0.85566
Total (158 lines) Time : 432.236 ms
Time per Line : 2.73567 ms
================
Test file: eval_data/written.txt
0.941712, 0.942217
Total (33 lines) Time : 95.3079 ms
Time per Line : 2.88812 ms
================
Test file: eval_data/web_with_typos.txt
0.869582, 0.865393
Total (97 lines) Time : 169.416 ms
Time per Line : 1.74656 ms
================
================
Avg Score
0.891501, 0.887757
================
C API
include/kiwi/capi.h 를 참조하세요.
컴파일된 바이너리 다운로드
https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다.
C# Wrapper
https://github.com/bab2min/kiwi-gui
Python3 Wrapper
또한 Python3용 API인 Kiwipiepy가 제공됩니다. 이에 대해서는 https://github.com/bab2min/kiwipiepy 를 참조하시길 바랍니다.
R Wrapper
mrchypark님께서 작업해주신 R언어용 wrapper인 elbird가 있습니다.
GO Wrapper
codingpot 커뮤니티가 작업해주신 go언어용 wrapper인 kiwigo가 있습니다.
응용 프로그램
Kiwi는 C# 기반의 GUI 형태로도 제공됩니다. 형태소 분석기는 사용해야하지만 별도의 프로그래밍 지식이 없는 경우 이 프로그램을 사용하시면 됩니다. 다음 프로그램은 Windows에서만 구동 가능합니다. https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다.
업데이트 내역
-
v0.15
- 둘 이상의 형태소로 더 잘게 분리될 수 있는 형태소를 추가 분리하는 옵션인
splitComplex
도입 - 부사파생접사를 위한
XSM
태그 추가 및 이에 해당하는 형태소-이
,-히
,-로
,-스레
추가 - 조사/어미에 덧붙는 받침을 위한
Z_CODA
태그 추가 및 조사/어미에서 자동으로 Z_CODA를 분절해내는 기능 추가 - 형태 분석 및 언어 모델 탐색 속도 최적화
- 옛한글 문자를 특수 기호로 분리하지 않고 일반 한글과 동일하게 처리하도록 개선
- 형태소 분석 기반의 Subword Tokenizer 구현 (현재 실험적으로 지원 중)
- 문장 분리 성능 개선
- 둘 이상의 형태소로 더 잘게 분리될 수 있는 형태소를 추가 분리하는 옵션인
-
v0.14
SS
태그를 여는 태그(SSO)와 닫는 태그(SSC)로 세분화SSO
태그로 시작하여 SSC 태그로 끝나는 범위 내에 포함된 문장을 '안긴문장'으로 처리하여 문장 분리 성능을 개선- 의미에 따라 두 가지로 활용하는
이르다
동사도VV-R(일렀다)
과VV-I(이르렀다)
태그로 나눠 모호성 해소 기능 추가 - 전화번호, 통장번호, IP주소 등의 일련번호를 추출하는
W_SERIAL
태그 추가 랬/댔/잖
의 분석 정확도 개선- 각정 버그 수정 & 언어 모델 정확도 개선
-
v0.13
- 형태소 분석 과정에서 간단한 오타를 교정하는 기능 추가
- 장거리 형태소 간의 관계를 고려할 수 있는 SkipBigram 언어 모델 추가
- 각종 버그 수정 & 언어 모델 정확도 개선
-
v0.12
- 동/형용사 형태소의 불규칙 활용 여부를 표시하는 태그 추가
- 규칙/불규칙 활용 둘 다 가능한
걷다/묻다
동사에 대한 모호성 해소 기능 추가 - 형태소를 결합하여 원본 텍스트를 복원하는 클래스인
kiwi::cmb::AutoJoiner
추가 - 각종 버그 수정 & 언어 모델 정확도 개선
-
v0.11
- 이용자 사전을 관리하는 메소드
kiwi::Kiwi::addPreAnalyzedWord
,kiwi::Kiwi::addRule
가 추가되었습니다. - 분석 시 접두사/접미사 및 동/형용사 파생접미사의 분리여부를 선택할 수 있는 옵션
kiwi::Match::joinNounPrefix
,kiwi::Match::joinNounSuffix
,kiwi::Match::joinVerbSuffix
,kiwi::Match::joinAdjSuffix
가 추가되었습니다. - 결합된 형태소
kiwi::TokenInfo
의position
,length
가 부정확한 버그를 수정했습니다. - 이제 형태소 결합 규칙이 Kiwi 모델 내로 통합되어
kiwi::Kiwi::addWord
로 추가된 동/형용사의 활용형도 정상적으로 분석이 됩니다. - 언어 모델의 압축 알고리즘을 개선하여 초기 로딩 속도를 높였습니다.
- SIMD 최적화가 개선되었습니다.
- 언어 모델 및 기본 사전을 업데이트하여 전반적인 정확도를 높였습니다.
- 이용자 사전을 관리하는 메소드
-
v0.10
- 소스 코드 리팩토링. 인터페이스를
kiwi::KiwiBuilder
(분석기 사전을 관리)와kiwi::Kiwi
(실제 형태소 분석을 수행)로 분할 - CMake 적용
- 언어 모델 엔진 재구현. 메모리 & 속도 최적화. 모델 파일 크기 최적화
- Linux 환경에서 간헐적으로 발생하는 Segmentation Fault 해결
- 소스 코드 리팩토링. 인터페이스를
-
v0.9
default.dict
에 포함된 활용형 단어 때문에 발생하는 오분석 수정- custom allocator에서 발생하는 멀티스레딩 메모리 누수 해결
- mimalloc과 연동가능하도록 옵션 추가 (-DUSE_MIMALLOC)
- 형태소 탐색 시 조사/어미의 결합조건을 미리 고려하도록 변경, 속도 개선
- 일부 명사(
전랑
처럼 받침 + 랑으로 끝나는 미등재 명사) 입력시 분석이 실패하는 버그 수정 - 공백문자만 포함된 문자열 입력시 분석결과가
/UN
로 잘못나오는 문제 수정
-
v0.8
- URL, 이메일, 해시태그, 멘션 검출 추가
- 치(하지), 컨대(하건대), 토록(하도록), 케(하게) 축약형이 포함된 동사 활용형 분석 개선
- 사용자 사전에 알파벳이나 숫자, 특수 기호가 포함시 버그 수정
- 특정 상황에서 결합조건이 무시되던 문제를 해결
-
v0.7
- 사전 로딩 속도 개선
- 이형태 통합 유무 옵션 추가
- 분석 속도 향상
-
v0.6
- 검색 알고리즘 최적화로 인한 속도 향상 (분석 속도: 0.33MB/s)
- 전반적인 정확도 상승 (92%~96%까지)
-
v0.5
- 언어 모형 개선(Kneser-Ney 3-gram LM)
- 전반적인 정확도 상승 (최소 89%에서 94%까지)
- 코퍼스에서 미등록 단어 추출 기능 추가
- 멀티스레딩 지원
-
v0.4
- 알고리즘 개선
- 실행속도 약 101% 향상 (분석 속도: 0.28MB/s)
-
v0.3
- 알고리즘 및 메모리 관리 최적화
- 실행속도 약 86% 향상 (분석 속도: 0.14MB/s)
-
v0.2
- 정확도 85%까지 향상.
- 상호정보량 맵을 이용하여 분석 모호성 감소
- 서술격 조사 생략 추적 가능해짐
- (분석 속도: 0.08MB/s)
-
v0.1
- 첫 릴리즈. 약 80% 정확도
품사 태그
세종 품사 태그를 기초로 하되, 일부 품사 태그를 추가/수정하여 사용하고 있습니다.
대분류 | 태그 | 설명 |
---|---|---|
체언(N) | NNG | 일반 명사 |
NNP | 고유 명사 | |
NNB | 의존 명사 | |
NR | 수사 | |
NP | 대명사 | |
용언(V) | VV | 동사 |
VA | 형용사 | |
VX | 보조 용언 | |
VCP | 긍정 지시사(이다) | |
VCN | 부정 지시사(아니다) | |
관형사 | MM | 관형사 |
부사(MA) | MAG | 일반 부사 |
MAJ | 접속 부사 | |
감탄사 | IC | 감탄사 |
조사(J) | JKS | 주격 조사 |
JKC | 보격 조사 | |
JKG | 관형격 조사 | |
JKO | 목적격 조사 | |
JKB | 부사격 조사 | |
JKV | 호격 조사 | |
JKQ | 인용격 조사 | |
JX | 보조사 | |
JC | 접속 조사 | |
어미(E) | EP | 선어말 어미 |
EF | 종결 어미 | |
EC | 연결 어미 | |
ETN | 명사형 전성 어미 | |
ETM | 관형형 전성 어미 | |
접두사 | XPN | 체언 접두사 |
접미사(XS) | XSN | 명사 파생 접미사 |
XSV | 동사 파생 접미사 | |
XSA | 형용사 파생 접미사 | |
XSM | 부사 파생 접미사* | |
어근 | XR | 어근 |
부호, 외국어, 특수문자(S) | SF | 종결 부호(. ! ?) |
SP | 구분 부호(, / : ;) | |
SS | 인용 부호 및 괄호(' " ( ) [ ] < > { } ― ‘ ’ “ ” ≪ ≫ 등) | |
SSO | SS 중 여는 부호* | |
SSC | SS 중 닫는 부호* | |
SE | 줄임표(…) | |
SO | 붙임표(- ~) | |
SW | 기타 특수 문자 | |
SL | 알파벳(A-Z a-z) | |
SH | 한자 | |
SN | 숫자(0-9) | |
분석 불능 | UN | 분석 불능* |
웹(W) | W_URL | URL 주소* |
W_EMAIL | 이메일 주소* | |
W_HASHTAG | 해시태그(#abcd)* | |
W_MENTION | 멘션(@abcd)* | |
W_SERIAL | 일련번호(전화번호, 통장번호, IP주소 등)* | |
기타 | Z_CODA | 덧붙은 받침* |
* 세종 품사 태그와 다른 독자적인 태그입니다.
0.12.0 버전부터 VV
, VA
, VX
, XSA
태그에 불규칙 활용여부를 명시하는 접미사 -R
와 -I
이 덧붙을 수 있습니다.
-R
은 규칙 활용, -I
은 불규칙 활용을 나타냅니다.
성능
모델(파일 크기) | 웹 | 정제된 웹 | 신문기사 | 문학작품 |
---|---|---|---|---|
소형(15.9MB) | 86.85 | 93.58 | 89.73 | 95.19 |
중형(39.9MB) | 87.09 | 94.12 | 91.23 | 96.73 |
대형(90.4MB) | 86.99 | 93.47 | 92.37 | 97.68 |
결과 예시
프랑스의 세계적인 의상 디자이너 엠마누엘 웅가로가 실내 장식용 직물 디자이너로 나섰다.
(정답) 프랑스/NNP 의/JKG 세계/NNG 적/XSN 이/VCP ㄴ/ETM 의상/NNG 디자이너/NNG 엠마누엘/NNP 웅가로/NNP 가/JKS 실내/NNG 장식/NNG 용/XSN 직물/NNG 디자이너/NNG 로/JKB 나서/VV 었/EP 다/EF ./SF
(Kiwi) 프랑스/NNP 의/JKG 세계/NNG 적/XSN 이/VCP ᆫ/ETM 의상/NNG 디자이너/NNG 엠마누/NNP 에/JKB ᆯ/JKO 웅가로/NNP 가/JKS 실내/NNG 장식/NNG 용/XSN 직물/NNG 디자이너/NNG 로/JKB 나서/VV 었/EP 다/EF ./SF
둥글둥글한 돌은 아무리 굴러도 흔적이 남지 않습니다.
(정답) 둥글둥글/MAG 하/XSA ㄴ/ETM 돌/NNG 은/JX 아무리/MAG 구르/VV 어도/EC 흔적/NNG 이/JKS 남/VV 지/EC 않/VX 습니다/EF ./SF
(Kiwi) 둥글둥글/MAG 하/XSA ᆫ/ETM 돌/NNG 은/JX 아무리/MAG 구르/VV 어도/EC 흔적/NNG 이/JKS 남/VV 지/EC 않/VX 습니다/EF ./SF
하늘을 훨훨 나는 새처럼
(정답) 하늘/NNG 을/JKO 훨훨/MAG 날/VV 는/ETM 새/NNG 처럼/JKB
(Kiwi) 하늘/NNG 을/JKO 훨훨/MAG 날/VV 는/ETM 새/NNG 처럼/JKB
아버지가방에들어가신다
(정답) 아버지/NNG 가/JKS 방/NNG 에/JKB 들어가/VV 시/EP ㄴ다/EF
(Kiwi) 아버지/NNG 가/JKS 방/NNG 에/JKB 들어가/VV 시/EP ᆫ다/EC
데모
https://lab.bab2min.pe.kr/kiwi 에서 데모를 실행해 볼 수 있습니다.
라이센스
Kiwi는 LGPL v3 라이센스로 배포됩니다.
이메일: [email protected]
블로그: http://bab2min.tistory.com/560
기여하기
자세한 내용은 CONTRIBUTING.md 에서 확인해주세요.
인용하기
DOI 혹은 아래의 BibTex를 이용해 인용해주세요.
@software{minchul_lee_2022_7041425,
author = {Minchul Lee},
title = {Kiwi, Korean Intelligent Word Identifier},
month = sep,
year = 2022,
publisher = {Zenodo},
version = {v0.14.0},
doi = {10.5281/zenodo.7041425},
publisher = {GitHub},
journal = {GitHub repository},
howpublished = {\url{https://github.com/bab2min/Kiwi}}
}