고양국제고/더브레인

[더브레인-3] 4. 한국어 토큰화 예제 실습 안내

카루-R 2022. 7. 7. 15:01
반응형
환영합니다, Rolling Ress의 카루입니다.

** 3-4. 한국어 토큰화 [언어]

3-3번 예제와 마찬가지로, 따로 제가 설명드릴 부분은 많지 않습니다. 특히나 한국어 전산처리는 조사 등의 이유로 더 까다로운 면이 있어서, 중요한 부분만 짚고 넘어가겠습니다.

!pip install konlpy

from konlpy.tag import Okt
from konlpy.tag import Kkma

필요한 패키지를 불러옵니다. 여기선 konlpy의 Okt, Kkma를 사용합니다. (Kkma...꼬꼬마라네요. 이름 참 특이하네.)

okt = Okt()
kkma = Kkma()

# 이 문장을 적절히 바꾸어보세요
kor_sentence = '''
네가 오기로 한 그 자리에
내가 미리 가 너를 기다리는 동안
다가오는 모든 발자국은
내 가슴에 쿵쿵거린다
바스락거리는 나뭇잎 하나도 다 내게 온다
기다려본 적이 있는 사람은 안다
세상에서 기다리는 일처럼 가슴 애리는 일 있을까
네가 오기로 한 그 자리, 내가 미리 와 있는 이곳에서
'''

print('OKT 형태소 분석 :', okt.morphs(kor_sentence))
print('OKT 품사 태깅 :', okt.pos(kor_sentence))
print('OKT 명사 추출 :', okt.nouns(kor_sentence)) 

# 동사 추출하기
verbs = [x for (x, y) in okt.pos(kor_sentence) if y == 'Verb']
print('\nOKT 동사 추출 :', verbs)

print('\n꼬꼬마 형태소 분석 :',kkma.morphs(kor_sentence))
print('꼬꼬마 품사 태깅 :',kkma.pos(kor_sentence))
print('꼬꼬마 명사 추출 :',kkma.nouns(kor_sentence))  

# 동사 추출하기
verbs = [x for (x, y) in kkma.pos(kor_sentence) if y == 'VV']
print('\n꼬꼬마 동사 (어간) 추출 :', verbs)

이번 건 조금 복잡합니다. 출력 결과를 함께 보면서 이해하시는 게 좋을 것 같아요.

문학 시간에 봐서 알겠지만, 저거 황지우의 <너를 기다리는 동안> 맞습니다. 너무 길어서 일부만 따왔습니다. OKT와 꼬꼬마를 이용해 형태소 분석 및 품사 분석을 해볼 겁니다. 이것도 Computational Morphology로 볼 수 있으려나요. 여하튼, 각각을 분석해봅시다. (따로 준비하신 짧은 글이 있다면 시 대신 준비한 글을 넣어주세요)

okt와 kkma에는 각각 morphs, pos, nouns라는 메서드(함수)가 있습니다. 출력 결과 보시면 아시겠지만 문장을 형태소 단위로 끊어주고, 품사를 붙여주고, 명사를 골라내는 역할을 합니다. 자연어처리에서는 명사가 문장에서 중요한 역할을 하기에 저런 함수가 따로 있다고 보셔도 될 것 같아요.

verbs = [x for (x, y) in okt.pos(poem) if y == 'Verb']

그런데 동사를 뽑아내는 함수는 없죠. 그건 우리가 직접 만들면 됩니다. 품사 태깅 함수를 이용해서 '동사'라고 알려주는 품사만 골라내면 되니까요. 위 코드가 Okt에서 동사만 골라내어 리스트로 만들어주는 코드입니다.

꼬꼬마도 Okt와 사용 방법은 거의 같습니다. 그런데, 동작 방식에 약간 차이가 있어요. 품사 분류가 더 복잡합니다. 동사는 어간을 따로 끊기까지 하고요. 그런데, 저는 개인적으로 꼬꼬마를 더 선호합니다.

Okt에서는 '네가 오기로 한'에서 '오기로'를 '오기'라는 명사와 '로'라는 조사의 결합으로 인식합니다. 잘못 판단했죠.

꼬꼬마에서는 '오-'라는 어간과 '-기로'라는 어미로 정확히 인식합니다. 아랫줄에 보면 '오기로 한'의 '한'도 '하-'와 어미 '-ㄴ'으로 정확히 끊어낸 것을 볼 수 있죠. 근데 '네가'는 왜 분리를 안 했는지 모르겠네요. 조사 처리를 안 하나...?

okt = Okt()

rowdata = "오늘은 날씨가 너무 더운데 이렇게 더운 날이 지속된다면 우리는 모두 타 죽고 말거야"
stop_words = "은 가 너무 더운데 이렇게 더운 이 된다면 는 모두 타 말거야"
stop_words = set(stop_words.split(' ')) # 불용어 셋 준비

word_tokens = okt.morphs(rowdata)
data = [word for word in word_tokens if not word in stop_words]

print('불용어 제거 전 :', word_tokens) 
print('불용어 제거 후 :', data)

여튼, 저 위에 있는 거 하면 다 한 겁니다. 이거는 그냥 간단한 예제인데, 불용어를 제거하는 과정이에요. 문장에서 크게 쓸모가 없는 말들을 제거하는 겁니다. 한국어에서는 조사가 있죠. 특히 격조사는 문장 해석에 아무런 쓸모가 없습니다. 그런 것들은 지워줘야 분석하기 편하겠죠. 이런 식으로 불용어를 지운 다음, 토큰화를 시키면 깔끔하게 분석이 가능합니다.

반응형