Bareun vs Kiwi: approach, operation, and accuracy compared
Bareun and Kiwi (the Python package kiwipiepy) are both widely used for Korean morphological analysis, but they take different approaches to the problem.
Kiwi combines a dictionary (knowledge base) with a statistical language model to find the most plausible analysis path. Its strengths are the speed of its C++ core and its open-source license. Bareun is a neural analyzer trained as a transformer-based segmenter (Segmenter) → POS tagger (PosTagger) pipeline. It is delivered as a server and also includes a spell check feature.
Kiwi has clear strengths too
Kiwi is fast, lightweight, and free and open source. It has built-in features that are useful in practice, such as word spacing correction, simple typo correction, sentence splitting, and custom word addition, and it is easy to use in a Python environment. This document does not aim to rank the two. It aims to lay out where Bareun and Kiwi differ.
Comparison at a glance
| Item | Bareun | Kiwi (kiwipiepy) |
|---|---|---|
| Analysis method | Trained transformer model (segmentation → tagging → post-processing) | Dictionary (knowledge base) + statistical language model |
| Out-of-vocabulary words (OOV) | The model guesses from context and marks the source with out_of_vocab | Has a feature for extracting out-of-vocabulary words (statistics-based) |
| Colloquial speech and new words | Colloquial and contracted forms are handled at training time | Based on the dictionary and language model, supplemented by a custom dictionary |
| Custom dictionary | Updated live without downtime (file change detection), shared on the server | Supports adding custom words (generally loaded at initialization) |
| POS system | 47 POS defined by the National Institute of Korean Language + 8 major units | Based on the Sejong tag set |
| Word spacing and typo correction | auto_spacing and auto_jointing + spell check (spell check build) | Built-in word spacing and simple typo correction |
| Delivery form | Server (gRPC/REST/connect-web) + multi-language clients | Python package (C++ core), embedded locally |
| License | Morphological analysis is free for research and non-commercial use (paid for commercial use); the spell checker is paid | Open source (free) |
Where they differ
The difference between the two analyzers starts with "solving with a dictionary and language model, or with a trained neural network". This fundamental difference is covered in more depth in Dictionary approach vs transformer.
- Out-of-vocabulary words and colloquial speech:
Bareunhas a separate segmentation stage and reads context with a transformer model, so it can guess at new words and contracted forms that are not in the dictionary from their form and context. The segmentation model uses 115 labels, including whitespace handling rules (14 of them are for error detection). With embeddings that include morphological information, it distinguishes 12,175 words that have the same surface form but different morphological forms. Guessed results carry theout_of_vocabvalue that shows their source. - Operation and deployment:
Kiwiis embedded in the Python process and runs fast locally.Bareunruns as a server, so many users and clients in several languages (Python, Java, JavaScript, R) share one model. - Dictionary updates: With
Kiwi, the usual approach is to add custom words and then re-initialize the analyzer.Bareundetects file changes in the custom dictionary directory in real time and applies them immediately without stopping the server. - Spell check:
Bareunalso provides a spell check built on its morphological analysis, and each correction comes with a reason and the rule it is based on. How the checker works, and how it differs from other spell checkers, is covered in Spell checker comparison.
Out-of-vocabulary source marker
Bareun does not break when it meets a word that is not in the dictionary. Each morpheme carries an out_of_vocab value that shows where it came from: a learned embedding, an automatic guess, a custom dictionary, and so on.
You can tell right away whether a result is a guess or is backed by a dictionary, so the side that processes the response can judge how far to trust it.
Numeric comparisons depend on the environment
Bareun's accuracy (POS tagging 99.6%, eojeol (a space-delimited word unit) split/restore 99.7%) was measured on our own evaluation set.
The accuracy and speed of Kiwi and other analyzers depend on the model version, dictionary, evaluation set, hardware, and measurement method, so we recommend measuring absolute numbers again in the same environment when you compare.
Related documents
- Bareun vs Mecab-ko: comparison with another dictionary-based analyzer
- Adapting to colloquial speech and new words: why Bareun handles out-of-vocabulary words and colloquial speech well
Frequently asked questions
Q. Isn't Kiwi faster?
Kiwi has a C++ core, so it tends to be light and fast. Bareun runs neural network inference, so single-request latency can differ, but you can raise throughput by choosing executionProvider (CPU/GPU) and by batch processing. Speed depends heavily on the measurement environment, so we suggest comparing on the same input and hardware.
Q. Both correct word spacing. What is the difference?
Kiwi has built-in word spacing and simple typo correction. On top of spacing adjustment (auto_spacing and auto_jointing), Bareun has a separate spell check that also covers non-standard words, loanwords, and confusable words, and it provides the reason for each correction and the rule it is based on.
Q. When does Bareun have the advantage?
It has the advantage with text full of new words and colloquial speech, in operating environments where the dictionary has to be updated often, when several language clients must share one server, and when you also need a spell check. On the other hand, if you only want fast, lightweight morphological analysis in a single Python environment, an embedded analyzer such as Kiwi is also a good choice.
Q. How does Bareun handle ambiguity between identical surface forms?
Bareun uses embeddings that include morphological information, so words with the same surface form but different morphological forms become different tokens. It found 12,175 words that need this distinction, and it evaluates disambiguation accuracy on an ambiguity evaluation set of 35,396 sentences / 8,285 surface forms. Unlike approaches that solve this through a dictionary and language model, the model distinguishes the form directly from context.
You can see how this evaluation set is built in Ambiguity evaluation dataset.