본문 바로가기
NLP

konlpy 형태소 분석기 성능 비교

by rubyda 2020. 8. 17.
728x90
konlpy가 지원하는 형태소 분석기 비교하기(WINDOWS)_after

konlpy 형태소 분석기 성능 비교

In [2]:
from konlpy.tag import Kkma
from konlpy.tag import Komoran
from konlpy.tag import Hannanum
from konlpy.tag import Okt 
import re

kkma = Kkma() 
komoran = Komoran() 
hannanum = Hannanum() 
okt = Okt() 

형태소 분석 비교

1. 띄어쓰기가 올바르지 않은 문장

In [20]:
text = "아버지가방에들어가신다"
In [21]:
kkma.pos(text)
Out[21]:
[('아버지', 'NNG'),
 ('가방', 'NNG'),
 ('에', 'JKM'),
 ('들어가', 'VV'),
 ('시', 'EPH'),
 ('ㄴ다', 'EFN')]
In [22]:
komoran.pos(text)
Out[22]:
[('아버지', 'NNG'),
 ('가방', 'NNP'),
 ('에', 'JKB'),
 ('들어가', 'VV'),
 ('시', 'EP'),
 ('ㄴ다', 'EC')]
In [23]:
hannanum.pos(text)
Out[23]:
[('아버지가방에들어가', 'N'), ('이', 'J'), ('시ㄴ다', 'E')]
In [8]:
okt.pos(text) # 형태소 분석 자세하게 할떄 취약하다.
Out[8]:
[('아버지', 'Noun'), ('가방', 'Noun'), ('에', 'Josa'), ('들어가신다', 'Verb')]

분석 결과를 보면 kkma와 komoran이 동일하게 형태소를 잘 분리하였습니다. 하지만 Hannanum은 분리를 잘 못하는 것을 알 수 있습니다.

2. 오타가 있는 문장

In [24]:
text2 = "안녕ㅎㅏㅅㅔ여 ㅈㅓ는 ㄷㅐ학생 입니다. "
In [25]:
print("꼬꼬마 : %s\n" % kkma.pos(text2))
print("코모란 : %s\n" % komoran.pos(text2))
print("한나눔 : %s\n" % hannanum.pos(text2))
print("Okt : %s\n" % okt.pos(text2))
꼬꼬마 : [('안녕ㅎㅏㅅㅔ', 'UN'), ('여', 'JKI'), ('ㅈㅓ', 'UN'), ('는', 'JX'), ('ㄷ', 'NNG'), ('ㅐ', 'UN'), ('학생', 'NNG'), ('이', 'VCP'), ('ㅂ니다', 'EFN'), ('.', 'SF')]

코모란 : [('안녕', 'NNP'), ('하', 'NNP'), ('세', 'NNB'), ('이', 'VCP'), ('어', 'EC'), ('저', 'NP'), ('는', 'JX'), ('대학생', 'NNG'), ('이', 'VCP'), ('ㅂ니다', 'EF'), ('.', 'SF')]

한나눔 : [('안녕ㅎㅏㅅㅔ', 'N'), ('이', 'J'), ('어', 'E'), ('ㅈㅓ', 'N'), ('는', 'J'), ('ㄷㅐ학생', 'N'), ('일', 'P'), ('ㅂ니다', 'E'), ('.', 'S')]

Okt : [('안녕', 'Noun'), ('ㅎㅏㅅㅔ', 'KoreanParticle'), ('여', 'Noun'), ('ㅈㅓ', 'KoreanParticle'), ('는', 'Verb'), ('ㄷㅐ', 'KoreanParticle'), ('학생', 'Noun'), ('입니다', 'Adjective'), ('.', 'Punctuation')]

결과를 보면 코모란이 오타를 잘 고쳐서 출력한다는 것을 알 수 있습니다. 나머지 꼬꼬마, 한나눔, Okt는 오타를 잘 인식하지 못한다는 결과가 나왔습니다.

3. 속도 비교

네이버 기사 중 하나를 복사해온 결과입니다.

In [14]:
text3 = """광운대학교 캠퍼스타운사업단 SNK-VITAMIN센터에서 SW코딩 교육 특강을 실시한다.

이번 SW코딩 교육 특강은 비전공자도 배울 수 있는 파이썬 코딩 교육 과정 학습과 스크래치 프로그램을 활용한 기초 소프트웨어 코딩 교육 과정 학습, 관련 자격증과 연계해 실용성을 확대하는 학습 등으로 이루어진다.

특히 오프라인 특강과 온라인 특강을 결합한 1기, 온라인 특강으로만 이뤄진 2기로 나누어져 다양한 수강생들의 참여를 기다린다. 1기의 경우 오는 8월 18일부터 8월 31일까지, 2기의 경우 9월 1일부터 9월 14일까지 교육을 진행한다.

SW코딩 교육 특강은 서울시와 노원구의 지원을 받아 진행되는 캠퍼스타운 조성사업의 일환으로, 교육비가 무료이며 SW코딩에 관심 있는 예비·초기 창업자, 지역주민, 대학생 등 누구나 신청할 수 있다. 또한 강의 수료 시 관련 자격증 응시를 지원한다.

관계자는 "서울시 캠퍼스타운조성사업으로 진행되는 이번 코딩교육은 지역주민과 대학생 등 누구나 신청할 수 있다. 특히 비전공자도 기초부터 코딩을 배울 수 있다"면서 "많은 분들의 참여를 기다린다"고 밝혔다.

한편 SW코딩 특강은 광운대 캠퍼스타운 홈페이지에서 신청할 수 있으며, 1기는 오는 8월 14일까지, 2기는 8월 31일까지 접수하면 된다. 선착순 신청으로 조기 마감 될 수 있으며 자세한 사항은 홈페이지에서 확인 가능하다."""

여기서 %%time은 걸리는 시간을 체크해주는 함수입니다.

In [26]:
%%time
print(kkma.pos(text3)[:10])
[('광운', 'NNG'), ('대학교', 'NNG'), ('캠퍼스', 'NNG'), ('타운', 'NNG'), ('사업단', 'NNG'), ('SNK-VITAMIN', 'OL'), ('센터', 'NNG'), ('에서', 'JKM'), ('SW', 'OL'), ('코딩', 'NNG')]
Wall time: 477 ms
In [27]:
%%time
print(komoran.pos(text3)[:10])
[('광운대학교', 'NNP'), ('캠퍼스', 'NNP'), ('타운', 'NNP'), ('사업단', 'NNG'), ('SNK', 'SL'), ('-', 'SS'), ('VITAMIN', 'SL'), ('센터', 'NNP'), ('에서', 'JKB'), ('SW', 'SL')]
Wall time: 27.9 ms
In [28]:
%%time
print(hannanum.pos(text3)[:10])
[('광운대학교', 'N'), ('캠퍼스타운사업단', 'N'), ('SNK', 'F'), ('-', 'S'), ('VITAMIN', 'F'), ('센터', 'N'), ('에서', 'J'), ('SW코딩', 'N'), ('교육', 'N'), ('특강', 'N')]
Wall time: 106 ms
In [29]:
%%time
print(okt.pos(text3)[:10])
[('광운대', 'Noun'), ('학교', 'Noun'), ('캠퍼스', 'Noun'), ('타운', 'Noun'), ('사업', 'Noun'), ('단', 'Noun'), ('SNK', 'Alpha'), ('-', 'Punctuation'), ('VITAMIN', 'Alpha'), ('센터', 'Noun')]
Wall time: 199 ms

속도 비교 결과 꼬꼬마가 가장 느리고 코모란이 가장 빠르며 나머지 두개는 비슷한 결과가 나왔습니다. 하지만 입력 데이터에 따라서 차이가 있을수도 있습니다.

'NLP' 카테고리의 다른 글

Sentence Embedding Summary  (0) 2020.08.23
Word Embedding Summary  (0) 2020.08.23
bag of words  (0) 2020.07.15
임베딩에 쓰이는 세가지 통계 정보  (0) 2020.07.15
1.1 임베딩(embedding)  (0) 2020.07.15