TIL|PPT-PDF 문서 테이블 추출 테스트

Yeseul Han·2024년 10월 10일
0

🌞 시작하는 글

작지만 조금씩 발전하고 있으니 좋음
코드도 깔끔하게 쓰려고 노력하는게 좋음

🎯 오늘의 TODO LIST

[✔] 각 조건일때 키밸류 읽는것 해보기
[✔] TS Expert 주엘지에 가져갈것 확인해보기
[✔] PDF 문서 추출 테스트

⚗️ 오늘의 실험

sentence splitter 정확도 실험

1) 품사분리

from koalanlp.proc import SentenceSplitter, Tagger

tagger = Tagger(...) ### 품사분석기 ###
tagged_sentence = tagger.tagSentence("무엇인가 품사분석을 수행할 문단")
paragraph = SentenceSplitter.sentencesTagged(tagged_sentence[0]) # tagged_sentence는 각 인자별로 한 문장으로 간주된 List[Sentence]임.

2) 품사분리 없음

from koalanlp import API
from koalanlp.proc import SentenceSplitter

splitter = SentenceSplitter(splitter_type=API.HANNANUM)
paragraph = splitter("분리할 문장을 이렇게 넣으면 문장이 분리됩니다. 간단하죠?")
# 또는 splitter.sentences(...), splitter.invoke(...)

print(paragraph[0]) # == 분리할 문장을 이렇게 넣으면 문장이 분리됩니다.
print(paragraph[1]) # == 간단하죠?

kss 사용

$pip install nltk
$python -m nltk.downloader all

ppt-pdf 문서 테이블 추출 테스트

이하 스택오버플로우 의견

1) Tabula
장점:

간편함: 단순한 테이블 추출에 있어서 설치와 사용이 비교적 쉽다.
Java 기반: Java에 의존하고 있으며, 일정한 레이아웃을 가진 PDF에서 잘 작동한다.
성능: 텍스트 기반의 PDF (텍스트를 선택할 수 있는 PDF)에서 특히 잘 작동한다.
단점:

Java 설치 필요: Tabula를 사용하려면 Java가 설치되어 있어야 한다.
복잡한 테이블에 취약: 셀 병합이 있거나 복잡한 레이아웃을 가진 테이블을 처리하는 데 한계가 있을 수 있다.
2) Camelot
장점:

파이썬만 사용: Java 의존성이 없어서 파이썬 환경에서 더 가볍게 사용할 수 있다.
정교한 제어 가능: 테이블 추출을 더 세밀하게 조정할 수 있는 옵션이 많아 복잡한 테이블에서도 효과적이다.
Stream 방식: 테이블과 텍스트의 경계가 명확하지 않은 경우에도 물리적 구조에 기반해 테이블을 추출할 수 있는 방법을 제공한다.
스캔된 PDF에 강함: 스캔된 PDF나 복잡한 레이아웃에서도 Tabula보다 유연하게 대응할 수 있다.
단점:

설정이 필요함: Tabula보다 초기 설정과 튜닝이 더 복잡할 수 있다.
속도 문제: 간단한 PDF에서는 Tabula보다 처리 속도가 느릴 수 있다.

내 테스트 결과

텍스트 추출과 테이블 형식으로 리턴하는건 둘 다 잘 나왔다.
사실 camelot이 더 잘 나올줄 알았는데, 실제로 테스트 결과 camelot은 테이블이 분리되는 증상이 있어서 tabula가 나은듯 추출되는 결과물은 dataframe 형식인듯 하다.

!apt-get install openjdk-11-jdk
!pip install tabula-py
import tabula
tables = tabula.read_pdf(file_name, pages='all')
for table in tables:
	print(table)
!apt-get install ghostscript
!pip install camelot-py[cv]
!pip install PyPDF2==1.26.0
import camelot
tables = camelot.read_pdf(file_name, pages='all')
for table in tables:
	print(table.df)

오늘의 에러로그 :


dataframe을 dictionary처럼 다뤘을때 나는 에러.
.to_dict()를 해야함.

profile
코딩 잘하고 싶다

0개의 댓글