# Kiwi : 지능형 한국어 형태소 분석기(Korean Intelligent Word Identifier)  x86_64: [](https://github.com/bab2min/Kiwi/actions) [](https://github.com/bab2min/Kiwi/actions) [](https://github.com/bab2min/Kiwi/actions) [](https://github.com/bab2min/Kiwi/actions) Other: [](https://github.com/bab2min/Kiwi/actions) [](https://github.com/bab2min/Kiwi/actions) Kiwi는 빠른 속도와 범용적인 성능을 지향하는 한국어 형태소 분석기 라이브러리입니다. 한국어 처리에 관심 있는 사람이면 누구나 쉽게 사용할 수 있도록 오픈 소스로 공개 중이며, C++로 구현된 코어 라이브러리를 래핑하여 다양한 프로그래밍 언어에 사용할 수 있도록 준비 중입니다. 형태소 분석은 세종 품사 태그 체계를 기반으로 하고 있으며 모델 학습에는 세종계획 말뭉치와 모두의 말뭉치를 사용하고 있습니다. 웹 텍스트의 경우 약 87%, 문어 텍스트의 경우 약 94% 정도의 정확도로 한국어 문장의 형태소를 분석해 낼 수 있습니다. 또한 간단한 오타의 경우 모델 스스로 교정하는 기능을 지원합니다(0.13.0버전 이후). 아직 부족한 부분이 많기에 개발자분들의 많은 관심과 기여 부탁드립니다. ## 특징  텍스트 분석 속도가 다른 한국어 형태소분석기들과 비교하여 꽤 빠른 편입니다. 자세한 벤치마크 결과는 [이 문서](https://docs.google.com/spreadsheets/d/1XmuYKDpV5d_WTGNgY73BJGHZ8_AUZKQXpEys819qH2Y/edit?gid=1956520937#gid=1956520937)에서 확인 가능합니다.  또한 자체적으로 경량 언어모델을 탑재하여 모호성이 있는 경우에도 제법 정확하게 형태소를 분석해냅니다. CoNg 모델에서부터는 모호성 해소 성능이 더욱 크게 향상되었습니다. (모호성 해소 성능 평가는 [이 페이지](https://github.com/bab2min/kiwipiepy/tree/main/benchmark/disambiguate)에서 수행가능합니다. )  문장 분리 기능을 비롯한 다양한 편의기능을 제공합니다. (문장 분리 성능 평가는 [이 페이지](https://github.com/bab2min/kiwipiepy/tree/main/benchmark/sentence_split)에서 수행가능합니다. ) 라이브러리 차원에서 멀티스레딩을 지원하기 때문에 대량의 텍스트를 분석해야할 경우 멀티코어를 활용하여 빠른 분석이 가능합니다. ## 웹 데모 페이지 최신 버전의 Kiwi를 사용해볼 수 있는 [웹 데모 페이지](https://kiwi.bab2min.pe.kr/)를 제공하고 있습니다. 간단하게 테스트를 해보실 경우 웹 데모 페이지를 사용하시고 대량의 텍스트 처리가 필요한 경우 아래 설명된 방법으로 Kiwi를 설치하셔서 로컬에서 구동하시는 걸 권장해드립니다. ## 설치 ### C++ #### 컴파일된 바이너리 다운로드 https://github.com/bab2min/Kiwi/releases 에서 Windows, Linux, macOS, Android 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다. #### Windows Visual Studio 2019 이상을 사용하여 `Kiwi.sln` 파일을 실행하여 컴파일할 수 있습니다. #### Linux 이 레포지토리를 clone한 뒤 cmake>=3.12를 사용하여 컴파일합니다. 모델 파일은 용량이 큰 관계로 [Git LFS](https://git-lfs.github.com/)를 통해 공유됩니다. 따라서 `git clone`에 앞서 Git LFS가 설치되어있는지 확인해주세요. ##### gcc >= 7 이상 혹은 기타 c++17 호환 컴파일러 사용가능 환경 ```console $ 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 ``` 설치가 잘 됐는지 확인하기 위해서는 `kiwi-evaluator`를 실행해봅니다. ```console $ ./kiwi-evaluator --model ../models/base ../eval_data/* --largest 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 버전부터 추가된 오타 교정 기능이 잘 작동하는지 확인하기 위해서는 다음과 같이 실행합니다. ```console $ ./kiwi-evaluator --model ../models/base ../eval_data/* --largest --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, Android 버전으로 컴파일된 Library 파일과 모델 파일을 다운로드 받을 수 있습니다. ### C# Wrapper https://github.com/bab2min/kiwi-gui 에서 공식 GUI 툴에 사용되는 C# Wrapper를 찾으실 수 있습니다. 또한 EX3님께서 기여해주신 wrapper인 [NetKiwi](https://github.com/EX3exp/NetKiwi)가 있습니다. ### Python3 Wrapper 또한 Python3용 API인 Kiwipiepy가 제공됩니다. 이에 대해서는 https://github.com/bab2min/kiwipiepy 를 참조하시길 바랍니다. ### Java Wrapper Java 1.8 이상에서 사용 가능한 KiwiJava가 Java binding으로 제공됩니다. 이에 대해서는 [bindings/java](bindings/java)를 참조하시길 바랍니다. ### Android Library Android NDK를 통해 Android 앱에서 사용할 수 있는 AAR 라이브러리가 제공됩니다. GitHub Releases에서 `kiwi-android-VERSION.aar` 파일을 다운로드하여 Android 프로젝트에 추가하면 됩니다. - **최소 요구사항**: Android API Level 21+, ARM64 아키텍처 - **사용법**: [bindings/java](bindings/java)의 README 참조 - **패키지**: AAR 형태로 제공되어 Gradle 프로젝트에 쉽게 통합 가능 ### Swift Wrapper iOS 12.0 이상 및 macOS 10.14 이상에서 사용 가능한 Swift binding이 제공 예정입니다. 조금만 기다려주세요. - **최소 요구사항**: iOS 12.0+ / macOS 10.14+, Swift 5.7+ - **사용법**: [bindings/swift](bindings/swift)의 README 참조 - **설치**: Swift Package Manager 지원 ### R Wrapper [mrchypark](https://github.com/mrchypark)님께서 기여해주신 R언어용 wrapper인 [elbird](https://mrchypark.github.io/elbird/)가 있습니다. ### GO Wrapper [codingpot](https://discord.gg/rnNJBag42N) 커뮤니티가 작업해주신 go언어용 wrapper인 [kiwigo](https://github.com/codingpot/kiwigo)가 있습니다. ### Web Assembly (Javascript/Typescript) [RicBent](https://github.com/RicBent)님께서 기여해주신 Web Assembly binding이 있습니다. 이에 대해서는 [bindings/wasm](bindings/wasm)를 참조하시길 바랍니다. ### Rust Wrapper [JAICHANGPARK](https://github.com/JAICHANGPARK)님께서 개발하신 Rust용 wrapper인 [kiwi-rs](https://github.com/JAICHANGPARK/kiwi-rs)가 있습니다. ### Flutter Wrapper [JAICHANGPARK](https://github.com/JAICHANGPARK)님께서 개발하신 Rust용 wrapper인 [flutter_kiwi_nlp](https://github.com/JAICHANGPARK/flutter_kiwi_nlp)가 있습니다. ### 응용 프로그램 Kiwi는 C# 기반의 GUI 형태로도 제공됩니다. 형태소 분석기는 사용해야하지만 별도의 프로그래밍 지식이 없는 경우 이 프로그램을 사용하시면 됩니다. 다음 프로그램은 Windows에서만 구동 가능합니다. https://github.com/bab2min/kiwi-gui 에서 다운받을 수 있습니다. ## 업데이트 내역 업데이트 내역은 [릴리즈 노트](//github.com/bab2min/Kiwi/releases)를 참고해주세요. ## 품사 태그 세종 품사 태그를 기초로 하되, 일부 품사 태그를 추가/수정하여 사용하고 있습니다.
| 대분류 | 태그 | 설명 |
|---|---|---|
| 체언(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) | |
| SB | 순서 있는 글머리(가. 나. 1. 2. 가) 나) 등)* | |
| 분석 불능 | UN | 분석 불능* |
| 웹(W) | W_URL | URL 주소* |
| W_EMAIL | 이메일 주소* | |
| W_HASHTAG | 해시태그(#abcd)* | |
| W_MENTION | 멘션(@abcd)* | |
| W_SERIAL | 일련번호(전화번호, 통장번호, IP주소 등)* | |
| W_EMOJI | 이모지* | |
| 기타 | Z_CODA | 덧붙은 받침* |
| Z_SIOT | 사이시옷* | |
| USER0~4 | 사용자 정의 태그* |