챗봇 프로젝트를 하던 중,
챗봇 학습은 한국어만 가능했다.
이 때 한국어를 학습하기 위해서도 형태소 분석기를 사용해야하는데
기존 형태소 분석기는 mecab을 활용하고 있었다.
그러나 이 평화롭던 챗봇나라에..
외국어를 학습해야한다는 말이 들어오는데 ...
챗봇을 글로벌화하기 위해
영어부터 시작해서 추후에 중국어, 일본어까지
더 똑똑한 챗봇으로 키우고자 했다.
근데 그럼 그냥 쓰던 mecab으로 영어도 시키고~ 중국어도 시키면 되는 거 아냐?
안
된
다.
간단하게 형태소 분석기가 뭐냐면!
단어를 보고 형태소 단위로 분리해내는 소프트웨어.
자연어 처리의 가장 기초적인 절차로
구문 분석이나 의미 분석으로 나아가기 위해 가장 먼저 이루어져야 하는 과정
이다.
아버지(명사) 가(조사) 방(명사) 에(조사) 들어가(동사) 신다(조사)
형태소 분석기를 써서 이렇게 형태소 단위로 분리해내고
머신러닝을 돌려야하는 것!
그래서 챗봇과 같은 자연어처리가 필수적인 프로젝트에서는
형태소 분석기를 사용하곤 하는데 그 종류가 다양하다
그렇다면 어떤 상황에 어떤 형태소 분석기를 써야할까?
나의 경우에는 다국어기능을 개발하기 위함이므로,
한국어와 영어 동시에 형태소 분석이 가능한 형태소 분석기를 위주로 찾았다.
내가 찾아본 형태소 분석기는 크게 3개가 있었다.
그래서 이렇게 조사를 해보니 NLTK가 설치도 쉽고, 영어에 최적화 되어있으니까
NLTK를 선택해볼까? 라고 생각했다.
근데 NLTK가 영어밖에 지원을 안 하니까
문장을 한국어인지 영어인지 판별하고 -> 한국어라면? mecab / 영어라면? NTLK
라고 고민을 해봤다.
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 쉽게 설치할 수 있었고
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을 같이 사용하는게 과연 효율적일까?
당연히 아니다.
그럼 어떤걸 쓰는게 좋을까 찾다가
새롭게 찾은 형태소 분석기가 구세주 spaCy였다.
NLTK:
spaCy:
뭐야 spaCy를 안 쓸 이유가 없잖아?!
심지어 영어까지 다 쉽게 구현할 수 있다고?!
$ pip install spacy
$ python3 -m spacy download en_core_web_sm // 영어 작은 모델 설치
$ python3 -m spacy download ko_core_news_sm // 한국어 작은 모델 설치
로 간단하게 설치 가능하다!
자 나는 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라는 라이브러리!
$ pip install 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를 사용해보았고
이와 관련된 개발 세미나도 사내에서 진행했다.
처음엔 nltk에 푹 빠져있었으나
벗어나보니 spacy에 빠져있던 나..
그럼 길고 긴 고민 끝에
오늘도 성장 완료 ~!