Skip to content

steernick/ocr-crude-steel-production

Repository files navigation

OCR-ekstrakcja danych dotyczących produkcji stali z tabel z plików .pdf

Cel i motywacje:

Niniejszy projekt miał na celu pozyskanie danych o wysokości rocznej produkcji stali (crude steel)
w poszczególnych krajach w latach 1951 - 2022.

Dane te planuję wykorzystać w innym projekcie, który zamierzam zrealizować w przyszłości.

W czasie mojej kwerendy internetowej okazało się, że nie ma ogólnodostępnych danych w uporządkowanym formacie (.csv, .json lub in.) dotyczących produkcji stali w poszczególnych krajach na przestrzeni dłuższego czasu.

Jedyne dostępne dane zamieszczone były w formie tabel w plikach pdf (w większości zeskanowanych publikacji papierowych) w poniższych źródłach:

Użyte technologie:

  • Python w wersji 3.11.5
  • Pytesseract w wersji 0.3.10
  • pdf2image w wersji 1.16.3
  • inne biblioteki takie jak: re, Pathlib, collections, json
  • na początkowym etapie w celu przygotowania plików użyłem programu GIMP w wersji 2.10.36

Przebieg:

Projekt podzieliłem na kilka etapów:

Etap 1.

Wstępne przygotowanie plików do użycia w procesie OCR (Optical Character Recognition), polegające na eksportowaniu konkretnych stron zawierających table z plików PDF, a następnie z pomocą programu do obróbki graficznej GIMP, pliki pochodzące z roczników statystycznych ONZ, przyciąłem do odpowiedniego rozmiaru, eliminując niepotrzebne części tabel (np. w języku francuskim).
Przykładowy efekt można zobaczyć tu.

Etap 2.

Właściwa obróbka w technologii OCR. Z pomocą biblioteki pdf2image następuje konwersja plików PDF w obrazy, a następnie przy użyciu metody .image_to_string z biblioteki pytesseract, ekstrakcja tekstu oraz zapisanie go do oddzielnych plików tekstowych.

Kluczem do uzyskania maksymalnie użytecznego rezultatu jest konfiguracja samego pytesseract:

custom_config = r'--oem 3 --psm 6 -c preserve_interword_spaces=1'

Powyższa konfiguracja jest efektem użycia "metody prób i błędów" w sprawdzaniu różnych wariantów ustawień.

Etap 3.

Celem tego etapu było uzyskanie listy państw występujących w tabelach z zamiarem wykorzystania jej w późniejszej (właściwej ekstrakcji).
Poza uzyskaniem listy państw następuje również wstępna filtracja plików tekstowych i zapisanie ich do nowych plików TXT.
Do tego etapu zaliczyć można również ręczną edycję i filtrację pliku z listą państw, celem usunięcia niepożądanych wyrazów (nazw państw), które nie zostały wychwycone przez algorytm.

Etap 4.

(plik: main.py)

Jest to główny etap obróbki plików tekstowych, którego celem ma być powstanie plików w formacie CSV.

W pliku main.py na początku umieszczone są definicje funkcji użytych zarówno w tym pliku, jak i w innych.

Następnie zostają wczytana lista państw oraz z plik w formacie JSON zawierający słownik z mapowaniem występujących w tekście ciągów znaków, które powinny być zamienione na właściwą nazwę państwa. Słownik ten stworzyłem ręcznie w trakcie udoskonalania programu, w celu ostatecznego poprawienia ciągów znaków, które nie zostały automatycznie poprawione w użytych w programie algorytmach.

Główna część programu składa się z dwóch pętli 'for', zagnieżdżonych jedna w drugiej. Zewnętrzna iteruje pliki tekstowe, znajdujące się folderze, wewnętrzna linie w każdym z tych plików. Każda iteracja pętli zewnętrznej składa się z następujących czynności:

  • ekstrakcja nagłówka,
  • zainicjowanie zmiennej przechowującej liczbę kolumn,
  • zainicjowanie zmiennej (listy), która będzie przechowywać poszczególne pola z danymi dla formatu CSV.

Później następuje przejście do pętli wewnętrznej, gdzie wykonywane są następujące czynności:

  • ekstrakcja części ciągu znaków, która po dalszej obróbce stanie się nazwą państwa,
  • ekstrakcja ciągów liczbowych, które po dalszej obróbce staną się wartościami produkcji stali w danym roku,
  • obróbka ciągów liczbowych w celu wyodrębnienia konkretnych wartości z pomocą wzorów wyrażeń regularnych z biblioteki re oraz instrukcji warunkowych.
  • obróbka ciągu znaków w celu wyodrębnienia poprawnej nazwy państwa z użyciem wcześniej zaimportowanych listy państw, słownika mapującego oraz funkcji stworzonej z wykorzystaniem współczynnika Jaccarda.
  • na końcu uzyskane pola danych łączone są przecinkami w wiersze a te dodawane do zmiennej csv_fields_list.

Następnie wykonywane jest przejście do pętli zewnętrznej, gdzie ostatnią czynnością jest połączenie nagłówka z listą wierszy ze zmiennej csv_fields_list w gotowy tekst w formacie CSV, który zapisywane jest do oddzielnego pliku, również w formacie CSV.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages