[KPMG 인턴십] project 1. 나라장터 입찰공고 참여 가능 여부 판단 RPA 프로젝트

박유찬·2023년 10월 20일
0

인턴십 소개

2023년 겨울방학 진행되었던 KPMG 아이디어톤 수상으로 인해 이번 여름방학 기간 동안 삼정KPMG의 AI 부서인 LightHouse에서 2달동안 인턴십을 진행하게 되었다.

1. 프로젝트 소개

여러 프로젝트 중에 가장 관심이 갔던 프로젝트는 나라장터 공고문에서 대기업 참여 여부 판단 로직을 자동화로 만드는 것이었다. 데이터 분석을 통한 합리적인 판단 로직을 만드는 과정이 재밌을 것 같았고, 무엇보다도 자신만의 인사이트를 자유롭게 다양한 방법으로 로직에 녹일 수 있다는 점이 해당 프로젝트를 선택한 가장 큰 이유가 되었다.

나라장터 입찰공고란??

프로젝트를 소개하기에 앞서 나라장터의 입찰공고가 어떤 것인지 파악할 필요가 있다. 나라장터는 조달청에서 운영하는 국가종합전자조달시스템이며, 아주 쉽게 설명하자면 공공기관에서 필요로 하는 물품 등을 조달하기 위한 플랫폼이라고 생각하면 된다.
즉, 공공기관에서 필요로 하는 서비스나 물품에 대한 입찰 공고문이 나라장터에 올라오게 되고, 해당 공고를 기업이 보고 입찰 신청을 넣게 되는 구조이다.

하지만, 모든 공고문마다 입찰 참가자격이 존재한다. 공고문에서 요구하는 조건에 적합한 기업만이 입찰 신청을 넣을 수 있다.

위 한 문장이 이번 프로젝트가 필요한 이유라고 할 수 있다. 하루에도 수백개의 입찰 공고문이 나라장터 플랫폼에 올라오게 되고, 이를 매일 확인하는 과정은 번거로운 업무가 될 수 있다.

하지만 여기서 아래의 의문을 가질 수도 있다.
1. 웹 스크래핑을 통해 올라온 모든 공고문에서 필요한 정보를 추출하거나,
2. open api를 통해 정보를 받으면 되지 않느냐?

프로젝트의 어려움

물론 저 두가지 방법이 가능하다면 굉장히 쉽게 해결될 수 있다. 하지만 문제는 '입찰참가자격'의 내용은 웹에서 스크래핑을 통해 제공되지도 않고, api를 통해서도 얻을 수 없는 정보이다.
'입찰참가자격'은 오직 공고문 내의 한글 파일의 텍스트에서 얻을 수 있으며, 대기업 가능 or 대기업 불가능처럼 간단하게 표현된 것이 아니라 다양한 표현방식의 긴 텍스트로 존재한다.

프로젝트를 정리하자면,
1. 나라장터에서 제공하는 입찰 공고문의 한글 파일에서 참가자격을 다룬 텍스트를 추출한 후,
2. 해당 텍스트를 분석하여 특정 기업이 참여가 가능한지 불가능한지를 판단하는 RPA 로직을 만드는 것이다.
_(결국 이번 RPA 프로젝트는 인하우스 서비스로, 회사 내부에서 사용하게 될 프로젝트이다. 따라서 KPMG(대기업)이 참여 가능한지 아닌지를 판단하는 로직을 설계하는 것이 목표라고 할 수 있다.)

2. process

2.1 한글 문서 내 참가자격 텍스트 추출

대기업 참여 여부 판단 로직을 설계하기 전에 문서 내에서 참가자격 텍스트만을 추출해야 했다. 참가자격 텍스트는 [ 7. 입찰참가자격 ]처럼 참가자격 문단 내에 있어 한글 텍스트를 파싱할 때 [ 7. 입찰참가자격 ~ 8. 다른 문단 ] 사이의 텍스트만을 가져오는 것이 핵심 과정이었다.

약 90프로 이상의 한글 파일은 [ 7. 입찰참가자격 ]이나 [ 나.입찰참가자격 ]같은 형식으로 되어있어 문단을 추출하는 데 문제가 되지 않았다(문단 추출은 파이썬 정규표현식을 사용하였다).

하지만 여러 종류의 공고문을 확인하면 할수록, 많은 예외들이 보였다.
1. 숫자나 기호가 아닌 특수문자로 표현된 경우도 존재했다. ex) [ ◼️. 참가자격 ]
2. 또 다른 예외는 한글이나 워드에서 자동 문단 바뀜이 된 경우(엔터를 누르면 자동으로 숫자 문단이 형성되는 케이스)에서 1. 2. 같은 문단 숫자들이 실제로 한글 파싱을 하면 텍스트 상으로 보여지지 않는 다는 점이었다.

How to solve

해당 문제점을 해결하려고 많은 노력을 해봤다. 특수문자의 경우, 한글 파싱을 했을 때 특수문자 기호로 텍스트가 추출된다. 이 특수문자 기호를 분석하여 규칙을 찾아 보고자 했지만, 기호마다 너무 다른 형태로 존재를 하여 실패를 하게 되었다.
2번 자동 문단 번호의 경우, 한글 파싱에서 아무런 텍스트가 추출되지 않아 문단을 나누기 어려웠다.

결국 두가지 예외사항에서 정확한 문단을 추출을 하기 어려운 상황이어서 결국 다른 방법을 통해 해결해야 했다.
구체적으로 설명하자면 두가지 예외사항 모두 입찰참가자격이라는 텍스트는 추출되기에 '입찰참가자격'을 기준으로 문단의 시작점을 정한다. 하지만 꼭 문단명이 아니더라도 입찰참가자격이 나오는 경우가 존재하기에 해당 문제를 방지하기 위해서 입찰참가자격 뒤에 아무런 텍스트가 나오지 않거나, 가장 짧은 문장을 문단 제목이라고 판단하여 시작점으로 설정하였다.


하지만 끝나는 지점은 알 수 없기 때문에 뒤의 모든 텍스트를 가져오려고 했지만, 대부분의 참가자격 문단은 공고문의 초반부에 위치하기에 공고문 텍스트를 반으로 줄여 텍스트를 추출하였다.

예외사항 해결방법 요약
시작점 = '입찰참가자격' 텍스트가 등장하고, 문단 제목으로 판단가능한 문장
끝점 = 공고문의 전체 텍스트의 중간 지점

2.2 대기업 참여가능 여부 로직 설계

2.2.1 Deep-Learning

2.2.2 Rule-based

3. 어플리케이션 통합 및 코드 정리

4. 최종 결과 정리 및 소감

profile
찬찬유유

0개의 댓글