데이터 과학

pdf 파일 데이터 추출

학습 목표

  • 광학문자인식(OCR) 기술을 통한 텍스트 추출 과정을 이해한다.
  • .pdf 파일에서 데이터를 추출한다.
  • .pdf 파일에서 추출된 데이터를 정제하는 기법을 살펴본다.

1. .pdf 파일에서 텍스트 추출 1 2

.pdf 파일에서 데이터를 추출하는 작업은 흔한 데이터 랭글링(wrangling, 정제작업)으로 다음 세가지 범주로 설명가능하다.

  • .pdf 파일에서 텍스트 추출
  • .pdf 파일에서 표(Table) 추출
  • .pdf 파일에서 텍스트가 아닌 스캔, 이미지 추출

마지막, .pdf 파일 혹은 고품질 이미지나 사진에서 텍스트를 추출하는 과정은 광학문자인식(Optical character recognition, OCR)과 밀접한 관련이 있다.

1.1. .pdf 파일을 텍스트로 변환하는 도구

1.2. .pdf 파일에서 표를 추출하는 도구

1.3. OCR 작업흐름 3

Data Science Toolkit을 통해 원하는 대부분의 경우 데이터를 획득할 수 있다. OCR을 통해 데이터를 추출하는 경우 자동차 조립라인처럼 다양한 프로그래밍 도구를 컨베이어에 태워 흘리는 과정을 거치게 된다.

  1. 내용물 정제작업
  2. 레이아웃(layout) 이해
  3. 페이지별 레이아웃에 따라, 텍스트 조각을 추출.
  4. 텍스트 조각을 재조합해서 유용한 형태로 변환.

OCR 이미지 처리 과정

unpaper를 많이 사용하고 있으며, 스캔당시에 검은 얼룩을 제거하거 하거나, 배경과 출력 텍스트를 정렬하고 기울어진 텍스트를 곧게 펴는 작업 등이 포함된다. OCR 엔진은 .ppm (픽스맵 파일형식, pixmap format)만 지원하기 때문에 이미지를 .ppm 파일 형식으로 변환한다.

2. .pdf 파일로부터 표 추출 작업 4 5

.pdf 파일로부터 표를 추출하는 경우 tabulizer 팩키지를 활용하는 것도 가능하다. tabulizer 팩키지는 tabula-java를 기반으로 하고 있어, tabulizerjars 파일도 함께 설치한다.

tabulizer 팩키지를 설치하게 되면, examples/data.pdf 파일에 유명한 mtcars, iris 데이터를 PDF 파일에 표로 출력되어 있다. 이를 extract_tables() 함수를 사용해서 원래 데이터를 복원한다.

#1. 환경설정-------------------------------

#library(devtools)
#install_github(c("ropenscilabs/tabulizerjars", "ropenscilabs/tabulizer"), args = "--no-multiarch")

#2. 표추출-------------------------------
library(tabulizer)

# 경로 확인
.libPaths()
[1] "/Library/Frameworks/R.framework/Versions/3.2/Resources/library"
# "C:/Users/KwangChun/Documents/R/win-library/3.3" 사용자 라이브러리 경로 위치
f <- system.file(path="examples", file="data.pdf", package = "tabulizer")

2.1. iris 데이터 복원

examples/data.pdf 파일 2페이지에 iris 데이터가 표형식으로 찍혀있다. 이를 extract_tables(f, pages = 2, method = "data.frame") 명령어로 추출한다.

out1 <- extract_tables(f)
str(out1)
List of 3
 $ : chr [1:32, 1:10] "mpg" "21.0" "21.0" "22.8" ...
 $ : chr [1:7, 1:3] "Sepal.Width" "3.5" "3.0" "3.2" ...
 $ : chr [1:15, 1] "supp" "VC" "VC" "VC" ...
iris_ocr <- extract_tables(f, pages = 2, method = "data.frame")

#3. 데이터프레임 변환--------------------------

iris_df <- iris_ocr[[1]]
# library(dplyr)
glimpse(iris_df)
Observations: 6
Variables: 5
$ Sepal.Length <dbl> 5.1, 4.9, 4.7, 4.6, 5.0, 5.4
$ Sepal.Width  <dbl> 3.5, 3.0, 3.2, 3.1, 3.6, 3.9
$ Petal.Length <dbl> 1.4, 1.4, 1.3, 1.5, 1.4, 1.7
$ Petal.Width  <dbl> 0.2, 0.2, 0.2, 0.2, 0.2, 0.4
$ Species      <chr> "setosa", "setosa", "setosa", "setosa", "setosa",...