한국어 고문헌 검색기 '어듸메' 개발기

Posted by 적분 ∫2tdt=t²+c
2018.11.22 01:22 잉여

예전에 국문학 전공하는 선배와 이야기를 나누다가, 어쩌다보니 한국어 역사자료를 검색하는게 굉장히 어렵다는 얘기를 듣게 된 적이 있습니다. 그래서 세종계획에서 구축한 역사자료 말뭉치를 구해서 이를 편하게 검색해주는 시스템을 만들어봐야겠다고 작년 이맘때쯤에 마음을 먹었습니다.

그런데 역사자료를 TEI 포맷으로 구축해놓았는데 생각보다 전산처리하기에 퀄리티가 많이 나쁘더라구요. </p> 닫는 태그를 빼먹는다는지... <> 기호를 〈〉 기호로 써놓았다던지... 열고 닫는 짝이 안 맞는 일은 예사고, 에러가 너무 많아 이를 코드상으로 수정해가면서 파일을 읽으려고 했으나 쉽지 않아서, 그 꿈은 접어두고 말았습니다.


그런데 최근 https://ithub.korean.go.kr/user/total/referenceManager.do 역사 자료 종합정비 결과가 공개되고 있다는 사실을 알아서 (최근 공개일이 17년 06월이었는데, 그걸 1년 넘게 모르고 있었다는건 함정) 다시 예전 계획을 부활시키게 되었습니다. 정비된 포맷은 XML인데 예전의 TEI 결과보다 훨씬 에러가 적어서 자동 처리하는데 용이했구요.


십여일 간의 삽질 끝에 사이트를 개설했습니다. 존경하는 분이 친히 지어주신 이름은 '어듸메'로, 말 그대로 고전 문헌들 중에서 원하는 문구에 어디에 있는지 찾아준다는 뜻에서 저런 이름을 지었주셨다고 합니다.

https://akorn.bab2min.pe.kr/ 어듸메



15세기부터 20세기까지 총 997개의 문헌이 현재 시스템에 수록되어 있습니다. 역사자료 정비작업이 더 진행되어 새로운 문헌들이 추가적으로 공개된다면 차차 추가해나갈 예정입니다.



이 시스템을 위해서 자바스크립트로 옛 한글 입력기를 개발했습니다. Internet Explorer, Edge, Chrome에서 작동되는 것을 확인했고, 아쉽게도 무슨 수를 써도 Firefox에서는 작동시킬수가 없었습니다.

ㅿ는 Shift + ㅁ, 

ㆁ는 Shift + ㅇ, 

ㆆ는 Shift + ㅎ, 

ㆍ는 Shift + ㅏ를 눌러서 입력할 수 있구요, 기타 합용병서된 글자들은 각 자음이나 모음을 차례로 입력하여 조합할 수 있습니다.

입력된 글자는 유니코드 첫가끝 포맷으로 처리되므로, 이론상 모든 종류의 옛한글을 다 입력할 수 있습니다. (물론 입력만 가능할뿐 그렇게 입력된 글자가 검색에 잡히리라는 보장은 없습니다..)



최근 검색엔진 관련 수업을 들으면서 검색 이론을 공부중이었기 때문에 이를 적용해볼 수 있는 좋은 기회였습니다. tf-idf 가중치를 적용하고 Invert Indexing로 색인하여 기초적인 검색을 지원합니다. 아직 Boolean 연산자를 지원하지는 않지만, ""로 필수 일치 질의어를 지정해줄 수는 있습니다.


옛한글의 경우 마땅한 형태소 분석기가 개발되어 있지 않고, 문헌마다 표기법이 천차만별이었기 때문에 전체 문장을 색인어 단위로 tokenize하는것이 굉장히 까다로웠습니다. 띄어쓰기 단위로 자를수야 있지만, 아시다시피 교착어라는 한국어의 특징상 한 형태소에 수많은 형태소들이 붙어서 전체 단어를 이루기에, 공백 단위로 구분시 vocabulary 크기가 커지고, recall은 낮아지게 됩니다.


그래서 자동 tokenize를 위해서 Byte Pair Encoding 기법을 적용했습니다. 이는 자주 등장하는 글자쌍을 새로운 글자쌍으로 대체하는 작업을 반복하여 주어진 텍스트를 한정된 vocabulary의 크기로 분할하는 기법을 말합니다. 본 작업에서는 구글이 개발한 BPE 툴인 SentencePiece(https://github.com/google/sentencepiece)를 이용했습니다. 이를 이용해서 자주 등장하는 글자쌍을 포착하여 단어로 추출하고, 이런 단어 뒤에 등장하는 조사나 어미들을 어설프게나마 추출할 수 있었습니다. (그렇지만 역시 전반적인 성능은 현대 한국어의 형태소 분석기에 비할바가 못되죠.)


그렇게하여 어찌어찌 시스템을 구축하긴 했습니다. 문헌마다 다른 표기법들을 정규화하는 작업이 난해하여 아직 엄두도 내지 못하고 있어서, 여전히 Recall이 낮습니다. 예를 들어 ᄉᆞᄅᆞᆷ사ᄅᆞᆷ, 사람은 사실 다 같은 단어이지만 현재는 다른 단어로 처리되어 ᄉᆞᄅᆞᆷ이라 입력하면 사람이 포함된 문헌을 검색하질 못합니다. 연철 표기법으로 글자의 형태가 바뀐경우도 검색이 잘 안되구요. 이 문제는 FastText 등의 Word Embedding 기법으로 형태와 의미가 유사한 단어를 뽑아 클러스터링하는 방식으로 극복할 예정에 있습니다.


아직 부족한 시스템이지만, 중세나 근대 한국어 자료를 찾으시는 분들에게 도움이 되면 좋겠네요. 혹시라도 사용에 불편한 점이나 개선 아이디어가 있으시다면 언제든지 댓글이나 메일로 전달해주시면 감사하겠습니다!

이 댓글을 비밀 댓글로