for textmining

형태소 분석기 성능 비교

|

이번 글에서는 시중에 공개된 형태소 분석기 성능을 비교해 보도록 하겠습니다. 이번 글에서는 꼬꼬마, 코모란, 트위터 세 가지 형태소 분석기 성능을 비교해볼 예정입니다. (제 컴퓨터가 윈도우 기반이어서 은전한닢은 작동이 불가하고, 어떤 이유에선지 한나눔은 라이브러리 로드시 오류가 나서 어쩔 수 없이 제외하였습니다, 향후 환경을 개선하는대로 나머지 두 개 분석기 성능도 비교해 보겠습니다) 그럼 시작하겠습니다.

형태소 분석 개요

형태소 분석(POS-tagging)이란 원시말뭉치를 형태소 단위로 쪼개고 각 형태소에 품사 정보를 부착하는 작업을 가리킵니다. 많은 분들이 한국어 형태소 분석에 매진해 오셨고, 정말 감사하게도 오픈소스로 만들어주셔서 저 같은 사람이 편리하게 사용하고 있습니다. 특히 KoNLPy는 시중에 공개된 꼬꼬마, 코모란, 트위터, 한나눔, 은전한닢 다섯개 형태소 분석기를 한꺼번에 묶어서 편리하게 사용할 수 있도록 한 패키지입니다. 다시 한번 제작자 분들께 깊은 감사를 드립니다.

어쨌든 이번 글의 분석 대상인 꼬꼬마, 코모란, 트위터 형태소 분석기의 품사 태그표는 아래와 같습니다. 보시다시피 꼬꼬마는 세종품사태그에 가장 가깝고 분석 범주 또한 가장 많습니다. 트위터는 꼬꼬마 대비 분석 범주가 다소 적은 편이지만 이모티콘이나 해쉬태그 같은 인터넷 텍스트에 특화된 범주가 추가된 점이 눈에 띕니다. 코모란은 분석 범주 개수로는 꼬꼬마와 트위터 중간에 위치하고, 개발자 분께서 지속적으로 업데이트를 해주시고 계신 점이 강점이라고 할 수 있겠습니다.

분석 방법

왓챠에서 수집한 영화 리뷰 1만건을 분석 대상으로 삼았습니다. 예컨대 아래와 같습니다.

  • 영화가 아니라 영상으로 예술을 만든 작품 이다지도 소박한 주제에 숨이 막힐 듯 한 우아함이라니

  • 옛날 sf영화의 장점 이해하기 쉽고 단순하며 유쾌하다
  • 내게 남는건 슈퍼맨 뿐이다 잘생긴 슈퍼맨 완벽한 로맨티스트 슈퍼맨 별에서 온 슈퍼맨 굳이 의미를 더하자면 좋은 사람이랑 처음으로 같이 본 영화라는거 그럼에도 도저히 쉴드를 칠 수 없을 정도로 노잼이었단게 아쉬울 따름이다

우선 꼬꼬마 태거의 분석 결과를 보겠습니다. 전반적으로 분석 품질이 좋습니다. 다만 부사 ‘이다지’와 조사 ‘-도’의 결합을 지정사 ‘이-‘, 연결어미 ‘-다’, 명사 ‘지도’로 엉뚱하게 분석한 것이 걸리네요. 또한 명사 ‘로맨티스트’를 ‘로’, ‘맨’, ‘티’, ‘스트’로 쪼개어 결과를 낸 점도 아쉽습니다. 마지막으로 ‘우아함’을 ‘우아’, ‘하-‘, ‘-ㅁ’이 아니라 ‘우’, ‘아함’으로 분석한 부분도 문제삼을 만한 점입니다.

  • 영화/NNG, 가/JKC, 아니/VCN, 라/ECD, 영상/NNG, 으로/JKM, 예술/NNG, 을/JKO, 만들/VV, ㄴ/ETD, 작품/NNG, 이/VCP, 다/ECS, 지도/NNG, 소박/NNG, 하/XSV, ㄴ/ETD, 주제/NNG, 에/JKM, 숨/NNG, 이/JKS, 막히/VV, ㄹ/ETD, 듯/NNB, 한/MDN, 우/NNG, 아함/NNP, 이/VCP, 라니/EFQ
  • 옛날/NNG, sf/OL, 영화/NNG, 의/JKG, 장점/NNG, 이해/NNG, 하/XSV, 기/ETN, 쉽/VA, 고/ECE, 단순/NNG, 하/XSV, 며/ECE, 유쾌/XR, 하/XSA, 다/EFN
  • 내/VV, 게/ECD, 남/VV, 는/ETD, 것/NNB, 은/JKS, 슈퍼맨/NNG, 뿐/NNB, 이/VCP, 다/EFN, 잘생기/VV, ㄴ/ETD, 슈퍼맨/NNG, 완벽/NNG, 하/XSV, ㄴ/ETD, 로/NNG, 맨/NNG, 티/NNG, 스트/UN, 슈퍼맨/NNG, 별/NNG, 에서/JKM, 오/VV, ㄴ/ETD, 슈퍼맨/NNG, 굳이/MAG, 의미/NNG, 를/JKO, 더하/VV, 자면/ECE, 좋/VA, 은/ETD, 사람/NNG, 이랑/JC, 처음/NNG, 으로/JKM, 같이/MAG, 보/VV, ㄴ/ETD, 영화/NNG, 이/VCP, 라는/ETD, 거/NNB, 그러/VV, ㅁ에도/ECD, 도저히/MAG, 쉴드/UN, 를/JKO, 치/VV, ㄹ/ETD, 수/NNB, 없/VA, 을/ETD, 정도/NNG, 로/JKM, 노/NNG, 잼/NNG, 이/VCP, 었/EPT, 단/ETD, 것/NNB, 이/JKS, 아쉽/VA, ㄹ/ETD, 따름/NNB, 이/VCP, 다/EFN

아래는 코모란 태거의 분석 결과입니다. ‘이다지도’와 ‘우아함’을 잘 분석해냈습니다. 다만 ‘로맨티스트’ 분석은 정확하지 않습니다. 또한 ‘좋은 사람’을 한 단어로 분석한 점이 걸리네요.

  • 영화/NNG, 가/JKS, 아니/VCN, 라/EC, 영상/NNG, 으로/JKB, 예술/NNG, 을/JKO, 만들/VV, ㄴ/ETM, 작품/NNG, 이다지/MAG, 도/JX, 소박/XR, 하/XSA, ㄴ/ETM, 주제/NNG, 에/JKB, 숨/NNG, 이/JKS, 막히/VV, ㄹ/ETM, 듯/NNB, 한/MM, 우아/XR, 하/XSA, ㅁ/ETN, 이/VCP, 라니/EC
  • 옛날/NNG, sf/SL, 영화/NNG, 의/JKG, 장점/NNG, 이해/NNG, 하/XSV, 기/ETN, 쉽/VA, 고/EC, 단순/XR, 하/XSA, 며/EC, 유쾌/XR, 하/XSA, 다/EC
  • 내/VV, 게/EC, 남/VV, 는/ETM, 건/NNB, 슈퍼맨/NNP, 뿐/NNB, 이/VCP, 다/EC, 잘생기/VA, ㄴ/ETM, 슈퍼맨/NNP, 완벽/NNG, 하/XSV, ㄴ/ETM, 로/NNG, 맨/XPN, 티스/NNP, 트/VV, 슈퍼맨/NNP, 별/NNG, 에서/JKB, 오/VV, ㄴ/ETM, 슈퍼맨/NNP, 굳이/MAG, 의미/NNG, 를/JKO, 더하/VV, 자면/EC, 좋은 사람/NNP, 이랑/JC, 처음/NNG, 으로/JKB, 같이/MAG, 보/VV, ㄴ/ETM, 영화/NNG, 이/VCP, 라는/ETM, 거/NNB, 그렇/VA, ㅁ/ETN, 에/JKB, 도/JX, 도저히/MAG, 쉴드/NNP, 를/JKO, 치/VV, ㄹ/ETM, 수/NNB, 없/VA, 을/ETM, 정도/NNG, 로/JKB, 노/NNG, 재/VV, ㅁ/ETN, 이/VCP, 었/EP, 단/ETM, 게/EC, 아쉽/VA, ㄹ/ETM, 따름/NNB, 이/VCP, 다/EC

마지막으로 트위터 태거의 분석 결과입니다. 용언 분석에 일관성이 다소 부족한게 아쉽습니다. 예컨대 ‘아니-‘, ‘쉽-‘ ‘좋-‘의 경우 어간과 어미를 잘 분석한 걸 확인할 수 있습니다. 그러나 ‘만든’, ‘소박한’, ‘막힐’, ‘우아함’ 등은 어간과 어미가 결합된 채로 태깅이 됐네요. 뿐만 아니라 형용사 ‘유쾌하-‘의 경우 그 품사가 명사로 잘못 분석된 점 또한 볼 수 있습니다.

  • 영화/Noun, 가/Josa, 아니/Adjective, 라/Eomi, 영상/Noun, 으로/Josa, 예술/Noun, 을/Josa, 만든/Verb, 작품/Noun, 이다지/Noun, 도/Josa, 소박한/Adjective, 주제/Noun, 에/Josa, 숨/Noun, 이/Josa, 막힐/Verb, 듯/Noun, 한/Verb, 우아함/Adjective, 이라니/Eomi
  • 옛날/Noun, sf/Alpha, 영화/Noun, 의/Josa, 장점/Noun, 이해하기/Verb, 쉽/Verb, 고/Eomi, 단순하며/Adjective, 유쾌하/Noun, 다/Josa
  • 내게/Verb, 남는/Verb, 건/Eomi, 슈퍼맨/Noun, 뿐/Noun, 이다/Josa, 잘생긴/Adjective, 슈퍼맨/Noun, 완벽한/Adjective, 로맨/Noun, 티스/Noun, 트/Noun, 슈퍼맨/Noun, 별/Noun, 에서/Josa, 온/Noun, 슈퍼맨/Noun, 굳이/Noun, 의미/Noun, 를/Josa, 더하자/Verb, 면/Eomi, 좋/Adjective, 은/Eomi, 사람/Noun, 이랑/Josa, 처음/Noun, 으로/Josa, 같이/Josa, 본/Verb, 영화/Noun, 라는/Josa, 거/Noun, 그럼/Adjective, 에도/Eomi, 도저히/Noun, 쉴드/Noun, 를/Josa, 칠/Noun, 수/Noun, 없/Adjective, 을/Eomi, 정도/Noun, 로/Josa, 노잼/Noun, 이었/Verb, 단/Noun, 게/Josa, 아쉬/Adjective, 울/PreEomi, 따름/Noun, 이다/Josa

각 분석기가 리뷰 1만건을 분석하는 데 걸린 시간은 아래 표와 같습니다. (실험 환경 : Intel i5-4690, 32GB RAM, Nvidia GTX-1080, MS Windows 10)

구분 꼬꼬마 코모란 트위터
소요시간(초) 160.434 13.152 9.815

어떤 분석기를 써야할까?

말뭉치 종류나 상황에 따라 다른 분석기를 써야할 겁니다. 제 실험을 일반화해서 적용하기엔 무리가 있습니다. 다만 제 느낌상 아래와 같은 상황에 해당 분석기를 쓰면 좋을 것 같습니다.

  • 빠른 분석이 중요할 때 : 트위터
  • 정확한 품사 정보가 필요할 때 : 꼬꼬마
  • 정확성, 시간 모두 중요할 때 : 코모란

가장 좋은 방법은 보유하고 있는 말뭉치 일부를 테스트용으로 형태소 분석을 해보는 것입니다. 아래 예제코드가 있으니 참고하시기 바랍니다.

import time
from konlpy.tag import Kkma, Twitter, Komoran
pos_taggers = [('kkma', Kkma()), ('twitter', Twitter()), ('Komoran', Komoran())]
results = []
for name, tagger in pos_taggers:
    tokens = []
    process_time = time.time()
    for text in texts:
        tokens.append(tagger.pos(text))
    process_time = time.time() - process_time
    print('tagger name = %10s, %.3f secs' % (name, process_time))
    results.append(tokens)



Comments