본문 바로가기
자연어처리/실습

한국어 토크나이징 아주 간단하게! (복습용)

by 아인슈페너먹고싶다 2022. 9. 17.

어쩌다보니 전남대학교에서 주최하는 감정인식 경진대회를 참여했다.

 

물론 대회가 크다보니까 나 같은 초보자는 참가하는데 의의를 두고 실습 경험을 쌓고자 도전해 보았다.

 

 

 

 

 

본격적으로 프로젝트에 참가하기 전

 

오늘은 간단한 수준의 전처리를 통해 이전에 사용했던 토크나이징을 복습해봤다.

 

 


 

 

일단 주어진 데이터를 확인해보았다. 

 

 

1
2
3
4
import pandas as pd
train = pd.read_csv('C:/Users/비밀/NLP/KERC22Dataset_PublicTest/train_data.tsv',delimiter='\t')
test = pd.read_csv('C:/Users/비밀/NLP/KERC22Dataset_PublicTest/public_test_data.tsv',delimiter='\t')
train
 
cs

7339개의 행

 

 

 

'context' 컬럼은 결측치가 많고 scene별로 내용이 같아서 

 

어차피 토크나이징이 목적이었기에 'sentence'컬럼만을 가지고 전처리를 진행했다. 

 

 

 

 

 

일단 한글만 남겨두고 제거하긴 했는데 '?' 같은 특수문자가 결과값에 영향을 미칠 수 있기에 

 

나중에 성능을 비교해보려고 한다.

 

1
2
train['sentence'= train['sentence'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
test['sentence'= train['sentence'].str.replace("[^ㄱ-ㅎㅏ-ㅣ가-힣 ]","")
cs

 

 

 

 

한글 자연어처리 패키지인 konlpy를 설치하고 그 중 okt를 통해 진행해 보았다.

 

먼저 okt.morphs를 통해 형태소 단위로 문장을 각각 추출한 다음

 

'tk_sentence'라는 새로운 column으로 넣어주는 함수를 정의하고

 

train에 적용하였다.

 

1
pip install konlpy
cs
1
2
import konlpy
from konlpy.tag import Kkma, Komoran, Hannanum, Okt
cs
1
2
3
4
5
6
7
8
9
okt = Okt()
 
tokenized = []
def token(dataframe):
  for sentence in dataframe['sentence']:
    tokens = okt.morphs(sentence)
    tokenize = " ".join(tokens)
    tokenized.append(tokenize)
    dataframe['tk_sentence']=pd.DataFrame(tokenized)

token(train)
cs

 

 

 

다음엔 okt.pos를 통해 품사태깅을 진행한 후 태깅된 값에서

 

품사만 제거하여 'sentence_pos'라는 새로운 column에 넣어주었다. 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def postagging(dataframe):
    main_pos = [] 
    for sentence in dataframe['tk_sentence']: 
        pos = okt.pos(sentence) 
        main_words = [word_pos[0for word_pos in pos if word_pos[1in ('Adjective'
                                                                         'Noun'
                                                                         'Adjective'
                                                                         'Verb'
                                                                         'Number',
                                                                         'KoreanParticle'
                                                                         )] 
        main_words_str = " ".join(main_words) 
        main_pos.append(main_words_str) 
        dataframe["sentence_pos"= pd.DataFrame(main_pos) 

postagging(train)
cs

 

 

 

 

토크나이징을 완료한 결과값은 다음과 같다. 

 

결과물을 보면 완벽한 의미대로 나눠진건 아니지만 어느정도 잘 된 것을 볼 수 있다.

 

 

 


 

 

사실 불용어 제거도 하려고 

 

불용어 사전을 다운받아 리스트화 해 품사태깅 함수 정의에 넣어두려고 했는데 에러가 떠서 

 

토크나이징 과정이 아닌 나중에 따로 불용어 처리 함수를 정의하려 진행해 봐야겠다.

 

1
2
3
4
5
6
7
8
stopwords = open('C:/Users/비밀/NLP/KERC22Dataset_PublicTest/stopwords.txt''r')
 
stop_words_list = []
while True:
    line = stopwords.readline().strip()
    if not line: break
    stop_words_list.append(line)
print(stop_words_list)
cs

 

불용어 사전

 


사실 대회 가이드라인 코드가 BERT를 활용한 딥러닝 계열이라 

 

전처리도 다른 딥러닝 패키지를 통해 진행해야할 것 같은데

 

그래도

 

복습 느낌으로 진행해봤다!  

 

 

KoBERT로 돌아와보겠으!

 

댓글