Jasontreks Blog

DM 보내기

메세지는 텔레그램 챗봇에 의해 익명으로 전달됩니다. 답장을 받으려면 이메일을 입력하세요.
Send

Docling 라이브러리 적용

YOLOv11 및 PyMuPDF를 이용한 PDF 문서 추출 파이프라인은 대체로 양질의 결과물을 냈지만, 추출한 텍스트를 문서 구조 상 자연스럽게 읽히도록 정렬하고 제목과 본문과 테이블등을 마크다운으로 구조화하는 작업은 여전히 개발자의 몫이였다.

또 기존의 파이프라인은 poppler라는 파이썬과 별개의 패키지에 의존하고 있으며, 사전학습 모델 파일도 직접 관리해야하기에 프로젝트 관리 측면에서 불편함이 있었다.

이러한 모든 귀찮은 작업들을 한방에 해결해줄, 문서 분석만을 위해 만들어진 올인원 패키지가 분명 어딘가에 있을것이라는 생각이 들어서 조사해보았다. 그리고 Docling이라는 매우 훌륭한 오픈소스 패키지를 발견하였다.

Docling

Docling은 IBM Research가 개발한 만능 문서 분석 프레임워크이다. 내부적으로 DocLayNet으로 학습된 레이아웃 분석 모델을 사용하며, 후처리 단계에서 문서 구조에 맞에 읽기 순서를 추론해 레이아웃을 정렬하는 과정을 포함한다.

또 Docling은 pip install docling으로 간단히 설치해 사용할 수 있다. 모델 파일이 필요하지만 HuggingFace에서 자동으로 다운로드 하므로 개발자는 코드만 작성하면 된다.

Docling은 PDF와 MS 문서, HTML등을 지원하며 각각 다른 파이프라인에 의해 처리된다. 파이프라인은 분석, 취합 과정을 거쳐 최종적으로 Docling Document 형식으로 변환되는데, docx나 pptx, html등은 구조가 정의된 문서이기에 Simple Pipeline으로 간단히 처리된다.

하지만 PDF는 구조가 존재하지 않는 문서로 OCR, 레이아웃 분석, 테이블 구조화와 같은 여러 단계에 의해 처리된다.

Docling 초기화 코드

def __init__(self) -> None:
    self.pipeline_options = PdfPipelineOptions(artifacts_path=os.getenv('DOCLING_ARTIFACTS_PATH'))

    # OCR 옵션: 사용 안함
    self.pipeline_options.do_ocr = False
    # 테이블 구조화 옵션: 사용함
    self.pipeline_options.do_table_structure = True
    # 이미지 생성 옵션: 사용함
    self.pipeline_options.generate_picture_images = True
    self.pipeline_options.generate_table_images = True
    self.pipeline_options.images_scale = 3.0 # 이미지 크기가 높은수록 해상도 좋음

    if torch.cuda.is_available():
        # GPU 가속 옵션
        self.pipeline_options.accelerator_options = AcceleratorOptions(
            device=AcceleratorDevice.CUDA
        )
    

Docling 문서 분석 코드

def process_file(self, fm: FileManager) -> bool:
    try:
        # 파일 타입에 따른 포맷 옵션 분유
        match fm.file_type:
            case '.pdf':
                input_format = InputFormat.PDF
                format_option = PdfFormatOption(pipeline_options=self.pipeline_options)

            case '.docx':
                input_format = InputFormat.DOCX
                format_option = WordFormatOption(pipeline_options=self.pipeline_options)

            case '.pptx':
                input_format = InputFormat.PPTX
                format_option = PowerpointFormatOption(pipeline_options=self.pipeline_options)

            case _:
                logging.error(f"지원하지 않는 파일 형식: {fm.file_type}")
                return False

        # 변환기 생성
        converter = DocumentConverter(
            format_options={input_format: format_option}
        )
        
        # 문서 분석 수행
        result = converter.convert(os.path.join(fm.exclusive_path, fm.file_name))
        # 문서 분석 결과 (레이아웃 단위로 추출된 텍스트) 순회
        self.parsed_doc_items = list(result.document.iterate_items())
        self.parsed_markdown = result.document.export_to_markdown()

        self.metadata = {
            'type': 'file',
            'name': str(fm.file_name),
            'path': fm.exclusive_path,
            'hash': fm.file_hash,
            'date': date.today().strftime('%Y-%m-%d')
        }

        return True
    
    except Exception as e:
        logging.error(f"문서 변환 실패: {e}")
        return False

분석 결과

원본 PDF 페이지

Markdown 포맷으로 출력한 Docling 분석 결과

<!-- image -->

## 신장병의모든것(1)

## 개요

만성신장병은 한국 국내 35세 이상 성인 7명 중 1명이 앓을 정도로 흔하나(대한신장학회자료), 
치료를 제대로 받거나 병에 대해 정확히 아는 환자가 적은 대표적인 질환이다. 
한국 국내 여러 조사 결과를 종합 하면 이 병을 앓는 환자 중 병을 제대로 아는 사람은 1.3~6.3%에 불과했다고 밝혀졌다. 
이는 당뇨병, 고혈압 환자의 병 인지도(각각 69%, 45%) 보다 크게 낮다. 본호에서는 신장과 신장병에 대하여 알아본다.

## 키워드

신장의 기능, 신장병의 종류, 만성신장염, 혈당조절과 신장의 역할, 비타민D

## 정상신장의해부학적위치및구조

<!-- image -->

<!-- image -->

<!-- image -->

## 저자 김성철

영남대학교임상약학대학원겸임교수 약학정보원학술자문위원

다음 포스트

Django 웹앱 구축 및 Ollama 챗봇 적용