오늘의 고민: 어떤 형태소 분석기를 사용할까?

lionloopy·2025년 1월 14일
0

오늘의 고민

목록 보기
5/6
post-thumbnail

상황

챗봇 프로젝트를 하던 중,
챗봇 학습은 한국어만 가능했다.
이 때 한국어를 학습하기 위해서도 형태소 분석기를 사용해야하는데
기존 형태소 분석기는 mecab을 활용하고 있었다.

그러나 이 평화롭던 챗봇나라에..
외국어를 학습해야한다는 말이 들어오는데 ...

챗봇을 글로벌화하기 위해
영어부터 시작해서 추후에 중국어, 일본어까지
더 똑똑한 챗봇으로 키우고자 했다.

근데 그럼 그냥 쓰던 mecab으로 영어도 시키고~ 중국어도 시키면 되는 거 아냐?



.

일단 형태소 분석기가 뭡니까..

간단하게 형태소 분석기가 뭐냐면!

단어를 보고 형태소 단위로 분리해내는 소프트웨어.
자연어 처리의 가장 기초적인 절차로
구문 분석이나 의미 분석으로 나아가기 위해 가장 먼저 이루어져야 하는 과정

이다.

아버지(명사) 가(조사) 방(명사) 에(조사) 들어가(동사) 신다(조사)

형태소 분석기를 써서 이렇게 형태소 단위로 분리해내고
머신러닝을 돌려야하는 것!

그래서 챗봇과 같은 자연어처리가 필수적인 프로젝트에서는
형태소 분석기를 사용하곤 하는데 그 종류가 다양하다

어떤 형태소 분석기를 써야할까?

그렇다면 어떤 상황에 어떤 형태소 분석기를 써야할까?

나의 경우에는 다국어기능을 개발하기 위함이므로,
한국어와 영어 동시에 형태소 분석이 가능한 형태소 분석기를 위주로 찾았다.

내가 찾아본 형태소 분석기는 크게 3개가 있었다.

KoNLPy

  • python에서 한국어 자연어처리를 하고, 여러 형태소 분석기를 지원하며, mecab은 KoNLpy가 지원하는 형태소 분석기 중 하나이다.

Mecab

  • 일본어 형태소 분석기로 개발되었고, 일본어뿐만 아니라 문법 체계가 비슷한 한국어용으로 확장되어 자연어 처리 발전에 크게 기여했다.
  • 그러나 설치과정이 굉장히 번거롭다..

NLTK

  • python에서 가장 널리 사용되는 자연어처리 라이브러리이다.
  • 그러나 영어 텍스트 처리에 최적화 되어있어 한국어 처리는 어렵다..

1차 고민

그래서 이렇게 조사를 해보니 NLTK가 설치도 쉽고, 영어에 최적화 되어있으니까
NLTK를 선택해볼까? 라고 생각했다.

근데 NLTK가 영어밖에 지원을 안 하니까
문장을 한국어인지 영어인지 판별하고 -> 한국어라면? mecab / 영어라면? NTLK
라고 고민을 해봤다.

NLTK 설치

1. 도커 컨테이너 접속
2. 컨테이너 bash 쉘에서 nltk 설치
$ pip install nltk
3. 설치 확인
$ pip show nltk
4. python 명령어로 쉘에 접속 후 필요한 nltk data 다운로드
$ import nltk
$ nltk.download('popular') // 많이 쓰는 데이터 다운로드
$ nltk.download('punkt') // 토큰화에 필요한 데이터 다운로드
5. 다운로드 확인

이렇게 nltk 쉽게 설치할 수 있었고

NLTK 활용

import nltk
from nltk.tokenize import workd_tokenize
from nltk.tag import pos_tag  

#nltk.download('punkt') #문장 토큰화 도구
#nltk.download('averaged_perceptron_tagger')  # 자연어 처리 모듈
text= "The best and most beautiful things in the world cannot be seen or even touched"

#토큰화
tokens = word_tokenize(text)

#품사 태깅
tagged = pos_tag(tokens)

#명사만 추출
nouns = [word for word, pos in tagged if pos.startswith('N')] 

활용도 쉽게 할 수 있었다.

그러나, nltk와 mecab을 같이 사용하는게 과연 효율적일까?
당연히 아니다.

2차 고민

그럼 어떤걸 쓰는게 좋을까 찾다가
새롭게 찾은 형태소 분석기가 구세주 spaCy였다.

spaCy vs NLTK

  • spaCy는 python에서 잘 사용되는 자연어 처리 라이브러리 중 하나

NLTK:

  • 9개의 라이브러리를 지원하며, 커스터마이징이 쉽다.
  • 문자열을 처리하고 문자열을 리턴해준다.
  • 단어 토큰화가 빠르고 태깅이 빠르다.

spaCy:

  • 가장 성능이 좋은 단 하나의 라이브러리만 구현되어 있다. -> 오히려 편함!
  • 문자열을 처리하고 객체를 리턴해준다 -> 오히려 좋음!
  • 전반적으로 단어 토큰화, 태깅이 빠르다.

뭐야 spaCy를 안 쓸 이유가 없잖아?!
심지어 영어까지 다 쉽게 구현할 수 있다고?!

spaCy설치

$ pip install spacy
$ python3 -m spacy download en_core_web_sm // 영어 작은 모델 설치
$ python3 -m spacy download ko_core_news_sm // 한국어 작은 모델 설치

로 간단하게 설치 가능하다!

3차 고민

자 나는 spacy를 쓰기로 결정했어
근데 영어인지 한국어인지 판별은 누가할래?

정규식을 써보자

  • 정규식을 써서 자체적으로 영어인지 한국어인지 구별하게 되면
    앞글자 기준으로 인식해서 영어와 한국어가 합쳐져있는 문장은 제대로 구분을 할 수 없다.
import re
def make_answer(self):
 	# 생략
    reg = re.compile(r'[a-zA-Z]')
    if reg.match(self.msg)
    	logger.info('영어일 때')
    else:
    	logger.info('한국어일 때')

라이브러리를 써보자

최대한 가볍게하기 위해 덜어내고자 했는데
정규식보다는 가벼운 라이브러리를 사용하는것이 낫겠다 싶었다.

그래서 찾은것이 langdetect라는 라이브러리!

langdetect 설치

$ pip install langdetect

로 아주 쉽게 설치가 가능하다!

langdetect 활용

from langdetect import detect
# 영어, 한국어 각각 형태소 분석기 load
nlp_en = spacy.load("en_core_web_sm")
nlp_ko = spacy.blank("ko")

try:
	lang = detect(msg)
except Exception as e:
	# 언어 감지 실패 시 기본 언어로 한국어 설정
	lang = 'ko' 
    
    if lang =='ko':
    	doc = nlp_ko(msg)
    elif lang =='en':
    	doc = nlp)en(msg)
    else:
    	doc = nlp_ko(msg)

고민끝

이렇게 형태소분석기를 상황에 맞게 선별해서 고르고
성능 테스트까지 마쳤다.

기존 mecab과 spacy 각각
똑같은 문장 1000여개를 파이썬으로 작성한 스크립트를 돌려 테스트하고
성능을 분석한 결과

(빠른순)

  • 형태소 분석 속도: mecab > spacy
  • 학습 시간 속도: spacy > mecab
  • 학습 정확도 순: mecab > spacy
  • 메세지별 평균 응답속도 빠른 순: spcay > mecab

으로 나타났다.



기존에 사용하던 mecab과 크게 성능 차이가 없었고
영어까지 지원해야하니 spacy를 사용하도록 선택했다.

마치며

길고 긴 고민끝에 spacy를 사용해보았고
이와 관련된 개발 세미나도 사내에서 진행했다.

처음엔 nltk에 푹 빠져있었으나
벗어나보니 spacy에 빠져있던 나..

그럼 길고 긴 고민 끝에
오늘도 성장 완료 ~!

profile
기록은 담백하게, 성장은 빠르게! 🐘

0개의 댓글