본문 바로가기

카테고리 없음

( 자연어 처리) 형태소 분석기 6종 테스트

형태소 분석기 6종을 테스트해보자.

한아름, 꼬꼬마, 코모란, 메켑, Okt, 카이(카카오에서 만든 것)를 테스트해본다.

 

'카이'는 총 세 대의 컴퓨터에 설치를 시도했는데, 인텔 10700k 우분투 20.04에만 깔렸고, 인텔 3770k 우분투 20.04와 3770k 우우분투 21.04, 인텔 CPU 노트북의 Fedora 34에는 설치 실패했다. mecab보다 설치가 어려운 듯하다.

 

시 한편의 일부나 전부를 전처리하여, 그것을 형태소 분석기로 넘겼다.  처리 시간도 측정했다.

 

from konlpy.tag import Hannanum
from konlpy.tag import Kkma
from konlpy.tag import Komoran
from konlpy.tag import Mecab
from konlpy.tag import Okt
from khaiii import KhaiiiApi  # 카카오 형태소 분석기
import time

hannanum = Hannanum()
kkma = Kkma()
komoran = Komoran()
mecab = Mecab()
okt = Okt()
api = KhaiiiApi()

#sentence = "홀로 우뚝 선 저 바위 칭얼대는 파도에 가려 숨어있는지 꽁꽁언 겨울바다 꼭 입을 다문다 포말은 일렁이고 산다는 건 다 그런 거다 삶은 언젠가 한번쯤 스릴 있는 파도를 탄다 겨울바다 눈 시린 꽁꽁 언 돈지갑을 열자니 열받아."
#sentence = "비 개인 오후 다섯 시 딱딱해진 것을 가져본 적 없는 지렁이가 납작하게 죽어 있다 내가 밟아 죽였는지는 기억나지 않는다 옹송그리며 지렁이의 몸에 새카맣게 들러붙은 똥파리들 잘 차려진 식사 중이다 태처럼 맨몸뚱이였던 내부로부터 뜨겁게 터져 나온 얼룩이 앞뒤를 찾던 인생의 정답이 아니라는 걸 똥파리들은 알까 저 죽음과 같은 공간에 있는 비에 젖은 흙냄새가 내 폐를 최대한 부풀린다"
sentence = "동태가 생태보다 무서운 것은 토막 난 몸으로도 눈을 뜨고 있다는 사실이다 조문객의 눈을 뚫어지게 바라보는 사후의 눈 내 살 누가 파먹나 사력을 다해 노려본다는 것이다 핏발이 선 눈빛에 말없이 수저를 놓는다 용서 같기도 하고 포기 같기도 한 눈빛이 내공처럼 탱탱한 울음을 채워 넣고 있다 흐릿한 기억으로 생을 감당할 수 없었기에 꽝꽝 얼도록 시력은 흔들리지 않는다 살이 달콤할수록 등골이 오싹해진다"
#sentence = "추돌한 차 옆구리가 찢기고 파란 혈액이 흐른다 네 잘못이 내 잘못인양 덩치 큰 차에 묶여 끌려가는 뒷 모습 인생도 어디론가 끌려가고 있다 세월의 견인차에 묶여 어디론가 가고 있다"
#sentence = "뱀이 왜 기어 다니는지 아세요 불안하기 때문이래요 손발 없이 귀머거리로 사는 동물은 또 없거든요 독이라도 품어야 살 수 있지 않겠어요 얼마나 불안했으면 혀가 다 갈라졌겠어요 남의 땅에 사는 것도 마찬가지예요   혹시 은인을 찔러 죽인 전갈 이야기 들어 보셨어요 본능을 장전하면 갈기고 싶어지죠 본능은 의지보다 늘 앞서니까요 하지만 본능보다 앞에 불안이란 게 있어요 그래서 가장 위험한 것들은 불안해하는 것들이래요"
#sentence = "정동진에는 해가 없다 비는 있다 배는 산으로 가고 기차는 바다 속으로 들어간다 아이들은 포효하는 바다 속으로 뛰어들고 강은 산으로 흐르고 철조망은 바다를 덮치고 바다는 철조망을 삼키고 모래시계는 거꾸로 흐른다"


print("-------------- Hannanum ------------")
start = time.time()
print(hannanum.morphs(sentence))
print("걸린 시간: ", time.time() - start )

print("-------------- Kkma ------------")
start = time.time()
print(kkma.morphs(sentence))
print("걸린 시간: ", time.time() - start )


print("-------------- Komoran ------------")
start = time.time()
print(komoran.morphs(sentence))
print("걸린 시간: ", time.time() - start )

print("-------------- Mecab ------------")
start = time.time()
print(mecab.morphs(sentence))
print("걸린 시간: ", time.time() - start )

print("-------------- Okt ------------")
start = time.time()
print(okt.morphs(sentence))
print("걸린 시간: ", time.time() - start )

print("-------------- Khaiii ------------")
start = time.time()
analyzed = api.analyze(sentence)
morphs_list = []
for word in analyzed:
  for morph in word.morphs:
    morphs_list.append(morph.lex)
print(morphs_list)
print("걸린 시간: ", time.time() - start )

# 카카오 형태소 분석기는 클래스 메서드와 변수들이 여타의 분석기와는 조금 다르다.

-------------- Hannanum ------------
['동태', '가', '생태', '보다', '무섭', '은', '것', '은', '토막', '나', 'ㄴ', '몸', '으로도', '눈', '을', '뜨', '고', '있', '다는', '사실', '이', '다', '조문객', '의', '눈', '을', '뚫', '어', '지', '게', '바라', '아', '보', '는', '사후', '의', '눈', '내', '살', '누구', '가', '파먹', '나', '사력', '을', '다하', '어', '노리', '어', '보', 'ㄴ다는', '것', '이', '다', '핏발', '이', '서', 'ㄴ', '눈빛', '에', '말없이', '수저', '를', '놓', '는다', '용서', '같', '기', '도', '하', '고', '포기', '같', '기', '도', '하', 'ㄴ', '눈빛', '이', '내공처럼', '탱탱한', '울', 'ㅁ', '을', '채우', '어', '넣', '고', '있', '다', '흐릿', '하', 'ㄴ', '기억', '으로', '생', '을', '감당', '하', 'ㄹ', '수', '없', '었기', '에', '꽝꽝', '얼', '도록', '시력', '은', '흔들리', '지', '않', '는다', '살', '이', '달콤', '하', 'ㄹ수록', '등골', '이', '오싹', '하', '어', '지', 'ㄴ다']
걸린 시간:  0.3244016170501709
-------------- Kkma ------------
['동태', '가', '생태', '보다', '무섭', 'ㄴ', '것', '은', '토막', '낳', 'ㄴ', '몸', '으로', '도', '눈', '을', '뜨', '고', '있', '다는', '사실', '이', '다', '조문객', '의', '눈', '을', '뚫어지', '게', '바라보', '는', '사후', '의', '눈', '내', '사', 'ㄹ', '누', '가', '파먹', '나', '사력', '을', '다하', '어', '노려보', 'ㄴ다는', '것', '이', '다', '핏발', '이', '서', 'ㄴ', '눈빛', '에', '말없이', '수저', '를', '놓', '는', '다', '용서', '같', '기', '도', '하', '고', '포기', '같', '기', '도', '하', 'ㄴ', '눈빛', '이', '내공', '처럼', '탱탱', '한', '울음', '을', '채우', '어', '넣', '고', '있', '다', '흐릿', '하', 'ㄴ', '기억', '으로', '생', '을', '감당', '하', 'ㄹ', '수', '없', '었', '기에', '꽝꽝', '얼', '도록', '시력', '은', '흔들리', '지', '않', '는', '다', '살이', '달콤', '하', 'ㄹ', '수록', '등골', '이', '오싹', '해지', 'ㄴ다']
걸린 시간:  3.6455953121185303
-------------- Komoran ------------
['동태', '가', '생태', '보다', '무섭', 'ㄴ', '것', '은', '토막', '나', 'ㄴ', '몸', '으로', '도', '눈', '을', '뜨', '고', '있', '다는', '사실', '이', '다', '조문객', '의', '눈', '을', '뚫어지', '게', '바라보', '는', '사후', '의', '눈', '내', '살', 'ㄹ', '누구', '가', '파먹', '나', '사력', '을', '다', '하', '아', '노려보', 'ㄴ다는', '것', '이', '다', '핏발', '이', '서', 'ㄴ', '눈빛', '에', '말없이', '수저', '를', '놓', '는다', '용서', '같', '기', '도', '하', '고', '포기', '같', '기', '도', '한', '눈빛', '이', '내공', '처럼', '탱탱한', '울음', '을', '채우', '어', '넣', '고', '있', '다', '흐릿', '하', 'ㄴ', '기억', '으로', '생', '을', '감당', '하', 'ㄹ', '수', '없', '었', '기', '에', '꽝', '꽝', '얼', '도록', '시력', '은', '흔들리', '지', '않', '는다', '살', '이', '달콤', '하', 'ㄹ수록', '등골', '이', '오싹', '하', '아', '지', 'ㄴ다']
걸린 시간:  0.015558242797851562
-------------- Mecab ------------
['동태', '가', '생태', '보다', '무서운', '것', '은', '토막', '난', '몸', '으로', '도', '눈', '을', '뜨', '고', '있', '다는', '사실', '이', '다', '조문객', '의', '눈', '을', '뚫어지', '게', '바라보', '는', '사후', '의', '눈', '내', '살', '누가', '파먹', '나', '사력', '을', '다', '해', '노려본다는', '것', '이', '다', '핏발', '이', '선', '눈빛', '에', '말없이', '수저', '를', '놓', '는다', '용서', '같', '기', '도', '하', '고', '포기', '같', '기', '도', '한', '눈빛', '이', '내공', '처럼', '탱탱', '한', '울음', '을', '채워', '넣', '고', '있', '다', '흐릿', '한', '기억', '으로', '생', '을', '감당', '할', '수', '없', '었', '기', '에', '꽝꽝', '얼', '도록', '시력', '은', '흔들리', '지', '않', '는다', '살', '이', '달콤', '할수록', '등골', '이', '오싹', '해진다']
걸린 시간:  0.0011699199676513672
-------------- Okt ------------
['동태', '가', '생태', '보다', '무서운', '것', '은', '토막', '난', '몸', '으로도', '눈', '을', '뜨고', '있다는', '사실', '이다', '조', '문', '객', '의', '눈', '을', '뚫어지게', '바라보는', '사후', '의', '눈', '내', '살', '누가', '파먹나', '사력', '을', '다해', '노려본다는', '것', '이다', '핏발', '이', '선', '눈빛', '에', '말', '없이', '수저', '를', '놓는다', '용서', '같기도', '하고', '포기', '같기도', '한', '눈빛', '이', '내공', '처럼', '탱탱한', '울음', '을', '채워', '넣고', '있다', '흐릿', '한', '기억', '으로', '생', '을', '감당', '할', '수', '없었기에', '꽝꽝', '얼도록', '시력', '은', '흔들리지', '않는다', '살이', '달콤할수록', '등골', '이', '오싹해진다']
걸린 시간:  2.3501646518707275
-------------- Khaiii ------------
['동태', '가', '생태', '보다', '무섭', 'ㄴ', '것', '은', '토막', '나', 'ㄴ', '몸', '으로', '도', '눈', '을', '뜨', '고', '있', '다는', '사실', '이', '다', '조', '문객', '의', '눈', '을', '뚫어지', '게', '바라보', '는', '사후', '의', '눈', '나', '의', '살', 'ㄹ', '누구', '가', '파먹', '나', '사력', '을', '다', '하', '여', '노리', '어', '보', 'ㄴ다는', '것', '이', '다', '핏발', '이', '서', 'ㄴ', '눈빛', '에', '말없이', '수저', '를', '놓', '는다', '용서', '같', '기', '도', '하', '고', '포기', '같', '기', '도', '하', 'ㄴ', '눈빛', '이', '내공', '처럼', '탱탱', '하', 'ㄴ', '울음', '을', '채우', '어', '넣', '고', '있', '다', '흐릿', '하', 'ㄴ', '기억', '으로', '생', '을', '감당', '하', 'ㄹ', '수', '없', '었', '기에', '꽝꽝', '얼도', '록', '시력', '은', '흔들리', '지', '않', '는다', '살', '이', '달콤', '하', 'ㄹ수록', '등골', '이', '오싹', '하', '여', '지', 'ㄴ다']
걸린 시간:  0.0025224685668945312

 

*** 일단 속도 면에서 보면 Mecab이 제일 빠르고, '카이'가 그 뒤를 잇는다. 시를 1만편 형태소 분석을 한다면 한편당 0.01초 이상 걸리는 형태소 분석기들은 답답하게 느껴질 듯하다. 

 

*** '무서운 것은'을 형태소 분석한 것을 보면 흥미로운데, Mecab이  '무서운', '것', '은'으로, 평범하게 분석했는데, 꼬꼬마, 코모란, 카이는 '무섭', 'ㄴ', '것','은'으로 분석해서 동사의 어미 '무섭'과 연결사인 'ㄴ', 그리고 '것'으로 분석해서 가장 한국어답게 해체했다. Mecab 식으로 형태소 분석한 것을 딥러닝에 넘기면 글자 조립 측면에서는 수월하겠지만 한층 근원적인 한국어 훈련에는 다소 아쉬울 듯하다.