가자라는 한약재의 영문명이 Termilia Fruit으로 적혀 있었다. 같은 자료를 설명하는 페이지에는 Terminalia Fruit이라고 쓰여 있었다. 이름 한가운데의 na 두 글자가 내려받은 파일에서 빠진 것이다.
사람은 앞뒤 철자를 보고 같은 이름이라고 짐작할 수 있다. 하지만 프로그램으로 두 자료의 이름을 맞춰 보면 문제가 달라진다. 한쪽에는 Terminalia, 다른 쪽에는 Termilia가 있으면, 철자가 정확히 같은 이름끼리 연결하는 방식으로는 둘을 찾을 수 없다. 그렇다고 비슷해 보이는 이름을 모두 같은 것으로 합칠 수도 없다.
나는 한국한의약진흥원의 공개 한약재 정보에서 이 누락을 확인하고, 다른 이름에도 같은 일이 생겼는지 살폈다. 정리한 근거를 기관에 전달한 뒤 기관으로부터 원인 설명과 정정 안내를 받았고, 실제 교체 파일도 따로 비교했다. 비교해 보니 실제로 바뀐 이름과 그대로 남은 이름이 함께 있었다.
한 이름의 오타가 아니었다
다른 이름에서도 같은 두 글자가 빠져 있었다. Gentiana는 Gentia, Cinnamomum은 Cinmomum, officinale은 officile로 나타났다. 단어의 길이나 na의 위치는 달라도, 지워진 글자는 같았다.
먼저 원래 배포 파일을 보존했다. 데이터셋 번호는 15109111, 파일에 붙은 날짜는 2025년 12월 2일이다. CSV는 표의 내용을 텍스트로 저장하는 파일 형식이다. 이 파일은 한약재 하나를 한 행에 담았고, 총 601행에 이름 등 7개 항목을 두고 있었다. 여기서 한 행을 ‘레코드’, 항목별 세로 열을 ‘필드’라고 부른다. 각 한약재를 구별하는 한약재아이디는 비어 있거나 겹치는 값이 없었다.
화면에서만 철자가 잘못 보인 것인지도 구분했다. 당시 공식 미리보기의 앞 50행을 파일과 대조한 기록에서는 7개 필드가 모두 일치했다. 그 기록에 따르면 확인한 누락은 미리보기 화면만의 문제가 아니라, 내려받는 데이터에도 들어 있었다.
처음 만든 사례 목록에는 16개 한약재에서 나온 32개 문자열 사례가 있었다. ‘문자열’은 여기서는 이름처럼 글자를 나란히 적은 값이고, ‘셀’은 표에서 그 값을 담은 한 칸이다. 하나의 학명목록 셀에 문제가 의심되는 이름이 둘 이상 들어 있기도 해서, 사례는 32개지만 서로 다른 셀은 30개였다.
사례마다 파일에 있던 값과 na를 넣어 복원한 후보를 나란히 놓고, 후보에서 대소문자를 가리지 않고 na를 모두 지웠다. 32개 모두 파일에 있던 철자가 그대로 나왔다. 여러 오타를 우연히 묶은 것이 아니라, 같은 삭제 규칙으로 설명할 수 있는지 확인한 검사였다.
‘값이 없음’ 표시가 이름 안의 글자까지 지웠다
기관에는 누락 사례와 파일 식별 정보, 확인 방법을 보내고 원천 자료를 기준으로 전체 파일을 점검해 달라고 요청했다. 데이터 처리에서는 값이 비어 있음을 나타내려고 NA라는 표시를 쓰기도 한다. 이 표시를 처리하는 설정이 단어 안의 na까지 지웠을 가능성을 함께 제시했다.
2026년 8월 11일에는 담당부서가 요청을 검토 중이라는 접수 회신이 왔다. 다음 날인 8월 12일, 기관은 결측치, 즉 비어 있는 값을 변환하는 설정 때문에 단어 안의 na가 삭제됐다고 설명했다. 영문명·라틴명·학명목록을 전체 601행에 걸쳐 검토하고 정정 파일의 교체 등록을 마쳤으며, 포털 검토 뒤 게시될 예정이라고 안내했다.
이 설명은 기관 회신에서 확인한 내용이다. 기관 내부에서 실행한 코드를 직접 본 것은 아니다. 또 교체 파일을 등록했다는 회신과 누구나 새 파일을 내려받을 수 있게 된 시각은 구분해야 한다. 이후 실제로 공개된 2026년 8월 11일자 수정본을 별도로 내려받아 비교했다.
비슷한 이름을 자동으로 바꾸지 않은 이유
na를 넣으면 그럴듯한 이름이 된다는 것만으로는 충분하지 않았다. 실제 존재하는 생물 이름인지, 그리고 해당 한약재에 맞는 이름인지는 따로 확인해야 한다. 생물의 분류학적 이름을 확인하는 자료와 약재의 공식 명칭·기원종을 정한 공정서는 용도가 다르다. 당시 사례 목록에는 권위 자료와 대조했다고 기록한 사례 19개, 현행 공정서 전문 대조가 남은 사례 13개를 구분해 두었다.
전체 파일에서 확인할 후보를 찾을 때는 생물 분류 데이터베이스인 NCBI Taxonomy의 이름 어휘를 이용했다. 학명의 속명이나 종소명, 즉 어떤 속에 속하는지와 그 안의 종을 나타내는 부분을 검사했다. 원래 철자가 이름 어휘에 없으면서, 어느 한 위치에 na를 한 번 넣으면 이름이 만들어지는 경우를 추렸다.
이 검사로 85개 한약재가 나왔다. 검사에서는 잡히지 않았지만 처음 사례 목록에 있던 3개를 더해, 88개 레코드를 사람이 검토할 후보로 남겼다. 자동으로 고친 파일을 정답이라고 기관에 보내지는 않았다.
검사 규칙에도 빈틈이 있었다. creta처럼 손상된 철자가 다른 유효한 이름과 우연히 같으면 빠질 수 있다. Nakai에서 Na가 없어진 저자명이나 라틴 생약명은 속명·종소명 검사 밖에 있었다. 반대로 na를 넣어 존재하는 이름을 만들었더라도 다른 생물의 이름일 수 있다. 따라서 88개는 확인할 후보 수이며, 전체 데이터의 오류율을 계산하는 숫자로 쓰지 않았다.
새 파일에서 실제로 달라진 값
수정 전후에는 줄 순서가 달라질 수 있어 표의 같은 줄끼리 맞추지 않고, 한약재 ID가 같은 행을 찾아 7개 필드를 비교했다. 두 파일 모두 601행이고, 각 행의 ID는 비어 있거나 겹치지 않았으며, 전체 ID 집합도 같았다.
공백을 지우거나 철자를 미리 고치지 않고 저장된 값을 그대로 비교했다. 그 결과 270개 한약재의 333개 셀이 달라져 있었다. 한약재 하나의 이름 항목 여러 곳이 바뀔 수 있으므로, 한약재 수와 셀 수는 다르다.
| 이름 항목 | 값이 달라진 셀 |
|---|---|
| 영문명 | 18 |
| 라틴명 | 56 |
| 학명목록 | 259 |
| 합계 | 333 |
첫 사례의 Termilia Fruit은 Terminalia Fruit으로 바뀌었다. Zingiber officile도 Zingiber officinale로 바뀌어 있었다.
처음 추린 88개 후보 레코드는 모두 한 필드 이상 달라졌다. 처음의 32개 문자열 사례만 따로 보면, 30개에서 제시했던 복원 후보가 수정본에 나타났다.
문자열 사례 수와 셀 수는 여기서도 다르다. 한 셀에 사례가 여럿 들어 있던 경우를 한 번만 세면, 처음 사례를 담은 30개 셀 중 28개의 값이 바뀌었다.
다만 333개는 바뀐 셀 수이지, 333개 오류가 모두 올바르게 고쳐졌다는 뜻은 아니다. 비교 프로그램은 두 값이 다른지 알려준다. 새 값이 공정서나 원천 자료에 맞는지까지 자동으로 판정하지는 않는다.
KMH28과 KMH29의 기원종목록에는 Gentia lutea가 그대로 남아 있었다. 구버전에는 없던 물음표 ?도 수정본의 150개 레코드에 걸쳐 163개 나타났다. 공개 파일만으로는 이 문자가 왜 생겼는지 알 수 없다. 정정 안내를 받았다는 사실과 파일에서 확인한 변화, 추가로 살펴볼 부분을 구분해 남긴 이유다.
이 작업으로 확인한 범위는 이름 검색과 자료 연결을 방해할 수 있는 철자 문제, 기관의 정정 조치, 전후 파일의 변화다. 실제 환자에게 피해가 있었다거나 환자 안전을 개선했다고 입증한 작업은 아니다.
같은 비교를 다시 해 보려면
2026년 9월 5일에는 전후 파일의 변경량을 다시 확인할 수 있도록 작은 비교 프로그램과 전체 변경표를 공개했다. 처음 누락 패턴을 찾을 때 쓰던 코드와는 별개다. 처음 코드는 의심할 이름을 찾고 복원 후보를 검사하기 위한 것이고, 이 프로그램은 이미 정해진 두 파일에서 무엇이 달라졌는지 계산한다.
비교 프로그램은 Python에 기본으로 포함된 표준 라이브러리만 사용한다. 두 CSV는 CP949라는 문자 인코딩 방식으로 읽어야 글자가 제대로 해석된다. 프로그램은 이렇게 읽은 값을 고치지 않고, ID가 같은 행끼리 필드값을 대조한다.
다른 버전의 파일을 넣거나 대응할 행이 빠지면 같은 비교를 한 셈이 아니다. 이를 알아차릴 수 있도록 파일 내용의 동일 여부를 확인하는 해시값과 함께, 빈 ID·중복 ID·서로 다른 ID 집합도 검사한다.
2026년 9월 6일에도 두 공식 다운로드 파일의 해시가 보존본과 같은지 확인했다. 비교 스크립트를 다시 실행한 결과는 270개 레코드·333개 변경 셀이었다. 공개 묶음에는 기관의 비공개 회신이나 담당자 개인정보를 넣지 않았다.
