OCR in Python mit PyTesseract#
In diesem Notizbuch werden wir pyTesseract ausführen, um maschinenlesbaren Text zu erzeugen aus:
einem JPEG-Bild
einem mehrseitigen PDF
einem Korpus mehrseitiger PDFs
Importieren von Tools #
import pytesseract
from PIL import Image
Verarbeitung eines Bildes #
So können wir OCR auf dieses Bild des Zeitungsartikels (‘Die Grippe wütet weiter’) durchführen:
ocr_output = pytesseract.image_to_string(Image.open('grippe.jpeg'), lang='frk')
print(ocr_output)
Zie Grippe wüfel weiter
Zunahme der ſchweren Fälle in Berlin.
Die Zahl der Grippefälle iſt in den leßten
beider Tagen auch in Groß-Berlin noH
erf>lih zeftiegen. Die Worenhäuſer und ſon-
Kaen aroßen GeſhHäfte, die Krirgs- unh die prie
n Betriebe lagen, daß übermäig viele An«
- fich heben rer? melden müſſen,-und an<
; “ Loſt und 5ei der Straßenbahn iſt der
ſoz der Grippelrantken bedeuten) g&
7 3 >r 2 8 1
Verarbeitung eines (mehrseitigen) PDFs#
Mit ein wenig mehr Python-Code können wir pytesseract auch verwenden, um gesamte PDF-Dateien mit vielen Seiten zu OCRen:
from pathlib import Path
from pdf2image import convert_from_path
from tqdm import tqdm
sample_pdf_path = Path('../data/pdf/SNP27112366-19181224-0-0-0-0.pdf')
recognized_pages = []
converted_pdf = tqdm(convert_from_path(sample_pdf_path, use_cropbox=True))
for image in converted_pdf:
recognized = pytesseract.image_to_string(image,
lang='frk')
#print(recognized)
recognized_pages.append(recognized)
Schauen wir uns die erste Seite an:
print(recognized_pages[0])
Letzte Seite:
print(recognized_pages[-1])
Keines dieser Ergebnisse sieht besonders gut aus (hauptsächlich aufgrund der Scan-Qualität und allgemeiner Herausforderungen bei der Arbeit mit alten Zeitungen). In den nächsten Abschnitten werden wir lernen, wie man
a) die OCR-Qualität misst
b) die Qualität in der OCR-Nachkorrekturphase verbessert
Um die OCR-Funktion auf einer anderen PDF-Datei auszuführen, müssen Sie in der obigen Zeile einen Dateipfad dazu angeben: sample_pdf_path = Path('/path/to/your.pdf')
.
Was ist ein Dateipfad? (klicken)
Ein Dateipfad ist eine Zeichenkette, die deinem Programm sagt, wo eine Datei auf deinem Computer oder Server gespeichert ist. Er hilft dem Programm, Dateien zu finden und auf sie zuzugreifen, um sie zu lesen, zu schreiben oder zu bearbeiten.
Arten von Dateipfaden:#
Absoluter Dateipfad:
Ein absoluter Pfad gibt den vollständigen Speicherort einer Datei ausgehend vom Stammverzeichnis deines Systems an.Beispiel unter Windows:
C:\Users\JohnDoe\Documents\file.txt
Beispiel unter macOS/Linux:
/Users/JohnDoe/Documents/file.txt
Relativer Dateipfad:
Ein relativer Pfad zeigt dem Programm, wie es eine Datei basierend auf dem aktuellen Arbeitsverzeichnis (dem Ordner, in dem dein Skript ausgeführt wird) finden kann.Beispiel:
Documents/file.txt
(Dies sucht die Datei in einem Ordner namensDocuments
innerhalb des aktuellen Verzeichnisses).
Pfadtrennzeichen:#
Unter Windows verwenden Pfade Backslashes (
\
):
C:\folder\file.txt
Unter macOS/Linux verwenden Pfade Schrägstriche (
/
):
/folder/file.txt
Beispiel in Python:#
# Absoluter Pfad
file = open('C:/Users/JohnDoe/Documents/file.txt')
# Relativer Pfad
file = open('Documents/file.txt')
Python bietet auch Tools, um Pfade so zu handhaben, dass sie auf jedem Betriebssystem funktionieren, wie die Module os
und pathlib
. Wir verwenden oben pathlib
, damit dieses Notebook auf jedem Rechner funktioniert. Dadurch können wir Pfade im Unix-Stil schreiben.
(Advanced) Verarbeitung des gesamten Korpus von PDFs mit derselben OCR-Engine #
Der untenstehende Code verarbeitet alle Dateien im Ordner '../data/pdf'
, die die Endung ‘.pdf’ haben, und speichert die Ergebnisse dann im Ordner '../data/txt'
(die Dateinamen bleiben gleich, aber mit der Endung ‘.txt’ anstelle von ‘.pdf’). WARNUNG: Bei einer großen Anzahl (>5) von PDFs wird dies viel Zeit in Anspruch nehmen.
pathpdf = Path('../data/pdf')
pathtxt = Path('../data/txt')
for filename in tqdm(pathpdf.iterdir()):
if filename.suffix == '.pdf':
converted_pdf = convert_from_path(filename, use_cropbox=True)
output_path = pathtxt / filename.stem
output_path = output_path.with_suffix('.txt')
with output_path.open('w') as output_txt:
for image in converted_pdf:
recognized = pytesseract.image_to_string(image,
lang='frk')
output_txt.write(recognized)