Korean morphological analyzers compared: which one to choose (Bareun, Kiwi, KoNLPy, Mecab-ko)
In short: If you just want to pull out morphemes lightly in Python, use Kiwi. To swap between several analyzers for papers or exercises, use
KoNLPy. To process expressions registered in a dictionary quickly, use Mecab-ko. To handle real service text that mixes new words and colloquial speech
in a production environment, and to solve spell checking in the same place, use Bareun.
This document puts the four side by side in one table and lays out the criteria for choosing what suits which situation. Individual comparisons are covered in more detail in Bareun vs Kiwi, Bareun vs Mecab-ko, Bareun vs KoNLPy, and Bareun vs Khaiii.
Comparison at a glance
| Item | Bareun (bareunpy) | Kiwi (kiwipiepy) | KoNLPy | Mecab-ko |
|---|---|---|---|---|
| Analysis method | Transformer-trained model (segmentation → tagging → post-processing) | Dictionary + statistical language model | Python wrapper around several analyzers | Dictionary + cost-based statistical search |
| Python package | bareunpy | kiwipiepy | konlpy | mecab-python3 (or via KoNLPy) |
| Delivery form | Server (gRPC/REST/connect-web) + multi-language clients | Python package (C++ core), embedded locally | Python library (backends installed separately) | Library/binary |
| Out-of-vocabulary words (OOV) | Guessed from context, with the source shown in out_of_vocab | Has an OOV word extraction feature (statistics-based) | Follows the wrapped analyzer | Limited when a word is not in the dictionary |
| Custom dictionary | Live updates with no downtime, shared on the server | Add user words (loaded at initialization) | Varies by backend | Requires recompiling the dictionary |
| POS system | 47 parts of speech per the National Institute of Korean Language + 8 major units | Based on the Sejong tag set | Varies by backend | Based on the Sejong tag set |
| Homonym sense disambiguation (WSD) | Provided as sense numbers (beta) | None | None | None |
| Spell checking | Provided in the same product (with correction reasons and rule grounds) | Word spacing and simple typo correction | None | None |
| AI agent integration | MCP server provided | None | None | None |
| License | Morphological analysis free for research and non-commercial use (paid for commercial use), spell checker paid | Open source (free) | Open source (free) | Open source (free) |
The strengths of open-source analyzers are clear
Kiwi, KoNLPy, and Mecab-ko are free, easy to install, and run directly inside a Python process.
For research, exercises, and small batch jobs, they are often enough. The aim of this document is not to rank them but to lay out
under which conditions the choice changes.
Selection criteria by purpose
1. Research or exercises, comparing several analyzers → KoNLPy
KoNLPy wraps Okt, Komoran, Hannanum, Kkma, and Mecab behind the same interface.
It is convenient for exercises and papers where you switch analyzers and compare results. However, each wrapped backend differs in
installation method, POS system, and accuracy, so you have to settle on a single backend when putting it into a service as is.
2. Fast, in a single Python process → Kiwi
kiwipiepy is done with a single pip install and is light because of its C++ core.
Word spacing correction, sentence splitting, and adding user words are built in, which makes it easy to drop straight into a preprocessing pipeline.
3. Large volumes of dictionary-registered expressions → Mecab-ko
For formal documents where the dictionary and the cost table fit well, it is fast and stable. On the other hand, when new words not in the dictionary come in, the analysis goes off, and adding a custom dictionary requires recompiling.
4. Service operation, new words, and spell checking too → Bareun
If any one of the four points below applies, Bareun has the advantage.
- Text that mixes new words and colloquial speech: Data such as reviews, customer support, and social media, where expressions not in the dictionary keep coming in.
Bareunhas a separate segmentation step and reads context with a transformer, so it guesses words not in the dictionary from their form and context, and marks whether the result is a guess or dictionary-backed with theout_of_vocabvalue. - Operations that need frequent dictionary updates: Environments where proper nouns and technical terms keep growing.
Bareundetects custom dictionary changes in real time and applies them without stopping the server (The value of a zero-downtime custom dictionary). - Clients in several languages sharing one model: Python, Java, JavaScript, and R all call the same server.
- Spell checking needed alongside: You do not have to bolt morphological analysis and correction together from two different products.
The difference seen in Python code
This is how the three libraries are called to analyze the same sentence.
from bareunpy import Tagger
tagger = Tagger(apikey="YOUR_API_KEY", host="api.bareun.ai", port=443)
res = tagger.tags(["아이스크림을 먹었다"])
print(res.pos()) # [('아이스크림', 'NNG'), ('을', 'JKO'), ...]
from kiwipiepy import Kiwi
kiwi = Kiwi()
print(kiwi.tokenize("아이스크림을 먹었다"))
from konlpy.tag import Okt
okt = Okt()
print(okt.pos("아이스크림을 먹었다"))
Only Bareun is a server call, so it needs an API key. In return, you do not need to distribute model files to each developer's PC,
and the custom dictionary and model version are managed in one place on the server. In an air-gapped network, install the server yourself
and use the same code as is (Installation overview).
What only Bareun provides
- Homonym sense disambiguation (WSD, beta): It tells you with a sense number whether
말is [말/馬 (horse)] or [말/言 (speech)]. Other analyzers do not have this feature (Homonym analysis resources compared). - Spell checking with grounds for corrections: It returns what was changed and why, as a category, a reason, and the source of the rule (Korean spell checkers compared).
- MCP server: AI agents such as Claude, VS Code, and Cursor call morphological analysis and correction as tools (Using the MCP server).
Numeric comparisons vary by environment
Bareun's accuracy (POS tagging 99.6%, eojeol (space-delimited word unit) splitting/restoration 99.7%) is measured on our own evaluation set
(How accuracy is measured). The accuracy and speed of other analyzers vary with version, dictionary, evaluation set, and hardware,
so for absolute numeric comparisons we recommend measuring again in the same environment.
Related documents
- Bareun vs Kiwi · Bareun vs Mecab-ko · Bareun vs KoNLPy · Bareun vs Khaiii
- Processing speed benchmark · Adaptability to colloquial speech and new words
- Python client (bareunpy): installation and first call
Frequently asked questions
Q. Which Korean morphological analyzer do you recommend?
The answer depends on the use. For light use in a single Python process, Kiwi. For research or exercises comparing several analyzers,
KoNLPy. For bulk processing of formal documents registered in the dictionary, Mecab-ko is a safe choice. If you handle service text
that mixes new words and colloquial speech, need to update a custom dictionary often, or need spell checking alongside, Bareun has the advantage.
Q. What Python libraries are there for Korean morphological analysis?
bareunpy (Bareun), kiwipiepy (Kiwi), konlpy (a wrapper for Okt, Komoran, Kkma, Hannanum, and Mecab),
and mecab-python3 (Mecab-ko) are the main ones. Only bareunpy works by calling a server; the rest are embedded locally.
Q. Can I use it for free?
Kiwi, KoNLPy, and Mecab-ko are open source and free. Bareun's morphological analysis is free for research and non-commercial use,
paid for commercial use, and the spell checker is paid. For details, see the License policy.
Q. Is there an analyzer that distinguishes homonyms (same spelling, different meaning)?
Bareun provides homonym sense disambiguation (WSD) as sense numbers (beta). Kiwi, KoNLPy, and Mecab-ko do not have
this feature, so if you need it you have to attach a separate model yourself.
Q. Is it hard to move from an open-source analyzer to Bareun?
The POS system and the way you call it differ, so you need tag mapping and changes to the client code. That said, with bareunpy you just run
pip install bareunpy and enter an API key, and in an air-gapped network you install the server and change only host to run the same code.