Skip to main content
python versions supported

OCRfixr

OVERVIEW

This project aims to help automate the challenging work of manually correcting OCR output from Distributed Proofreaders' book digitization projects

Correcting OCR Misreads

OCRs can sometimes mistake similar-looking characters when scanning a book. For example, "l" and "1" are easily confused, potentially causing the OCR to misread the word "learn" as "1earn".

As written in book:

"The birds flevv south"

Corrected text:

"The birds flew south"

How OCRfixr Works:

OCRfixr fixes misreads by checking 1) possible spell corrections against the 2) local context of the word. For example, here's how OCRfixr would evaluate the following OCR mistake:

As written in book:

"Days there were when small trade came to the stoie. Then the young clerk read."

Method Plausible Replacements
Spellcheck (symspellpy) stone, store, stoke, stove, stowe, stole, soie
Context (BERT) market, shop, town, city, store, table, village, door, light, markets, surface, place, window, docks, area

Since there is match for both a plausible spellcheck replacement and that word reasonably matches the context of the sentence, OCRfixr updates the word.

Corrected text:

"Days there were when small trade came to the store. Then the young clerk read."

For very common scanning errors where it is clear what the word should have been (ex: 'onlv' --> 'only'), OCRfixr skips the context check and relies solely on a static mapping of common corrections. This helps to maximize the number of successful edits & decrease compute time. (You can disable this by setting common_scannos to "F").

Using OCRfixr

The package can be installed using pip.

pip install OCRfixr

By default, OCRfixr only returns the original string, with all changes incorporated:

>>> from ocrfixr import spellcheck

>>> text = "The birds flevv south"
>>> spellcheck(text).fix()
'The birds flew south'

Use return_fixes to also include all corrections made to the text, with associated counts for each:

>>> spellcheck(text, return_fixes = "T").fix()
['The birds flew south', {("flevv","flew"):1}]

(Note: OCRfixr resets its BERT context window at the start of each new paragraph, so splitting by paragraph may be a useful debug feature)

Interactive Mode

OCRfixr also has an option for the user to interactively accept/reject suggested changes to the text:

>>> text = "The birds flevv down\n south, but wefe quickly apprehended\n by border patrol agents"
>>> spellcheck(text, interactive = "T").fix()
Suggestion 1

Each suggestion provides the local context around the garbled text, so that the user can determine if the suggestion fits.

Suggestion 2
>>> ### User accepts change to "flevv", but rejects change to "wefe" in GUI
'The birds flew down\n south, but wefe quickly apprehended\n by border patrol agents'

This returns the text with all accepted changes reflected. All rejected suggestions are left as-is in the text.

Command-Line

OCRfixr is also callable via command-line (intended for Guiguts use):

>>> ocrfixr input_text.txt output_filename.txt

The output file will list the line number and position of all suggested changes.

Avoiding "Damn You, Autocorrect!"

By design, OCRfixr is change-averse:

  • If spellcheck/context do not line up, no update is made.
  • Likewise, if there is >1 word that lines up for spellcheck/context, no update is made.
  • Only the top 15 context suggestions are considered, to limit low-probability matches.
  • If the suggestion is a homophone of the original word, it is ignored (original: coupla --> suggestion: couple). These are assumed to be 'stylistic' or phonetic misspellings
  • Proper nouns (anything starting with a capital letter) are not evaluated for spelling.

Word context is drawn from all sentences in the current paragraph (designated by a '\n'), to maximize available information, while also not bogging down the BERT model.

Credits

  • symspellpy powers spellcheck suggestions
  • transformers does the heavy lifting for BERT context modelling
  • DataMunging provided a very useful list of common scanning errors
  • SCOWL word list is Copyright 2000-2019 by Kevin Atkinson.
  • This project was created to help Distributed Proofreaders. Support them here: https://www.pgdp.net/c/

Metadata

Release files for OCRfixr 1.5.1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for OCRfixr 1.5.1
File Size Uploaded Provenance Actions
OCRfixr-1.5.1.tar.gz 438.4 kB Without provenance Details for OCRfixr-1.5.1.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for OCRfixr 1.5.1
File Interpreter ABI Platform Actions
OCRfixr-1.5.1-py3-none-any.whl Python 3 none any Details for OCRfixr-1.5.1-py3-none-any.whl

Total release size: 875.7 kB

Release files / OCRfixr-1.5.1.tar.gz

Download URL OCRfixr-1.5.1.tar.gz
Size 438.4 kB
Tags Source
SHA-256 checksum
How to use checksums
acb0a2ded5c837bc26be5ab7b20438cf0e188155ba8b167d25a39664875e1131
BLAKE2b-256 checksum
How to use checksums
5aee40f5fcb864530ebecb7393e59db95aea92ac187730ff478cf7b23a35f390
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/62.3.2 requests-toolbelt/0.9.1 tqdm/4.55.0 CPython/3.9.13

Release files / OCRfixr-1.5.1-py3-none-any.whl

Download URL OCRfixr-1.5.1-py3-none-any.whl
Size 437.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
94681cfb363910a0703a12601c0c6c21ffaabe32c6f4edd887993d5966003a51
BLAKE2b-256 checksum
How to use checksums
0da80cca3e33942db80a5d5d68090b69fa68dd7ebf3ce5b7cac5c49a6ca7f747
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.3.0 pkginfo/1.6.1 requests/2.25.1 setuptools/62.3.2 requests-toolbelt/0.9.1 tqdm/4.55.0 CPython/3.9.13

Security for OCRfixr 1.5.1

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

No provenance found

None of the files in this release were uploaded with provenance metadata.

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page