본문 바로가기

인문학도 개발일지/NLP

KoBERT로 Text Classification을 진행할 때 input 데이터 형태(이진분류)

근 두 달 동안 대여섯 가지 정도의 NLP 모델을 공부하고 파인튜닝을 진행해보며 Text Classification 프로젝트를 진행했다.

진작에 정리를 조금씩 해왔어야 했는데 또 기억이 흐릿해져서야 정리를 시작하게 되었다.

각 모델 코드들을 리팩토링하면서 겸사겸사 어려움을 겪었던 부분들에 대한 기억들을 되짚고, 따로 개인 노션에 정리해두었던 내용 중 공유가 가능한 부분을 정리해두려고 한다.

일단 프로젝트의 목표는 전체 인터넷 뉴스 기사 중 특정 내용을 담고 있는 기사를 솎아내는 것이었다. 가령 '코로나'를 주제로 하고 있는 기사를 전체 기사에서 판별해내 식으로, NLP 기본서에서 항상 다루는 스팸메일 걸러내기와 같은 이진분류를 해내는 것이 목표였다.

랜덤포레스트, Vanilla RNN 등 기초적인 모델에서 시작했지만 궁극적으로는 SKTBrain 팀에서 만든 KoBERT를 사용해보고 싶었다. 

한국어 데이터를 다루는 프로젝트기 때문에 한국어에 특화된 모델을 써서 그만큼 좋은 결과를 내고 싶다는 것이 가장 큰 이유였고, 어려운 모델을 한 번 훑고나면 다른 과정들이 조금 수월하게 느껴지지 않을까 하는 이유에서였다. 결론적으로 후자는 잘못된 판단이었다고 생각되지만..ㅋㅋ 그래도 새로운 모델을 써볼 때 막연하게 들던 두려움 같은게 많이 사라지긴 했다.

 

서론이 길어졌다.

어쨌든 지금부터 올리는 글들의 순서들은 내가 리팩토링을 진행하거나 기타 작업을 깔짝거리고 있는 순서일 뿐, 프로젝트에 있어서 모델의 중요도나 난이도와 전혀 상관없다.

 

 

KoBERT - input 데이터 형태 갖추기

개인적으로 KoBERT를 사용하는데 있어 가장 많은 시간이 들었던 부분이다.

자연어처리에 익숙하지 않았기 때문에 SKTBrain팀 깃헙에 있는 ReadMe 내용만으로는 충분히 이해가 어려웠고, 비교적 최신 모델이라 구글링을 암만 해도 비슷한 사례들이 나오지 않는 경우도 허다했다.

다른 튜토리얼들을 따라하다보면 대체로 input 데이터는 데이터프레임 형태로 시작했기 때문에 KoBERT로 파인튜닝을 진행할 때도 큰 의심 없이 데이터프레임 형태의 데이터를 쑤셔넣었다. 말 그대로 꾸역꾸역 쑤셔넣고 있었다. 왜냐면 모델이 원한 input 데이터 형태는 데이터프레임 형태가 아니었기 때문에...!(모델 입 찢어졌겠다...)

당연히 확인했어야 하는 것들을 미처 확인하지 못했거니와 TSV에 대한 무지 때문에 벌어진 일이었다.

 

결론적으로, 데이터는 데이터프레임 형태가 아닌 아래와 같은 형태로 들어가야 한다.

(불러온 데이터를 한 번만 슬라이싱 해서 확인해봤어도... 삽질은 없었을 텐데 데이터프레임도 아닌걸 읽어낸다고 head() 메소드만 무한 불러댔으니 당연히 에러가 날 수 밖에 없었다.)

 

지금 이렇게 정리하면서 보니 이딴걸 실수라고 글을 써도 괜찮나 싶을 정도로 하찮게 느껴지지만...🥲

초심자들에겐 사소한 것 하나 눈에 안 띄어서 시간을 많이 뺏기는 일이 많다는걸 알고 있기 때문에...행여 저와 같은 실수로 어이없는 삽질을 하시는 분이 없길 바라며 공유합니다!