인공지능

인공지능을 이용한 딥러닝 욕설 필터링 모델 만들기 - 1번째 (전처리 단계)

yjlee06 2023. 7. 20. 05:22
반응형

디스코드에서 메시지에 혐오표현(성,정치,종교,지역 차별 및 비속어)이 있을때

 유연하게 필터링 할수있는 방법이 무엇이 있을까?

라는 고민을 하면서 방법을 찾던 도중

총 2가지의 방안에 대해 생각하였습니다.

 

첫번째는 데이터 베이스에 비속어비속어의 백터값을 저장한다음

특정범위안에서 비슷한 값이 존재할경우 필터링하는 방법

 

두번째는 한국어로 파인튜닝된 딥러닝 모델파인튜닝하여

비속어를 판단하여 필터링하는 방법

 

" 위의 방법중 유연하게 필터링 할수있는가 "

라는 질문에 부합하는 방법은 두번째 방법이라 생각하여 선택하게 되었습니다.

 

 

준비물

파이썬 준비
버전 3.8 이상
필수 라이브러리
test / train 데이터셋 분류 pip install -U scikit-learn
신조어 파악 및 sentence 전처리 pip install kiwipiepy
모델 사용하기위한  라이브러리 pip install transformers
(torch 라이브러리 설치 및 추가적인 환경설정 필요)
kobert tokenizer 사용 KoBERT Github 참조
데이터 베이스 로드할떄 사용하는 라이브러리 pip install datasets
학습 시 평가할때 필요한 라이브러리 pip install evaluate
모델 준비
딥러닝 모델 ( 설치 필요 x ) skt-KoBERT
비속어 데이터셋 비속어 데이터셋 모음 링크

 

1. 전처리 단계

모든 라이브러리가 설치되었다면 각 데이터셋의

문장들은 전처리과정을 거쳐야한다.

 

제일 먼저 vocab에 존재하지 않는 신조어 및 등록되지않은 단어들을 

추가하기위해 Kiwi 라이브러리의 명사추출 및 등록 함수를 이용한다.

 

kiwi.extract_add_words(
  texts=text_array,
  min_cnt=10, max_word_len=10, min_score=0.25
)

위의 함수는 입력된 text_array 에서

단어의 빈도수가 10번 이상

단어의 길이가 10이상

최소 단어 후보 점수가 0.25 이상

이 되어야 신규 단어로 등록을 진행한다.

 

위의 과정을 거친 후 아래의 순서대로 전처리 과정을 진행한다.

 

띄어쓰기 교정 > 오타 교정 > 형태소 분석 > 분리된 형태소 결합

kiwi = Kiwi(model_type='sbg', typos='basic')

tokenized_dataset = [];

for sentence,label in corpus_data:
    sentence = kiwi.tokenize(
      kiwi.space(sentence, reset_whitespace=True),
      normalize_coda=True, #덧붙은 받침 때문에 분석이 깨지는 경우를 방지할 수 있습니다.
      stopwords=stopwords #불용어를 제거할수있습니다.
    )
    
    tokenized_dataset.append({'text':kiwi.join(sentence),'labels': label}) 
    #해당 레이블과 전처리된 문장을 배열변수에 추가합니다.

kiwi = Kiwi(model_type='sbg', typos='basic')

sbg멀리있는 형태소까지 고려할수있는 SkipBigram 모델입니다.
typos= 'basic'오타를 교정할수있는 옵션입니다.

 

kiwi.space(sentence, reset_whitespace=True)

 # 는 기존 공백을 무시한 후 띄어쓰기 교정을 하는 단계입니다.

(기존 공백이 오히려 정확하지 않을 경우 정확한 교정이 안될수도있기에 reset_whitespace=True로 무시함)

 

kiwi.join(sentence) 

형태소를 다시 결합합니다.

 

train_df, test_df = train_test_split(tokenized_dataset, test_size=0.3, random_state=42)

전체 데이터셋중 30%는 test_dataset으로 나머지 70%는 train_dataset으로 분류

이때 shuffle을 하여 데이터가 잘 분포하게 합니다.

 

각각 train_df와 test_df를 아래의 구문과 같이 json 형태로 저장합니다.

file = open(f'./trainDataset/train_dataset.json', 'w', encoding='utf-8')
json.dump(train_df,file)
file.close()

file = open(f'./testDataset/test_dataset.json', 'w', encoding='utf-8')
json.dump(test_df,file)
file.close()

이때 file.write(json.dumps(train_df))를 하지 않은 이유는

메모리가 64GB임에도 불구하고 데이터가 클 경우 오류가 발생하기때문에

json.dump()를 활용하여 저장하였습니다.

 

 

 

여러방법을 찾아보면서 _

전문적인 지식없이 어떻게 하면 유연한 비속어 필터링을 할수있는가에 대해 고민한 결과

딥러닝을 이용한 것이 가장 좋다고 판단하여 해당 프로젝트를 진행하였습니다.

 

하지만 많은 부분에서 막힐수밖에없었고 그때마다 찾으면서 라이브러리를 응용하는 방법과

전처리과정을 어떻게 디자인하면 좋을까 고민을 하게되었으며

나름대로 해결책을 찾으며 지식을 쌓게된 계기가 된것같습니다.

 

다음에는 transformers 라이브러리를 이용하여

skt KoBERT 모델을 강화학습하는 방법에대해 올리겠습니다.

읽어주셔서 감사합니다!