4장의 절차에서 두 번째 단계가 텍스트 추출이었고 그곳을 한 문단으로 넘겼다. 실제로는 이 단계가 위키 전체의 품질을 정한다. 추출이 놓친 문장은 그 뒤의 모든 작업에서 존재하지 않는 문장이 되기 때문이다. 원문을 읽었다고 적힌 정리 문서가 실제로는 앞의 열 쪽만 읽은 것일 수 있고 그 사실은 정리 문서 어디에도 나타나지 않는다. 추출기는 하나가 아니고 서로 잘하는 일이 다르다. 어느 것을 쓰느냐에 따라 같은 논문에서 나오는 텍스트의 모양이 달라지고 그 차이가 요약의 정확도와 유전자 이름의 보존율과 통계치의 부호까지 바꾼다.

원본 PDF 선택, 추출기 비교, 추출 결과 검증과 정리 범위를 한눈에 정리한 흐름이다.
추출을 이야기하기 전에 정할 것이 무엇을 추출할 것인가다. 같은 논문의 PDF가 여러 벌 존재하고 그 품질이 서로 다르다. 출판사 페이지에서 받은 최종본, 프리프린트 서버의 원고, 저자 홈페이지에 올라온 사본, 검색 결과에서 받은 출처가 불분명한 파일이 모두 같은 논문을 담고 있지만 쪽 구성과 그림 해상도와 보충 자료의 유무가 다르다. 확보 순서를 정해 두면 매번 고민하지 않아도 된다. 이미 위키에 정확한 원본이 있으면 그것을 쓰고 없으면 출판사나 정식 저장소의 PDF를 구하고 둘 다 구하지 못하면 그 논문은 넣지 않고 미보유 목록에 남긴다. 세 번째 경우에 브라우저에서 페이지를 저장한 파일로 대신하지 않는 것이 중요하다. 그렇게 만든 파일은 조판과 쪽 번호를 잃고 접혀 있던 절을 통째로 빠뜨린 채로도 파일 하나로 성립한다. 겉으로는 논문이 하나 들어온 것처럼 보이고 안에는 절반만 들어 있다.
프리프린트와 출판본 가운데 무엇을 정본으로 삼을지도 정해 둔다. 대체로 출판본이 정본이지만 프리프린트를 함께 확인해야 하는 경우가 있다. 심사 과정에서 분석 하나가 통째로 빠지는 일이 있고 보충 자료가 프리프린트 쪽에 더 자세한 경우도 있다. 두 판본을 모두 가지고 있다면 정본은 출판본으로 두되 프리프린트에만 있던 내용을 확인하고 확인한 결과를 정리 문서에 한 줄로 남긴다. 이 확인을 하지 않으면 나중에 그 논문의 예전 판본을 인용한 다른 논문을 읽을 때 앞뒤가 맞지 않는다. 어느 파일을 실제로 썼는지도 기록에 남긴다. 같은 논문에 대해 서로 다른 사람이 서로 다른 판본을 읽고 다른 결론을 적는 일이 생기고 파일이 기록되어 있으면 그 차이가 판본에서 왔다는 것을 곧바로 알 수 있다.
PDF는 인쇄면을 담는 형식이다. 파일 안에는 어느 좌표에 어느 글자를 어느 폰트로 찍으라는 지시가 들어 있을 뿐, 문단과 제목의 구조는 없다. 사람이 읽을 때는 두 단으로 나뉜 지면에서 왼쪽 단을 끝까지 내려간 뒤 오른쪽 단으로 올라가지만 파일에는 그 순서가 적혀 있지 않다. 추출기는 좌표를 보고 읽는 순서를 추측하고 그 추측이 틀리면 왼쪽 단의 한 줄과 오른쪽 단의 한 줄이 번갈아 나온다. 학술 논문은 이 문제가 특히 심한 형식이다. 두 단 조판에 그림과 표가 끼어들고 그림 안에는 축 눈금과 낱개 라벨 같은 짧은 글자가 흩어져 있으며 쪽마다 저널 이름과 쪽 번호가 붙는다. 이 조각들이 본문 문장 사이에 섞여 들어오면 문단이 중간에서 끊기고 끊긴 자리에 그림 라벨이 들어가 문장처럼 읽힌다. 사람은 그 결과를 보면 곧바로 이상하다고 느끼지만 요약을 만드는 쪽은 그것도 본문으로 받아들인다.
두 번째 어려움은 글자 자체가 파일 안에서 무엇인지 알 수 없는 경우다. 출판사가 그리스 문자나 부등호 같은 기호를 유니코드 매핑이 없는 서브셋 폰트에 심으면, 파일 안의 그 글자에는 어떤 문자인지에 대한 정보가 없다. 화면에는 제대로 보이는데 추출하면 원래 글자가 나오지 않는다. 실측해 보면 세 가지 형태가 있고 뒤로 갈수록 위험하다. 글자가 그냥 빠지는 경우, 다른 글자로 바뀌는 경우, 그리고 숫자의 부호나 지수가 사라지는 경우다. 빠진 글자는 문장이 어색해져서 눈에 걸린다. 바뀐 글자는 그럴듯한 문장으로 남아서 걸리지 않는다. 세 번째는 최악인데, 음의 상관계수가 양수로 적힌 문장은 문법적으로 완전하고 내용도 그럴듯해서 원문과 대조하기 전에는 발견되지 않는다.
이 문제가 생물학 논문에서 특히 자주 나타나는 이유가 있다. 유전자와 단백질과 세포 유형의 이름에 그리스 문자가 많이 쓰이고 통계 결과에는 부등호와 지수가 붙는다. 그리스 문자가 탈락하면 서로 다른 계열의 이름이 같은 문자열이 되어 버린다. 지수 표기가 깨지면 유의수준의 자릿수가 달라지고 그 값을 근거로 판단한 문장이 전부 흔들린다. 이런 종류의 손상은 논문마다 다르게 나타나는데 같은 출판사의 같은 저널이라도 조판 시점에 따라 폰트 처리가 다르기 때문이다. 어떤 논문에서는 멀쩡하고 어떤 논문에서는 무너지므로 추출기를 한 번 검증했다고 안심할 수 없다. 결론을 좌우하는 수치는 논문마다 화면과 대조한다는 규칙이 여기서 나온다. 대조할 대상은 많지 않다. 논문 하나에서 실제로 인용하게 될 값은 대개 서너 개다.
이 책이 근거로 삼은 위키에서는 2026년 5월 30일에 추출기를 실제로 비교했다. 같은 논문들을 두 추출기에 각각 넣고 결과를 나란히 놓는 방식이었고 대상은 단일세포 atlas 논문과 두 단으로 조판된 종합지 논문이었다. 결론은 용도에 따라 답이 갈린다는 것이었다. 요약과 구조를 만드는 일상적인 ingest에서는 opendataloader-pdf가 뚜렷하게 나았다. 읽기 순서를 다시 짜서 두 단이 섞이는 문제를 해결하고 그림 패널에 흩어진 축 눈금과 낱개 라벨이 본문에 섞여 들어오는 것을 막고 절 제목을 제목으로 표시하고 그림 설명을 따로 떼고 참고문헌을 정돈하고 쪽마다 붙는 저널 이름과 하이픈 노이즈를 걷어냈다. 같은 논문에서 PyMuPDF는 두 단을 흘려 일부 구간이 아예 판독되지 않았다.
두 번째 용도에서는 답이 반대였다. 논문에서 유전자 이름과 유전자 사이의 관계를 뽑아내는 작업에서는 PyMuPDF로 충분했다. 유전자를 찾아낸 비율이 226건 대 221건으로 사실상 같았고 뽑아낸 관계의 수도 15건으로 같았다. 오히려 PyMuPDF 쪽이 유전자 목록을 단 단위로 흐트러뜨리지 않고 유지해서 어느 표의 어느 줄에서 나온 이름인지 되짚기가 조금 더 깨끗했다. 속도 차이도 컸다. PyMuPDF가 6배에서 24배 빨랐고 Java 실행 환경도 필요하지 않았다. 이 비교를 실측이라고 부른 이유는 같은 논문을 두 도구에 각각 넣고 결과를 나란히 놓았기 때문이다. 도구의 설명서에 적힌 성능이나 일반적인 평판으로 정하지 않았다. 추출기의 성능은 논문의 조판에 따라 갈리므로 자기가 주로 읽는 저널의 논문으로 직접 확인하지 않으면 남의 결과가 자기 자료에서 재현되지 않는다. 두 단으로 조판하는 저널과 한 단으로 조판하는 저널은 난이도가 다르고 그림이 본문 사이에 끼어드는 형식과 뒤에 몰아 두는 형식도 다르다. 자기 자료로 비교하는 데 드는 시간은 논문 두세 편이면 충분하다. 용도에 맞춰 추출기를 고르는 것이 여기서 얻을 원칙이다. 문장을 읽어 요약과 판단을 만드는 일에는 읽기 순서를 복원하는 추출기가 맞고 목록에서 이름을 긁어내는 일에는 지면 배치를 그대로 유지하는 추출기가 맞다.
| 용도 | 맞는 추출기 | 이유 |
|---|---|---|
| 요약과 구조 생성 | opendataloader-pdf | 읽기 순서 복원, 절 제목과 그림 설명 분리, 쪽 장식 제거 |
| 목록에서 이름 긁어내기 | PyMuPDF | 단 구조를 흐트러뜨리지 않고 유지, 6–24배 빠름 |
| 통계치를 그대로 인용 | 두 가지로 교차 확인 | 부호와 지수가 사라지는 버그가 추출기마다 다름 |
| 큰 데이터 표 | 어느 쪽도 부적합 | 보충 자료의 표 파일을 직접 읽는다 |
추출로는 아예 얻을 수 없는 것도 있다. 그림이 담고 있는 정보다. 히트맵의 색이 나타내는 방향과 크기, 효과 크기를 점과 선으로 그린 그림, 모델 구조를 그린 도해는 텍스트로 존재하지 않으므로 어느 추출기로도 나오지 않는다. 그림 설명에 적힌 문장만으로 그 그림이 무엇을 보여주는지 알 수 있는 경우도 있지만 결론이 그림 안에 있는 논문에서는 그렇지 않다. 여기에는 다른 방법을 쓴다. 그 쪽을 이미지로 떠서 모델이 직접 보게 하는 것이다. 이미지를 읽는 처리는 텍스트를 읽는 것보다 비싸고 느리므로 모든 논문에 적용하지 않는다. 분야의 논지를 움직이는 논문에 한정하고 일상적인 처리에서는 하지 않는다. 이 구분을 정해 두지 않으면 논문 한 편을 넣는 데 드는 시간이 예측되지 않는다.
아래 블록은 AI 도구의 채팅창에 그대로 붙여 넣는 프롬프트다. 논문 한 편으로 두 추출기의 차이를 직접 확인해 보는 것이 이 장에서 가장 빠른 실습이다. 두 단으로 조판된 논문을 하나 고른다.
아래 PDF를 두 가지 방법으로 추출해서 결과를 비교해 달라.
<PDF 경로>
1. opendataloader-pdf로 추출한 결과
2. PyMuPDF로 추출한 결과
두 결과에서 다음을 비교해 보여 달라.
- Methods 절의 첫 세 문단이 각각 어떻게 나오는지
- 그림 설명이 본문 문단 사이에 섞였는지
- 본문에 등장하는 음수와 지수 표기가 그대로 남았는지
- 마지막 참고문헌 번호가 몇 번인지
어느 쪽이 더 나은지 판정하지 말고 차이만 보여 달라.
마지막 줄을 넣는 이유는 판정을 사람이 하기 위해서다. 어느 쪽이 나은지는 이 논문으로 무엇을 할 것인지에 달려 있고 그 판단은 결과를 눈으로 본 뒤에 선다. 마지막 참고문헌 번호를 비교하라고 한 것은 잘림을 잡기 위해서다. 참고문헌은 논문의 맨 끝에 있으므로 두 결과에서 마지막 번호가 다르면 한쪽이 중간에서 잘린 것이다.
추출이 실패했다는 것을 도구가 알려 주지 않는 경우가 실제 운영에서 가장 비싸다. 같은 위키에서 있었던 일이 이 형태였다. 추출 스크립트의 세 번째 인자가 쪽수 제한이라고 생각하고 작은 값을 넣었는데 그 인자는 글자 수 상한이었다. 논문이 Methods 중간에서 잘렸고 스크립트는 성공을 보고했다. 잘린 뒤쪽에 있던 결과와 고찰은 그 뒤의 모든 작업에서 없는 것으로 다뤄졌고 빠졌다는 사실은 결과물이 이상해진 다음에야 드러났다. 도구의 성공 메시지를 내용의 정확성으로 읽지 않는다는 규칙이 여기서 나왔다. 추출을 마치면 결과물의 모양을 확인한다.
이 사고가 알려 주는 것이 하나 더 있다. 도구의 인자가 무엇을 뜻하는지 확인하지 않고 값을 넣었다는 점이다. 숫자를 받는 인자에 작은 값을 넣으면 쪽수 제한처럼 동작할 것 같지만 그 도구에서는 글자 수 상한이었다. 도구를 처음 쓸 때 인자의 의미를 한 번 확인하는 데 드는 시간은 1분이고 확인하지 않아서 생긴 결과를 되짚는 데는 그보다 훨씬 오래 걸린다. 특히 위험한 것은 그 값이 있어도 동작하고 없어도 동작하는 인자다. 잘못 넣어도 오류가 나지 않으므로 잘못 넣었다는 사실이 드러나지 않는다. 확인은 세 가지를 보면 충분하다. 첫째는 끝이 있는가다. 참고문헌 목록이나 결론 문단이 결과 파일의 끝에 있는지 본다. Methods 중간이나 문장 중간에서 끝났다면 잘린 것이다. 둘째는 분량이 맞는가다. 논문의 쪽수와 추출된 글자 수의 비율이 다른 논문들과 크게 다르면 무언가 빠진 것이고 대체로 추출에 실패한 논문이 여기에 걸린다. 셋째는 숫자가 살아 있는가다. 본문에 나온 통계치 두어 개를 원문 화면과 대조한다. 부호와 지수가 이 대조에서 걸린다. 세 가지 모두 자동으로 판정할 수 있는 종류가 아니고 그래서 6장에서 여러 편을 한 번에 넣을 때 이 확인을 어떻게 기계 검사로 바꾸는지를 따로 다룬다.
PDF 추출 도구인 opendataloader-pdf의 출력에는 손봐야 할 것이 남는다. 그림이 있던 자리에 남는 표시와, 칸 안에 아무 내용도 없는 표 모양의 격자가 대표적이다. 뒤의 것은 이 추출기가 지면의 선을 표로 잘못 읽어서 만드는 것이고 그대로 두면 정리 문서에 빈 표가 들어간다. 그래서 정리한 뒤에 넘기는데 다듬는 범위를 문서로 못 박아 두었다. 지울 수 있는 것은 정확히 그 두 가지뿐이고 목록에 없는 것은 남긴다. 글자나 숫자가 하나라도 든 표는 모양이 이상해도 보존한다. 범위를 열어 두면 다듬기가 편집이 되고 편집이 된 순간 원문에 있던 것과 정리 과정에서 사라진 것을 구분할 수 없게 된다. 이 경계는 3장에서 본 층 나누기와 같은 원리다. 원문 PDF는 고치지 않고 추출 결과는 정해진 범위에서만 다듬고 판단은 그 위층에서 한다.
다듬기의 범위를 문서로 적어 두는 방식도 눈여겨볼 만하다. 지울 수 있는 것의 목록을 적고 그 목록에 없는 것은 남긴다고 쓰면, 나중에 새로운 종류의 노이즈가 나타났을 때 처리 방식이 자동으로 정해진다. 목록에 없으므로 남긴다. 반대로 지우면 안 되는 것의 목록을 적었다면 새로운 노이즈는 지워도 되는 것이 되고 그 판단이 세션마다 달라진다. 무엇을 허용할지 적는 것과 무엇을 금지할지 적는 것은 목록에 없는 경우에 대한 기본값이 다르고 되돌릴 수 없는 동작에서는 앞의 방식이 맞다. 같은 발상이 4장의 정정 공고 걸러 내기에도 있었다. 걸러 내는 조건을 좁게 잡으면 통과하는 공고가 생기지만 그 실패는 사람 눈에 드러나고 넓게 잡으면 정상 논문이 사라지는데 그 실패는 드러나지 않는다.
추출에 쓴 도구를 문서에 기록한다. 정리 문서와 논문 페이지의 머리말에 입력이 어떤 형태였는지, 어느 도구의 어느 판으로 뽑았는지, 언제 뽑았는지를 적는다. 세 항목을 적는 이유는 나중에 다시 뽑을지 판단해야 하기 때문이다. 추출기는 계속 고쳐지고 몇 달 전에 부호를 떨어뜨리던 버그가 지금 판에서는 없을 수 있다. 어느 문서가 어느 판으로 만들어졌는지 적혀 있으면 그 버전으로 만든 문서만 골라 다시 뽑을 수 있고 적혀 있지 않으면 전부 다시 뽑거나 전부 그대로 두는 선택만 남는다. 손으로 읽어서 정리한 문서에도 그 사실을 적는다. 자동으로 뽑은 것과 사람이 읽은 것은 신뢰 수준이 다르고 몇 달 뒤에 그 차이는 문서 겉면에서 보이지 않는다. 4장에서 정리 문서에 원문을 가리키는 정보를 함께 적어 둔 것과 같은 이유다. 되짚어 갈 수 있게 만드는 항목은 만들 때 적어야 하고 나중에 채우려면 그때의 상태를 복원할 수 없다.
PDF에서 정보를 다시 뽑는 이유는 넷이다. 첫째는 추출기의 결함이 나중에 알려진 경우다. 부호가 떨어지는 버그를 알기 전에 만든 문서에는 그 오류가 그대로 들어 있고 그 문서들만 골라내려면 어느 도구로 만들었는지가 기록되어 있어야 한다. 둘째는 더 나은 도구가 생긴 경우다. 두 단 조판을 제대로 복원하지 못하던 시기에 만든 문서와 지금 만든 문서는 품질이 다르고 그 차이는 문서 겉면에서 보이지 않는다. 셋째는 처음에 잘못 뽑은 것을 발견한 경우다. 잘려 있거나 다른 논문이 섞여 있거나 애초에 다른 판본이었던 경우가 여기 해당한다. 넷째는 위키 검색으로 질문에 답할 만큼 자세한 근거를 찾지 못한 경우다. Source note와 wiki page에는 논문의 주요 정보가 들어 있지만 원문의 모든 방법, 표, 수치, 참고문헌까지 옮기지는 않는다. 검색 결과만으로 답을 만들 수 없으면 웹 검색으로 빈칸을 채우지 않고 papers/에 보관한 원본 PDF의 전문을 다시 추출해 필요한 대목을 읽는다. 확인한 세부 정보는 source note와 wiki page에 보충해 같은 질문에서 다시 PDF로 돌아가는 일을 줄인다.
질문의 답이 해당 논문이 인용한 중요한 참고문헌에 달려 있는 경우도 있다. 먼저 참고문헌의 제목과 저자와 DOI를 확인하고 그 논문의 PDF가 위키에 있는지 찾는다. PDF가 있다면 전문을 추출해 읽고 별도의 source note와 wiki page로 ingest한다. PDF가 없다면 현재 위키에 그 근거가 없다고 밝히고 원문 PDF를 요청한다. 초록, 출판사 웹페이지, 검색 결과의 요약문을 원문 PDF처럼 사용하지 않는다. 이 절차는 3장의 네 가지 원칙을 그대로 따른다. 위키에서 먼저 찾고, 부족하면 소유한 PDF로 내려가며, 필요한 논문이 없으면 없다고 말한다. 답을 만든 뒤에는 PDF에서 확인한 내용을 위키에 반영해 다음 검색의 범위를 넓힌다.
문서 수천 건을 전부 다시 뽑으면 그 뒤에 사람이 손댄 부분까지 사라진다. 정리 문서에는 추출 결과를 읽고 보탠 판단이 들어 있으므로 다시 쓰기 전에 실제로 인용되는 값을 확인해야 한다. 종합 문서가 어떤 수치를 근거로 삼고 있다면 그 수치부터 원문과 대조한다. 아무 데도 인용되지 않은 문서는 그 논문이 필요해질 때 확인하면 된다. 무엇을 다시 뽑았고 무엇을 남겨 두었는지는 작업 로그에 적는다. 적지 않으면 다음에 같은 판단을 처음부터 다시 하게 된다.
다시 뽑기로 결정한 두 시점은 모두 표본 검사에서 나왔다. 2026년 7월 25일에 정본으로 저장해 둔 PDF 서른여덟 건이 그 논문의 보충 파일로 드러났다. 정리 문서와 위키 페이지에는 방법과 결과가 적혀 있었지만 그 내용은 보충 그림 설명과 보충 노트에서 나온 것이었고 검색에 걸리면 제대로 만든 페이지와 구별되지 않았다. 한 건은 아예 다른 논문이었다. 판별이 어려웠던 이유는 첫 쪽이 구별의 근거가 되지 못하기 때문이다. 대형 저널의 보충 파일 표지는 논문의 제목 블록을 그대로 재현하고 그 아래에 저자가 준 형식 그대로이며 편집을 거치지 않았다는 한 줄을 붙인다. 첫 쪽에 제목과 저자가 보인다는 것으로 논문이라고 판정하면 걸리고 이 착각으로 네 건을 정상으로 통과시켰다가 되돌렸다. 서른여덟 건 가운데 서른 건은 정상 PDF로 교체했고 페이지 본문까지 다시 쓴 것은 그중 한 건이다.
이틀 뒤에는 이미 만들어 둔 기록을 무작위로 이백 건 뽑아 확인했다. 다른 추출기로 원문을 독립적으로 다시 읽어 이백 건 모두 논문 신원이 일치하는 것을 확인했고 결함이 확인된 것은 스무 건이었다. 그중 심각한 실패는 세 건으로 두 건은 출력이 크게 잘렸고 한 건은 전처리에서 멈췄다. 나머지는 기호와 연산자가 다른 글자로 바뀐 경우가 열여섯 건, 단어 경계와 배치가 무너진 경우가 한 건이었다. 이 결과에서 판단을 바꾼 것은 기호 문제의 원인이다. 같은 실패가 다른 추출기에도 그대로 보였고 원인은 PDF에 심긴 폰트 인코딩이었으므로 도구를 바꿔서 해결되는 문제와 원본 파일에서 오는 문제를 구분해야 했다. 이 둘을 섞으면 전부 다시 뽑는 쪽으로 결론이 기울고 그 작업은 몇 주가 걸리면서 고쳐지는 것이 없다. 그래서 다시 뽑은 대상은 신원이 어긋난 파일과 크게 잘린 출력으로 한정했고 기호가 어긋난 문서는 그 값을 실제로 인용할 때 원문과 대조하는 쪽으로 넘겼다.