brunch

You can make anything
by writing

C.S.Lewis

by jd Jul 27. 2020

PDF 검색엔진(2/2)

글파도(글밥 먹는 노동자의 파이썬 도전기)

즉시 실행에 옮기는 사람만이 가질 수 있는 낙관이 있다. 머리로 재고만 있으면 불가능한 일은 언제까지고 불가능한 상태로 남는다. 뭣도 모르는 걸 무기 삼아 무식하게 도전하는 것. 의외로 효과적일 때가 많다. 나에게는 코딩을 할 때도 마찬가지였다. 지난 글에서 예고한 대로 PDF 검색엔진을 구축한 방식과 후일담을 전한다.


먼저 무엇을 만들었는지 자세히 소개한다. 회사 서버에는 2008년 11월호부터 지금까지 총 148권 분량의 신한금융그룹 사보 PDF가 있다. 이것의 텍스트를 추출해 한 곳에 모아둔 후, 키워드를 입력하면 해당 키워드를 포함한 호(Vol.)를 곧바로 보여주는 프로그램을 만들었다. 프로그램의 이름은 SKS(Shinhan Keword Search). SKS를 개발하기 전, 특정인이나 단어를 찾으려면 일일이 지난 호를 들춰보곤 했다. 심지어 오래된 내용일 경우 먼지 덮인 합본호(웬만한 법전 뺨치는 두께로 한 손으로 들기도 어렵다.)를 꺼내야만 했다. 그러나 이 프로그램을 사용하면 키워드 검색 한 번으로 수 초만에 끝낼 수 있다.


뫼비우스의 삽질 끝에 드디어!


그럼 완성본을 공개한다. 회사 와이파이망을 통해서만 접속할 수 있기에 따로 링크를 공유할 수는 없다. 저화질 주의.


    


나는 이 프로그램을 과월호를 검색하는 용도로 사용했지만, 다음과 같은 업무를 자동화하는 데에도 유용할 것 같다.

 

첫째, 기획안, 보고서 등 방대한 서류 뭉치 중 원하는 단어가 실린 지점을 신속하게 찾고 싶을 때

둘째, 원하는 단어가 과거에 어떤 내용으로 다뤄졌는지 모아서 보고자 할 때

셋째, 검색한 단어가 등장한 빈도를 확인하고 싶을 때


우선 구축에 사용한 핵심 프로그램은 Elasticsearch와 Fscrawler다. 먼저 Elasticsearch는 유명한 프로그램이어서 전문가들이 자세히 소개해놓은 내용이 많다. 나는 직접 써보며 느낀 장점 중 일부를 말하고자 한다. 뭐니 뭐니 해도 검색 속도다. 내가 보유한 데이터의 양는 100페이지짜리 PDF 파일 148개 분량. 텍스트 수로 따지면 814만 자가 훌쩍 넘는다. 10pt 글자가 빽빽이 적힌 A4 문서 6000장가량의 분량이다. 이 속에서 특정 단어가 실린 구간을 모두 찾아 띄운다고 생각해보자. 아무리 컴퓨터인들 모든 텍스트가 하나의 워드 파일에 있지 않은 한, 꽤 오랜 시간이 걸린다.


그런데, 이토록 방대한 데이터를 Elasticsearch 서버에 넣으면 이야기가 달라지더라. '기업' '업무' '은행'처럼 아무리 많이 등장하는 단어를 검색하더라도 영상에 보이는 것처럼 2초 정도면 결과가 나왔다. 나는 최대 20개 호까지만 볼 수 있도록 설정했다. 만약 모든 호를 불러오고 싶다면 '신한'이라고 검색하면 된다. 단, 이때는 148개 호가 모두 불러지는 시간이 좀 걸린다.


역시 프로그래밍은 한글과 친해지려면 멀었다. 코딩을 하다가 따옴표나 주석으로 묶이지 않은 한글이 있다면 일단 오류가 뜬다고 보면 된다. 개인적으로 한글로 된 코딩 언어가 통용될 가능성은 거의 없을 것 같다. 세종대왕님이 장영실과 함께 컴퓨터를 만드셨다면 얼마나 좋았을까. python 같은 고성능 언어가 한글로 쓰이는 세상 말이다. 이름은 '이무기'쯤 되려나. Elasticsearch 또한 한국어 검색 지원이 충분치 못하다는 단점이 있다. 그러다 보니 단어를 잘라서 인식하는 경우가 많다. 가령 '배달의민족'을 검색하면 148개 호가 전부 불러진다. 신한금융그룹 사보인데 배달의민족이 매달 등장할 리는 없지 않은가. 낯선 단어의 경우, '배' '달' '의' '민' '족' 이렇게 단어를 한 글자씩 잘라서 각각 인식한 결과를 보여주는 것 같다.


그리고 Fscrawler는 PDF, 워드, 엑셀 파일에서 텍스트를 추출한 후 Elasticsearch 서버에 넣는 역할을 한다. 프로그램을 짜며 가장 많은 삽질을 한 대목이 PDF 텍스트 추출 라이브러리를 찾는 일이었다. pdftotext, pypdf2 등 PDF 텍스트 추출 라이브러리를 여럿 써봤지만 그중 Tika가 가장 온전하고 빠르게 해줬다. Fscrawler는 이 Tika를 기반으로 만든 것이라고 한다. Fscrawler 사용법은 이분의 블로그 포스팅이 큰 도움이 됐다. 링도의일상(https://m.blog.naver.com/icelemonteainkr/221828689765) 이 글을 보며 누군가에게 이토록 유용한 정보를 손수 남기는 사람의 심리는 무엇일지 오랫동안 생각해보기도 했다. 부디 적게 일하고 많이 버시길.


Fscrawler의 성능에 감동하자마자 단점이 드러났다. PDF 텍스트 추출을 페이지 하단부터 상단으로 할 때가 있는 듯하다. 문단 상으로 전문이 본문 아래 배치되는 경우가 종종 있었다. 또 크롤링 경로를 C드라이브 폴더 안에 tmp 폴더로 정하고, 여기에 파일을 끌어놔야만 작동하더라. 이게 디폴트 값인 것 같은데, 다른 경로를 설정하기만 하면 저장할 때마다 경로가 다시 디폴트로 돌아왔다. 그리고 위 블로그 설명에 userdict_ko.txt에 한 번에 인식할 수 있는 단어를 저장해두라고 나와 있는데, 나는 입력해두기만 하면 서버를 실행하는 과정에서 오류가 떴다. 결국 userdict_ko.txt 파일을 따로 생성하지 못했다. 대신 모든 호를 불러와 페이지에서 찾는 방식(ctrl+f)으로 이 문제를 일부 해결했다.

  

대부분 완성했지만 아직 추가해야 할 기능이 남았다.  영상에 보이는 것처럼 불러진 호마다 우측에 스크롤이 있는데 이를 검색한 키워드가 있는 지점에 자동으로 초점을 맞추고, 스크롤바 상에 해당 단어가 등장한 구간을 색깔 표시하는 것이다. 현재 자바스크립트와 제이쿼리를 못해서 정체되고 있다. 틈틈이 공부하며 언젠간 업데이트할 것이다. 코딩을 한다는 건 마치 모자이크를 하듯 덧대고 덧대는 일인 것 같다.


그다음 프로그램을 짤 수 있는 원동력


사보를 만들 때 교열 전문가가 이틀정도 함께 작업한다. 그분들은 최소 10년 이상 잡지, 전문지, 사보를 비롯한 각종 간행물의 글을 다듬어오셨다. 매번 나의 문장 또한 그분들에 의해 바뤄진다. 나는 그분들을 '선배'라고 부른다. 저번주에 교열 선배가 SKS를 유용하게 쓰시는 모습을 보고 기뻤다. 내 글이 좋은 평을 들었을 때 만큼이나 기뻤다. 현재 내 컴퓨터가 SKS의 서버 역할을 하고 있는데, 아래와 같이 커맨드창에 접속 및 검색 기록이 뜬다. 맨 왼쪽 끝이 5로 끝나는 것이 교열 선배 자리 컴퓨터의 IP다. 여러 차례 키워드를 검색하신 걸 보니 유용하게 쓰신 것이 분명하다. 이밖에 팀원들도 모두 쓸모를 체감하는 듯하다. 감사한 일이다. 독자 중 혹시 코드가 궁금한 사람이 있다면 아래 메일로 연락 주시라.


다음으로 만들 것은 뉴스 모니터링 프로그램이다. 이미 파이썬 크롤링을 적용해 흔히 쓰이는 프로그램이기도 하다. 매달 사보 기획안을 쓰려면 고객사의 이슈 분석이 필수적이다. 뉴스를 쉽게 모아 볼 수 있는 프로그램을 구축하고, 나아가 그룹사 홈페이지별 보도자료 게시판의 업데이트 현황도 확인할 수 있도록 짜보겠다. 분명 나는 또 뫼비우스의 삽질을 할 것이다. 다만 중도에 포기하는 삽질이 아닌, 목표점까지 파고드는 삽질이 되길 바랄 따름이다.

작가의 이전글 PDF 검색엔진(1/2)
작품 선택
키워드 선택 0 / 3 0
댓글여부
afliean
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari