고양국제고/더브레인

[더브레인] 4월 진행 상황

카루-R 2022. 4. 19. 20:43
반응형
 

환영합니다, Rolling Ress의 카루입니다.

오늘 (4/22)은 지필 전 시간이라 활동을 잡지 않았습니다. 다만, 10분 정도만 빠개서 빠르게 설명을 하고 갈게요. 일단 우리가 어디까지 진행이 되었는지는 알아야 할테니.

우선 저희는 머신러닝을 주로 활용할 예정입니다. 지도학습(Supervised learnig)과 비지도학습(Unsupervised learning)을 동시에 사용합니다. 지도학습에선 이진분류(Binary classfication)를 여러 번 사용하여 혐오 표현을 잡아내고, 비지도학습은 뉴스 기사의 제목을 군집화(Clustering)하여 해당 뉴스가 어떤 공통점을 갖고 있는지 알아보고자 합니다.

여튼, 이런 식으로 각각 "성차별", "차별 표현", "혐오 표현"을 탐지하는 모델을 만들었습니다. 사실 성차별이 차별 표현으로 감지해낼 수 있긴 한데, 왠진 모르겠지만 원본 데이터에서도 이걸 따로 제공했더라고요. 그래서 저도 그냥 따로 분류했습니다.

 
 

보시면 아시겠지만 진짜 대충 만들었습니다. 이 세 모델을 wrapping하는 클래스를 하나 만들었고, 얘는 뭐 자세한 동작 방식을 이해하실 필요는 없어요. 그냥 문장을 주면, 이게 혐오 표현이 포함되어 있는지 확인할 수 있게 해줍니다. 나중에 우리가 기사 댓글 크롤링해서 자동화시키면 딱 적당하겠죠.

void Predict(string comment)
{
    HateSpeechClassifier classifier = new();
    classifier.Predict(comment);

    if (classifier.HasGenderBias)
        Console.WriteLine("성차별 표현이 포함되어 있습니다.");

    if (classifier.HasBias)
        Console.WriteLine($"{classifier.BiasType} 타입의 차별 표현이 있습니다.");

    if (classifier.HasHate)
        Console.WriteLine($"{classifier.HateType} 타입의 혐오 표현이 있습니다.");

    if (classifier.IsClean)
        Console.WriteLine("혐오 표현이 감지되지 않았습니다.");
}

이런 식입니다. 일단 테스트를 해봅시다.

프로그램을 실행하면 이렇게 뜹니다. 어떤 문장을 입력하는지에 따라 결과가 조금씩 달라지는 걸 볼 수 있습니다. 참고로 성차별 표현은 제대로 잡아내지 못하는 경우가 있어요. 딱히 '이건 아닌 것 같은데?' 싶은 표현도 성차별로 무턱대고 감지하는 경우가 있어서. 이건 그냥 분류기 자체의 문제로 봐야할지.

그래요. 일단 C#에서 머신러닝은 이렇게만 구성했습니다. 댓글 분류기죠. 군집화는 여기서 다루기 까다로워서, 파이썬의 도움을 좀 받으려고 합니다.

이건.. 사실 파이썬으로 데이터 처리를 한 다음에 파일을 C# 프로그램으로 넘겨서 받는 게 빠를 것 같아요. 일단 여기서 보면 기사 제목을 모두 읽어온 다음, 리스트에 저장하는 코드입니다. 그 과정에서 "기자어"... 기자들이 좋아하는 표현을 좀 빼고 시작하겠습니다. '단독', '충격', '종합' 이런 것들은 군집화에 방해가 됩니다. 이게.. 생판 다른 내용인데 그냥 비슷한 위치에 비슷한 말이 있다고 비슷한 주제로 묶어버리더라고요...? 좀 열받아서, 하나하나 수작업으로 없앴습니다. 여튼, 이 다음부턴 본격적인 자연어처리가 들어갑니다. 명사를 위주로 토큰화를 한 다음, 이걸 토대로 분석하는 거예요. 자세한 설명은 판서로 하겠습니다. 뭐 원핫 인코딩이나 LogisticRegression등등 할 말이 많아요.

import numpy as np

lines = [x.replace('\"', '') for x in lines]

new_title = np.column_stack([kmeans.labels_, lines])
sorted_list = sorted(new_title, key=lambda x: x[0])

import csv
with open("sorted.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(sorted_list)

with open("origin.csv", "w", newline="") as f:
    writer = csv.writer(f)
    writer.writerows(new_title)

중간 단계는 생략하겠습니다. 여튼, 이렇게 실행한 다음 어떤 파일이 출력되는지 살펴보죠.

저는 아무 것도 건드린 게 없습니다. 다만 하이퍼파라미터를 통해 "몇 가지로 분류할지" 미리 명령을 내렸을 뿐. 참고로 이 숫자에는 정답이 없기 때문에 정말 이것저것을 다 넣어가며 우리가 분석해야 합니다. 아, 그냥 이 노가다를 여러분게 맡길까요? ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ...

그래요, 일단 제가 진행한 건 여기까지입니다. 나머지는 다음 동아리 시간에 계속해보죠.

반응형