Overview

  • 이미지만을 고려하는 기존 OCR 서비스와는 달리, PDF에 담긴 정보까지 이용해 모바일 기사로 나타낼 수 있는 정보를 만드는 Serverless 기반 백엔드와 검수용 프론트엔드 개발 프로젝트
  • 요구 사항을 분석해 AWS Serverless 서비스들을 이용한 구조로 문제를 쪼개고 각 Lambda의 초중반부 개발을 진행했습니다.
  • 수백 건 단위의 Lambda concurrency를 동원해 수십 페이지 단위의 PDF 정형화를 동시에 진행할 수 있었습니다.

Technology

  • S3 presigned url을 이용해 PDF를 업로드하면 PDF 정형화 Step Function이 호출되도록 구성
  • PDF를 HTML로 변환해서 좌표 정보를 추출하는 Lambda 개발 및 유지 보수
  • Step Functions Activity Worker 를 이용한 이미지 처리 Worker 개발
  • 모든 Lambda와 Step Function의 event payload 문서화 및 관리

Milestones

마일스톤 별로 집중했던 개발 내용에 따라서 정리했습니다.

1st. 신문 레이아웃 이미지 처리 돌려보기

  • pdf를 문서보다는 이미지 데이터로 간주해 레이아웃에 대한 object detection 모델을 적용해 기반 기술로 활용
  • 제목, 문단, 이미지 등 기사 요소를 레이아웃이라고 정의하고 layout-parser Python library 적용

2nd. 통합 Step Function 구성

  • pdf를 변환하고 데이터를 추출하는 PDF Converter Lambda를 pdf2htmlEX 기반으로 구축
  • stefuna 라이브러리로 Step Functions Activity Worker 형태의 Layout Parser 라이브러리 서비스화
  • Group article: 모든 결과를 종합해 기사 별로 묶는 알고리즘을 마지막에 배치
  • S3 presigned url을 통해 신문 pdf를 S3에 업로드하면 아래와 같은 Step Function이 구동되고 SQS를 통해서 처리 결과를 획득할 수 있는 아키텍처; AWS docs
stateDiagram-v2
	pdf2naverocr: PDF Converter
	layout_parser: Layout Parser
	news: Group articles
	
	[*] --> pdf2naverocr
	pdf2naverocr --> layout_parser
	layout_parser --> news
	pdf2naverocr --> news
	news --> SQS
	SQS -->[*]

3rd. 결과 품질 개선, 결과 저장, 검수용 FE

  • 워드 프로세서를 이용해 위에서부터 아래로 pdf를 작성한 경우와 그렇지 않은 경우로 나눠 알고리즘 개선
  • 띄어쓰기 정제 모듈 도입
  • 아래와 같이 용어를 정의하고 DB 스키마 정의

    신문 권호 - 페이지 - 기사 - 레이아웃

  • serverless-express 를 이용해 Step Function 내부와 검수용 Frontend에서 Postgres DB에 접근할 수 있도록 함
stateDiagram-v2
	pdf2naverocr: PDF Converter
	layout_parser: Layout Parser
	news: Group articles
	express: Serverless Express
	db: Postgres
	
	express --> db

	[*] --> pdf2naverocr
	pdf2naverocr --> express
	pdf2naverocr --> layout_parser
	layout_parser --> news
	layout_parser --> express
	pdf2naverocr --> news
	news --> Spacing
	Spacing --> SQS
	Spacing --> SNS
	Spacing --> express
	
	express --> Frontend
	SQS --> Frontend
	Frontend --> [*]

4th. 구조 개선 및 Naver OCR로 텍스트 소실 PDF 처리

  • pdf 업로드 로직에 pdf를 장별로 분할하는 기능 추가
  • Naver OCR을 적용해 텍스트 추출이 불가능한 pdf에 대응
    • 텍스트의 출처를 원본 pdf와 Naver OCR로 나누어 별도의 파이프라인을 만들어 레이아웃 별로 텍스트를 할당하고 띄어쓰기를 보정함
    • 레이아웃을 기사 별로 묶는 알고리즘을 텍스트 처리와 분리해 개발과 테스트를 독립적으로 수행함
  • 마지막에 Step Function 바깥에서 DB 쿼리를 통해서 텍스트의 출처를 OCR과 PDF 중 선택하고 변경할 수 있음
flowchart TD
	pdf2naverocr[PDF Converter]
	express[Serverless Express]
	db[Postgres]
	layout_parser[Layout Parser]
	ocr_layout[OCR Layout]
	ocr_spacing[Spaced OCR Text]
	pdf_spacing[Spaced PDF Text]
	news[Group articles]
	final[Final Articles with text]
	
	express --- db
	express --- Redis

	Start --> pdf2naverocr
	pdf2naverocr -.- express
	pdf2naverocr --> news
	pdf2naverocr --> layout_parser
	layout_parser -.- express	
	
	pdf2naverocr --> OCR
	OCR -.- express

	layout_parser --> news
	pdf2naverocr --> pdf_spacing
	pdf_spacing -.- express

	layout_parser --> ocr_layout
	OCR --> ocr_layout
	ocr_layout -.- express
	ocr_layout --> ocr_spacing
	ocr_spacing -.- express

	news -.- express
    news --> final
    pdf_spacing --> final
    ocr_spacing --> final

	final --> SQS
	final --> SNS
	final -.- express
	express --> Frontend
	SQS --> Frontend

Lessons

  • pdf 자료 구조에 대한 이해를 얻었습니다.
  • AWS Serverless 서비스들을 조합한 아키텍처로 비즈니스 로직이 많이 들어간 대용량 데이터 처리를 효율적으로 할 수 있음
  • 프로젝트 기간 중 AWS SDK integration for Step Functions 기능이 출시되며 Step Functions 내부에서 연동이 가능한 AWS 서비스들이 갑자기 많아졌는데, 이것를 보고 AWS가 Serverless를 정말 강력하게 추진하고 있음을 느꼈습니다.
  • 클라우드 아키텍처의 복잡성에도 불구하고 수동 배포를 한 탓에 종합적인 진행 상황이 잘 관리되지 않아 연동과 테스트가 쉽지 않았었습니다. 복잡성이 있는 Serverless 프로젝트에는 CDK를 반드시 도입할 계획으로 개인적으로 미리 기술을 익혀두고 있습니다.