Skip to main content

머신 러닝을 활용한 문서 정보 추출

이 글에서는 송장, 영수증, 대출 서류, 청구서, 발주서처럼 템플릿 기반 문서에서 모델을 활용해 정보를 추출합니다. 이 글은 AI 번역본입니다. 번역 오류가 있으면 댓글로 알려 주세요.
Created on September 15|Last edited on September 15
이 글에서는 정형 문서와 비정형 문서에서 정보를 추출하는 방법을 다룹니다. 특히 다음 내용을 중심으로 설명합니다. 양식형 문서에서 정보 추출을 위한 표현 학습 Google의 논문입니다. 이 논문은 또한 다음에 채택되었습니다 ACL 2020.

이미지 출처: Nanonets 블로그
명함을 스캔해서 연락처, 이메일, 주소 등 모든 연락처 정보를 바로 추가할 수 있다면 어떨까요? 흥미롭지 않나요? 이 작은 기능이 시간을 크게 절약해 줍니다.
문서에서 정보를 추출하는 일은 사람에게 번거로운 작업이며, 당연히 비용도 많이 듭니다.
정보를 추출하는 딥러닝 접근법 몇 가지를 살펴보겠습니다

GitHub에서 코드를 확인하세요 →

참고: 코드 구현이 예상대로 동작하지 않지만, 이 논문을 구현하기 위한 좋은 출발점이 될 것입니다.

목차



다양한 접근법

  1. 템플릿 기반 정보 추출
이미지 출처: ACL 데모 슬라이드
전통적인 접근법은 템플릿 기반 방법을 사용하고 일치시킵니다 OCR−템플릿에 맞춰 텍스트를 정렬하고 정보를 추출하는 방식이다. 그러나 청구서의 레이아웃 변동이 매우 커서 이 접근법을 대규모로 적용하기는 어렵다.

그림 1
출처 : 논문
서로 다른 공급업체의 청구서는 제각각의 레이아웃으로 정보를 제시한다. 템플릿 기반 접근법은 확장성이 낮고 오류가 발생하기 쉽다.
이 블로그 글에서는 이에 대한 상위 수준 개요를 다룹니다 양식형 문서에서 정보 추출을 위한 표현 학습 논문. 다른 기법에 대해 더 알고 싶다면 이곳을 방문하세요 블로그 글 Nanonets 작성

데이터셋 상세 정보

이 논문에서 저자들은 두 가지 서로 다른 데이터셋을 사용했다.
  1. 청구서: 청구서 코퍼스는 두 가지가 있다. 첫 번째 코퍼스에는 14,237개의 청구서가, 두 번째 코퍼스에는 595개의 청구서가 포함되어 있다. 청구서들은 공통 템플릿을 공유하지 않으며, 각 청구서의 템플릿은 서로 모두 다르다.
청구서 코퍼스는 비공개 데이터셋입니다.
  1. 영수증: 이 데이터셋은 ICDAR 2019 스캔된 영수증 OCR 및 정보 추출(SROIE) 강건 읽기 챌린지의 일환으로 공개된 스캔 영수증 코퍼스입니다.
이 데이터셋에는 주소, 회사명, 총액, 날짜의 네 가지 필드에 대한 정답과 함께 626장의 이미지가 포함되어 있다. 우리는 이 중에서만 사용할 것이다. 총액날짜 해당 필드를 목표로 사용한다. 이 데이터셋에는 좌표와 해당 텍스트가 포함된 OCR 처리된 CSV 파일도 함께 제공된다.
샘플 이미지

샘플 정답
{
"company": "BOOK TA .K (TAMAN DAYA) SDN BHD",
"date": "25/12/2018",
"address": "NO.53 55,57 & 59, JALAN SAGU 18, TAMAN DAYA, 81100 JOHOR BAHRU, JOHOR.",
"total": "9.00"
}

관찰사항

모델 설명에 들어가기 전에 몇 가지 관찰사항을 먼저 살펴보겠습니다.
  1. 각 필드는 대개 잘 정의된 유형과 대응한다. 예를 들어, 다음과 같은 값들은 유력한 후보가 될 수 있다. 총액 숫자 값의 사례가 될 것이다. “Weights & Biases” 같은 텍스트는 해당 항목에 대해 명백히 올바르지 않다. 총액 필드.


이미지 출처: ACL 데모 슬라이드
유형으로 검색 공간을 제한하면 문제의 복잡도가 크게 줄어듭니다. 따라서 각 필드에 대한 후보를 생성하기 위해 일부 라이브러리를 사용할 것입니다. 예를 들어, 다음과 같은 항목에 대한 잠재적 후보 생성기는 날짜 필드는 날짜 파서 라이브러리가 될 것입니다. 또한 다음과 같은 클라우드 서비스를 사용할 수도 있습니다 Google NLP 후보를 더욱 효과적으로 생성하기 위해.
  1. 각 필드 인스턴스는 키 구문과 연결됩니다. 예를 들어, 그림 1에서 날짜 인스턴스는 항상 키 구문으로 둘러싸여 있음을 추론할 수 있습니다. 날짜 또는 날짜 표시됨또한 키 구문이 항상 같은 줄에 등장하는 것도 아닙니다. 효과적인 해결책은 텍스트 정보와 함께 공간 정보를 포함하는 것입니다.

이미지 출처: ACL 데모 슬라이드

공간 정보를 어떻게 포함할까요?

공간 정보는 각 단어 주변의 이웃을 고려하여 포함됩니다. 이 논문의 저자들은 이웃을 선택하기 위해 이웃 영역을 정의했습니다.
이웃 영역각 후보에 대해 이웃 영역은 페이지의 왼쪽 끝까지, 그리고 후보 상단에서 페이지 높이의 10퍼센트까지 위로 확장됩니다.
경계 상자가 이웃 영역과 50퍼센트 넘게 겹치는 텍스트 토큰은 이웃으로 간주합니다.
  1. 핵심 구문 해당 필드에 대해 사용되는 표현은 주로 제한된 어휘에서 나옵니다. 송장에 포함된 날짜 항목의 약 93%는 “date” 또는 “dated”와 같은 핵심 구문과 함께 나타납니다(논문에서). 이는 적은 양의 학습 데이터로도 이 문제를 해결할 수 있음을 시사합니다.


이미지 출처: ACL 데모 슬라이드
위에서 언급한 모든 관찰 결과는 다양한 문서 전반의 여러 필드에 두루 적용됩니다.
이 문제에서는 모델 자체보다 데이터 전처리가 훨씬 더 중요합니다. 위의 관찰을 바탕으로 데이터 처리 파이프라인을 살펴보겠습니다.

이미지 출처: ACL 데모 슬라이드
  1. OCR이미지에서 텍스트를 추출하려면 OCR을 적용해야 합니다. 다음과 같은 오픈 소스 도구를 사용할 수 있습니다. EasyOCR, PyTesseract 또는 다음과 같은 클라우드 서비스 Google OCR우리의 경우에는 ICDAR에서 이미 OCR된 텍스트를 제공했습니다.
  2. 후보 생성기(엔터티 태깅)앞서 살펴본 내용처럼 우리는 여러 후보 생성기를 사용해 후보를 생성할 것입니다. 전체 시스템의 재현율은 후보 생성기의 재현율을 넘을 수 없기 때문에, 후보 생성기의 재현율을 높게 유지하는 것이 중요합니다.
  3. 점수화 및 할당 모듈이 모듈은 신경망 모듈을 사용해 각 후보에 대해 0부터 1 사이의 점수를 독립적으로 계산하고, 그다음 각 필드에 대해 실제 추출값일 가능성이 가장 높은 점수를 받은 후보를 할당합니다.
점수화와 할당을 분리하면, 각 후보를 다른 후보나 필드와 무관하게 오직 해당 후보의 주변 맥락만으로 표현을 학습할 수 있습니다. 또한 필요할 경우 청구서의 마감일이 청구서 발행일보다 앞설 수 없다는 등의 임의로 복잡한 비즈니스 규칙을 할당기에 자유롭게 인코딩할 수 있습니다.(에서 논문)
간결성을 위해 저자들은 할당 모듈의 세부 내용을 생략하고, 다른 필드와 무관하게 각 필드에서 가장 높은 점수를 받은 후보를 선택하는 단순한 할당 방식으로 결과를 보고합니다.

신경 점수화 모델

모델이 다양한 문서 템플릿에 걸쳐 일반화되도록, 모델은 후보와 그 후보가 속한 필드에 대해 각각 별도의 임베딩을 학습하고, 후보 임베딩과 필드 임베딩 간의 유사도로 점수를 결정합니다.
저자들이 내린 또 하나의 중요한 설계 선택은 우연한 과적합을 피하기 위해 후보 텍스트를 모델에 포함하지 않는 것입니다. 예를 들어, 데이터셋에 2020년 이전의 청구서만 포함되어 있다면, 모델이 학습하는 과정에서 다음과 같은 편향을 획득할 가능성이 있습니다 청구서 발행일 2020년 이전에 발생해야 합니다.



이웃 임베딩: 이웃 텍스트 토큰은 단어 임베딩 테이블을 사용해 임베딩합니다. 각 이웃의 상대적 위치는 드롭아웃이 적용된 두 개의 ReLU 활성화 층으로 이루어진 비선형 위치 임베딩으로 표현합니다. 이러한 비선형 임베딩은, 예를 들어 후보와 같은 행에 있는 이웃과 바로 위 행에 있는 이웃처럼 위치상의 미세한 차이를 구분하도록 모델이 학습할 수 있게 해 줍니다.(에서 논문)
이웃 인코딩: 모든 이웃 임베딩은 서로 독립적입니다. 이웃 간의 관계를 포착하기 위해 셀프 어텐션 이 메커니즘을 사용하면 예측과 관련 없는 이웃의 가중치를 낮추고, 이웃의 문맥화된 표현을 생성할 수 있습니다.


후보 위치 임베딩: 후보 위치는 간단한 선형 레이어를 사용해 임베딩합니다.
이웃의 상대적 위치 정보는 임베딩 자체에 이미 반영되어 있으므로, 특징에 이웃들이 임의의 순서로 포함되더라도 이웃 인코딩이 불변성을 갖도록 하기 위해 맥스 풀링 메커니즘을 사용합니다.


후보 인코딩: 후보 인코딩은 이웃 인코딩과 후보 위치 임베딩을 연결하여 얻습니다.



필드 임베딩: 필드 ID도 필드 임베딩 레이어를 사용해 임베딩하여 필드 ID의 표현을 생성합니다.

후보 점수: 후보 인코딩에는 후보의 위치 정보와 이웃에 대한 세부 정보가 모두 포함되어야 합니다. 이는 후보가 속한 필드와는 독립적입니다.
이제 계산합니다 코사인 유사도 후보 인코딩과 필드 임베딩 사이의 유사도를 계산합니다. 유사도 값은 -1에서 1 사이이므로 이를 0에서 1 사이로 단순히 리스케일한 뒤, 점수가 가장 높은 후보를 선택합니다.

결과

이 모델의 장점을 입증하기 위해, 논문 저자들은 두 가지 기준 모델을 제안하고 결과를 비교했습니다.
단어 가방 (BoW) 기준 모델은 후보 주변의 토큰만 포함하고, 그 위치 정보는 포함하지 않습니다. MLP 기준 모델은 제안한 모델과 동일한 입력 특징을 사용하며, 후보의 이웃에 대한 상대적 위치를 포함하고, 3개의 은닉층으로 후보를 인코딩합니다.
두 기준 모델 모두 동일한 접근을 따르며, 후보와 필드를 서로 분리하여 인코딩합니다.


이 모델이 두 가지 기준 모델보다 우수하다는 것은 명확합니다. 이웃 위치를 사용하는 MLP 기준 모델은 BoW 기준 모델보다 더 좋은 성능을 보입니다.
특징 중요도의 상대적 순서:
neighbor text > candidate position > neighbor position
또한 자기어텐션 층을 제거하면 스코어러의 ROC AUC가 1포인트, 엔드투엔드 최대 F1이 1.7포인트 악화되는 것으로 관찰되었습니다.

모델 표현

이 논문의 흥미로운 부분은 모델의 내부 표현을 분석하고 t-SNE(차원 축소 기법)을 사용해 시각화했다는 점입니다.
표현이 어떻게 보이는지 기대되시나요? 함께 살펴보죠.

유의 사항:
  1. 그림 4(b)를 보면 양성 포인트는 깔끔하게 군집을 이루는 반면, 음성 포인트는 공간적으로 성긴 분포를 보인다는 것이 분명합니다.
  2. 중요한 점은 필드 임베딩이 클러스터의 중심이 아니라, 점들로부터 멀리 떨어진 클러스터의 가장자리에 위치한다는 것입니다. 이러한 패턴은 손실 함수가 본질적으로 필드 임베딩과 그 양성 샘플 사이의 코사인 거리를 최소화하고, 음성 샘플과의 거리를 최대화하도록 학습하기 때문이며, 특히 다른 필드의 양성 샘플들과의 거리를 가장 중요하게 멀어지도록 만들려는 데서 예측할 수 있습니다.
  3. 그림 4(c)에서 보면 invoice date 해당 예시는 송장 날짜 클러스터에서 멀리 떨어져 있습니다. 이것이 라벨을 지정한 주석자의 실수임이 분명합니다. purchase dateinvoice date.
  4. 그림 4(d)에서 샘플의 후보 인코딩은 사이에 위치합니다 invoice datedue date이는 해당 후보가 due date와 date of invoice라는 두 용어로 둘러싸여 있기 때문이라고 설명할 수 있습니다.
  5. 그림 4(e)에서 샘플의 후보 인코딩은 …로부터 멀리 떨어져 있습니다 invoice date 클러스터입니다. 면밀히 검토한 결과, 이는 다음과 같은 이유 때문임을 확인했습니다. OCR 스캔 노이즈로 인한 오류.
모델의 표현을 시각화하는 것은 일반적으로 어떤 모델에서든 큰 도움이 된다고 믿습니다.



결론

이 블로그 글이 즐거우셨길 바랍니다. 문서에서 정보를 추출하는 일은 매우 어렵고 도전적인 과제입니다. 후보 생성기의 정확도를 높이는 문제는 여전히 연구가 진행 중이며, 많은 도메인 전문 지식이 필요합니다. 댓글이나 제 을 통해 언제든지 의견을 들려주세요. 트위터 핸들.


이 글은 AI로 번역된 기사입니다. 오역이 의심되는 부분이 있으면 댓글로 알려주세요. 원문 보고서는 다음 링크에서 확인하실 수 있습니다: 원문 보고서 보기
Ivan Goncharov
Ivan Goncharov •  
Really interesting read and application!
1 reply
Tulasi Ram Laghumavarapu
Tulasi Ram Laghumavarapu •  
Thanks for letting me know. Will update soon.
Reply
Ayush Chaurasia
Ayush Chaurasia •  
Hey, great article. The link to github is not working. Please look into it
2 replies