Tesseract Korean OCR: which model reads your scans
68%
syllables right on column scans, Hangul_vert best
On columns, -l kor reads 3%
Most old Korean books print in columns. kor reads lines across:
3.0% syllables right with kor
65.1% with -l kor_vert
Both are the fast files that apt and Homebrew install.
Hangul_vert best reads the most columns
Proofread column scans from 22 books, from woodblock prints to 1930s novels. Syllables right, of 32,729:
| Model | Size | Right |
|---|---|---|
| kor, fast | 1.7 MB | 3.0% |
| tesseract.js 7, its kor | 2.2 MB | 5.2% |
| kor_vert, fast | 1.1 MB | 65.1% |
| kor_vert, best | 4.0 MB | 66.5% |
| kor_vert, tessdata | 1.1 MB | 66.6% |
| script/Hangul_vert, best | 16.5 MB | 68.4% |
The hardest books were two woodblock prints, scanned as two-page spreads with Hanja beside the Hangul: 6.5% and 15.4%.
How I tested it
- Pages: ko.wikisource scans whose text was proofread (level 3) or also checked by a second person (level 4). Books picked by a seeded shuffle, not by me, one file per work.
- Each page is a real scan: a DjVu file, or a PDF page that holds a full-page image. Pages were drawn at the scan's own width, up to 1920 px.
- I looked at every page. I left out 3 woodblock books printed in Hanja only, whose text is a Korean translation, and 3 handwritten books.
-
One plain
tesseractrun per page and model, default settings, Tesseract 5.5.4. - A syllable counts when it is found in order. Only modern Hangul syllables count. Hanja and old syllables are left out on both sides.
-
--psm 5(columns) made the fast kor_vert worse: 63.8%.
Lines across: kor best
Only 2 books here are printed in lines, from 1932 and 1947, so this is a rough check. Syllables right, of 4,175:
| Model | Right |
|---|---|
| tesseract.js 7, its kor | 54.3% |
| kor+eng | 63.8% |
| kor, fast | 84.1% |
| kor, best | 86.0% |
Adding eng made kor read less.
A space after every syllable: the vert files
One printed column from a 1912 novel:
| Read by | Text |
|---|---|
| Proofread |
도로 강두에 삽붓올나 물가에 느러진 버들가지도 쥬루룩 훌고
언덕우에 휘
|
| kor_vert |
도로 강 두 에 삽 불 나 물 가 에 느 러진 버 들 가 지 도 쥬 루
룩 훌 고 언 덕 우에 휘
|
| kor_vert, spaces kept |
도로 강두에 삽불나 물가에 느러진 버들가지도 쥬루룩 훌고
언덕우에 휘
|
kor has the setting preserve_interword_spaces. The vert
files do not. Spaces per 1,000 syllables on columns:
894.2 with kor_vert
131.1 with the setting
The proofread text has 251.7. With the setting, the syllables stayed the same on all 89 pages.
No Hanja, no old letters
kor can write 1,076 Hangul syllables and no Han character. Of the proofread syllables:
4.3% not in kor, mostly old spellings like 긔 and 셩
0 old syllables written, of 3,974
kor+chi_tra read 33.9% of the Hanja on the line pages, and its Hangul fell to 79.7%.
Install the model and run it
apt (tesseract-ocr-kor-vert) and Homebrew (tesseract-lang) install the fast kor_vert. To use Hangul_vert best, put it in a folder:
mkdir -p ~/tessdata
curl -L -o ~/tessdata/Hangul_vert.traineddata \
https://raw.githubusercontent.com/tesseract-ocr/tessdata_best/4.1.0/script/Hangul_vert.traineddata
tesseract page.png page --tessdata-dir ~/tessdata -l Hangul_vert \
-c preserve_interword_spaces=1
In Python, for a page in columns:
import os
import pytesseract
TESSDATA = os.path.expanduser("~/tessdata")
text = pytesseract.image_to_string(
"page.png",
lang="Hangul_vert",
config=f"--tessdata-dir {TESSDATA} -c preserve_interword_spaces=1",
)
For lines across, use -l kor.
What I did not test
- Windows and Linux. One Mac, Tesseract 5.5.4.
- Modern office documents: only 2 books here print in lines.
- Handwriting, phone photos, screenshots and signs.
- Training a model with old Hangul.
- Other OCR engines.
Sources
Our Actor has no Korean yet
Our Apify Actor reads 10 languages, not Korean, so I did not run it on these scans.
Two ways to skip the work
Run it yourself. Our Apify Actor turns scanned PDFs into Markdown, tables included.
Or send us the scan. Tack, our AI, does the job for $29, up to 50 pages. First page free.
Questions people ask
Which Tesseract model is best for Korean?
On 81 column scans, script/Hangul_vert best got 68.4% of the syllables right, the fast kor_vert 65.1% and kor 3.0%. On lines across, kor best got 86.0%.
Why does Tesseract put a space after every Korean syllable?
The kor_vert and script/Hangul_vert files lack one setting that kor has. Add -c preserve_interword_spaces=1.
Can Tesseract kor read Hanja?
No. kor has no Han characters. kor+chi_tra read 33.9% of the Hanja on the line pages and fewer Hangul syllables.