[NLP].한국어 존댓말과 반말을 구별하는 방법(feat. komoran)

jongmin-oh·2022년 11월 10일
0

한국어는 영어와 다르게 존댓말(높힘말)과 반말(낮춤말)이 존재한다.

그래서 존댓말을 반말로 바꿔주고 반말을 존댓말로 바꿔주는 모델이 있으면 좋겠지만 (실제로 연구가 많이 진행되었지만 정확도가 높은 편은 아님)

존댓말과 반말을 구분하는 방법을 공유하고자 한다.


형태소 분석기를 통해 나온 토큰들 중 존댓말에 사용되는 토큰들의 갯 수를 구해서 판단하면 된다.

형태소 분석기는 한나눔 , 코모란 , okt 등이 있지만 코모란 형태소 분석기를 사용했다.
이유는 코모란은 존댓말 토큰을 normalize하게 잡아주기 떄문이다.

okt 의 경우는 습니다, 됩니다 , 합니다 로 토크나이즈 하는 반면
코모란은 ㅂ니다. 로 통일해주기 때문에 적은 토큰들을 가지고 많은 존댓말을 판단할 수 있게된다.

('저', 'NP')
('전', 'MM')
('절', 'NNG')
('제가', 'NNP')
('고마워요', 'NNP')
('해주시', 'NNP')
('분', 'NNB')
('어딨어요?', 'NA')
('님', 'XSN')
('께', 'JKB')
('에요', 'EF')
('에요', 'EC')
('아요', 'EC')
('아요', 'EF')
('예요', 'EF')
('예요', 'EC')
('어서요', 'EF')
('어서요', 'EC')
('요', 'JX')
('요', 'EC')
('요', 'EF')
('군요', 'EC')
('군요', 'EF')
('ㄴ데요', 'EC')
('어요', 'EF')
('어요', 'EC')
('구요', 'EF')
('구요', 'EC')
('ㄹ게요', 'EC')
('게요', 'EC')
('ㄹ께요', 'EF')
('지요', 'EF')
('지요', 'EC')
('네요', 'EC')
('네요', 'EF')
('죠', 'EF')
('죠', 'EC')
('니까요', 'EF')
('니까요', 'EC')
('ㅂ니까', 'EF')
('나요', 'EF')
('ㅂ니다', 'EF')
('ㅂ니다', 'EC')
('ㅂ시다', 'EF')
('ㅂ시다', 'EC')
('습니다', 'EF')
('습니다', 'EC')
('답니다', 'EF')
('답니다', 'EC')
('시', 'EP')
('드리', 'VV')
('으시', 'EP')
('ㄴ데요', 'EC')
('ㄴ걸요', 'EC')
('ㄹ까요', 'EC')
('ㄹ까요', 'EF')
('던가요', 'EF')
('거든요', 'EC')
('거든요', 'EF')
('ㄴ가요', 'EC')
('더라구요', 'EF')
('더라구요', 'EC')
('더라고요', 'EC')
('더라고요', 'EF')
('려고요', 'EF')
('을까요', 'EF')
('을까요', 'EC')
('면서요', 'EF')
('래요', 'EC')
('그래요', 'IC')
('으면', 'EC')

import re
from konlpy.tag import Komoran

komoran = Komoran()

#txt파일을 list로 불러오기
hon_tokens = [word.rstrip('\n') for word in open(data_path + 'komoran_honorific_token.txt', 'r',encoding='utf-8')]

def honorific_token_counter(text):
    cnt = 0
    for i in komoran.pos(text):
        if str(i) in hon_tokens:
            cnt += 1
    return cnt

이렇게 해주면 문장에 존댓말 토큰이 얼마나 들어있는 지 확인할 수 있습니다. 데이터를 확인하고 문장의 길이에 따른 존댓말 토큰 수를 비율로 지정하여 존댓말과 반말을 분류 할 수 있습니다.

**이유는 문장이 짧을 경우 존댓말 토큰은 1개 밖에 존재하지 않고

문장이 긴 경우 존댓말 토큰이 1개라면 이것은 반말일 가능성이 높기 때문입니다.

profile
스타트업에서 자연어처리 챗봇을 연구하는 머신러닝 개발자입니다.

0개의 댓글