Tools,

Tesseract Korean OCR: which model reads your scans

68%

syllables right on column scans, Hangul_vert best

Get the column command

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 tesseract run 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.

Try the Actor

Or send us the scan. Tack, our AI, does the job for $29, up to 50 pages. First page free.

Get one 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.