티스토리 뷰
BERT를 이용하여 정치기사의 정치 성향을 분류하는 프로젝트를 진행하였습니다.
각각 3곳의 진보와 보수 언론사들의 정치 기사 데이터를 수집하고 BERT Fine-tuning을 통해 해당 기사가 어떤 정치적 성향을 가지고 있는지 제대로 분류할 수 있는가를 프로젝트의 목적으로 잡고 진행하였습니다.
발표의 목차입니다. 데이터수집과 전처리, BERT 모델을 이용한 Fine-Tuning, 마지막으로 추가적으로 진행한 데이터 전처리와 결론에 대해 설명 드리겠습니다.
처음으로 데이터 수집과 전처리입니다.
저희는 웹 크롤링을 통해 진보와 보수의 주요 언론사 각각 3곳, 총 6곳에서 정치관련 기사 데이터를 2만개씩 수집하여 총 12만개의 데이터를 확보하였습니다. 데이터를 통해 사용할 feature는 기사제목, 작성일, 기사내용으로 선정하였습니다. 기간의 일관성을 위해 기사 작성일은 프로젝트를 시작한 날짜로 동일하게 적용시켜 데이터를 수집하였습니다. 대표 진보 언론사로는 한겨레, 경향신문, 프레시안 등에서 크롤링을 진행하였고, 대표 보수 언론사는 조선일보, 중앙일보, 동아일보를 선정하여 크롤링 하였습니다.
1차 전처리 내용입니다. 크롤링을 통해 수집한 데이터의 불필요한 텍스트를 제거해주었습니다. 기자이름과 이메일, 역슬래시등을 포함한 메타문자, 마침표와 물음표, 느낌표 등을 제외한 나머지 특수기호등을 모두 제거하였습니다. 기사에 한자가 많이 섞여있었지만 일단 그대로 두고 진행하기로 하였습니다. 마지막으로 이진분류를 위해 진보, 보수의 라벨링을 해주었습니다.
1차 전처리가 완료된 깔끔한 데이터의 모습입니다.
다음으로 BERT 모델 구현과 fine-tuning입니다.
저희는 케라스로 구현된 모델을 찾고자 하였고, Tensorflow 2.0을 기반으로 pre-trained된 모델을 사용하였습니다. 위키백과를 통해 영어로 사전학습된 모델이고, fine-tuning을 위한 코드는 캐글에서 트위터에 업로드된 재난텍스트의 진위여부를 가리는 자연어 이진분류 대회를 참고하여 모델을 구현하였습니다. 마지막으로 BERT의 tokenizer를 사용하기 위해 깃허브에 업로드되어 있는 모듈을 불러와 사용하였습니다.
BERT의 인코더를 구현한 모습입니다. 처음은 기사 내용을 통해 프로젝트를 진행하였지만 이런저런 문제로 인해 기사 제목으로 입력을 변경하였습니다. 기사 제목에 맞게 max_len을 설정하여 인코더를 정의해주었습니다. 텍스트를 받아와서 [CLS]토큰과 [SEP]토큰을 추가한 후 인코딩을 위해 token과 mask, segment id를 각각 만들어줍니다.
다음은 모델 정의입니다. BERT의 인코더를 거친 토큰, 마스크, 세그먼트 아이디를 입력값으로 받아옵니다. 코드에 보이는 bert_layer가 tensorflow hub에 사전학습 후 저장되어 있는 모델입니다.
모델 summery입니다. 3개의 인풋레이어를 거친 후 케라스레이어를 통해 fine-tuning이 이루어집니다.
전에 말씀드렸다시피 처음 시도한 데이터는 기사 내용이었습니다. 하지만 총 3번의 시도에 모두 코랩 램이 터져버렸습니다. 데이터를 반으로 줄여도 모델이 돌아가지 않아서 결국 비교적 짧은 기사 제목으로 입력텍스트를 변경하기로 결정했습니다.
기사제목을 입력텍스트로 변경 후 다시 모델을 돌려보았습니다. 전체 데이터를 사용할 때는 여전히 램 용량을 넘었지만 8만개와 6만개의 데이터를 사용했을 때는 모델이 학습을 시작하였습니다. 특이한 점은 8만개보다 6만개의 데이터에서 더 좋은 성능을 보였습니다.
마지막으로 추가 전처리와 결론입니다.
먼저 8만개의 기사제목 데이터를 사용했을때의 모습입니다. 학습을 진행하면서 기존에 지정해두었던 에포크인 3을 5로 변경해보았습니다. train 정확도는 계속 높아졌지만 validation 정확도는 어느정도에서 멈추어 오버피팅을 보였습니다. 다시 3 에폭으로 모델을 돌린결과 validation 정확도가 78%정도를 보였습니다.
다음으로 6만개의 기사제목 데이터를 사용하여 fine-tuning을 진행하였습니다. 6만개의 데이터를 사용하였을 때 validation 정확도가 81%를 기록하며 가장 높은 정확도를 보였습니다.
조금 더 정확도를 높여보기 위해 추가적인 전처리를 진행해보았습니다. BERT 자체가 Multilingual 모델이긴 하지만, 기사에 존재하는 한자들을 팀원들끼리 통일하여 한글로 변경해보기로 하였습니다. 예시를 보자면 글월 문은 문재인으로 푸를 청은 청와대로 미 북 중 일은 미국 북한 중국 일본 등으로 변경해주었습니다. 나머지 한자들은 한자라는 라이브러리를 사용하여 한자의 음 그대로 한글로 변환해주었습니다.
추가 전처리 후 fine-tuning을 같은 조건으로 진행해보았습니다. 한자를 한글로 변경했을 때의 valdation 정확도가 79%를 기록하며 기존의 데이터보다 성능이 떨어지는 모습을 보였습니다.
최종적으로 가장 높은 점수를 보였던 6만개의 1차전처리 기사제목을 사용한 모델을 사용하여 test 데이터셋을 예측해보았습니다. 테스트 셋의 스코어는 80.85%의 정확도로 나름 좋은 성능을 보여주었습니다. 테스트 셋을 잘못 분류한 데이터들을 한 번 살펴보았습니다. 제대로 분류하지 못한 기사제목은 대부분 제목 자체에 정치성향이 뚜렷하게 드러나지 않는 데이터들이었습니다.
반면 제대로 분류할만도 한데 잘못 분류한 데이터들도 있었습니다. 예시와 같은 경우는 기사제목에 정치성향이 드러나는 편에 속합니다. 하지만 제대로 분류해내지 못했습니다. 이와 관련하여 팀원들과 이야기를 해본 결과 나름의 이유가 있을거라고 판단했습니다. 대북물자를 적극 지원한다는 내용은 당연히 진보적 성향이 뚜렷하다는 의견이 있었던 반면, 보수 언론사의 지능적인 정치 언론행위이다 라는 의견도 있었습니다. 해당 기사는 진보언론사의 기사였고 BERT는 보수로 분류하였습니다.
마지막 프로젝트의 결론입니다. 첫 번째로 코랩이 BERT의 학습을 감당하지 못하였고, 데이터를 줄였음에도 불구하고 학습에 있어서 많은 시간이 소요되었습니다. 다음으로 특이했던 점이 데이터가 8만개일때보다 6만개일 때 더 성능이 좋은점과 추가로 전처리를 하였지만 성능이 나빠졌다는 점입니다.
BERT는 특별한 추가 조치없이 모델 자체로도 기사제목만을 사용하여 80% 이상의 정확도를 보였습니다. 하지만 뚜렷한 성향을 보이지 않는 기사제목은 제대로 분류하지 못했습니다. 기사내용으로 fine-tuning을 진행하지 못한점과 한글로 pre-trained된 모델을 사용해보지 못한 점이 아쉬웠습니다.
'ACTIVITY STORY > BOAZ' 카테고리의 다른 글
[ADV 프로젝트] 텍스트 불균형 해소 Part2. EDA (Easy Data Augmentation) (0) | 2021.02.14 |
---|---|
[ADV 프로젝트] 텍스트 불균형 해소 Part1. Text Augmentation (번역 후 재번역, Back Translation) (0) | 2020.12.12 |
[ADV 프로젝트] 텍스트 전처리 Part2. 맞춤법 교정 (부산대 맞춤법 교정기, py-hanspell) (5) | 2020.11.25 |
[ADV 프로젝트] 텍스트 전처리 Part1. 띄어쓰기 교정 (파이썬 Chatspace) (3) | 2020.11.24 |
[ADV 프로젝트] 스포일러 댓글 분류기 SpoilerNet by BOAZ (5) | 2020.11.04 |