새로운 포스팅 카테고리를 추가했다. 주제는 NLP(Natural Language Processing)이라고 불리는 '자연어 처리'이다. 자연어 처리는 텍스트 분류, 감성분석, 텍스트 요약, 텍스트 군집화 또는 유사도 측정과 같이 여러가지 분야에서 널리 사용되고 있다. 필자는 자연어 처리에 대한 기본적인 사전 지식이 없었기 때문에 개인적인 기회를 통해서 공부해야 했다.
그리고 우연히 마주했던 Google Assistant NLP팀의 언어학자로 일하시는 박지호님의 NLP Tutorial을 통해서 자연어처리를 입문했다. 해당 블로그를 꾸준히 구독하고 있고 글을 읽으면서 습득한 내용을 따로 기록하고 있다. 추후에 자연어처리의 기본에 대한 내용을 꼭 내 블로그에도 포스팅할 예정이다.
이번 글에서는 텍스트 형식의 비정형 데이터가 어떤 프로세스를 거쳐서 머신러닝 모델에 input으로 들어가는지 개괄적인 내용을 다루어보려고 한다.
우선 현실세계에서 주어지는 텍스트 데이터셋들은 아주아주 너무나도 지저분한 상태로 제공된다. 여기서 지저분한 상태라함은 HTML 태그가 텍스트 주변에 붙어있다던가 의미없는 특수문자, 숫자 등 여러가지 성가시게(?)하는 것들일 짜잘짜잘 붙어있는 것을 의미한다. 따라서 수치 데이터에서 데이터 클렌징을 하는 것처럼 텍스트 데이터에도 클렌징 과정을 거쳐 데이터셋을 보기좋게 정제하는 것이 가장 먼저해야 할 일이다.
텍스트 데이터를 깨끗히 해주는 클렌징 과정을 거친 후엔 무엇을 해야할까? 아마도 수치 데이터처럼 이상치를 제거하거나 하진 않을 것이다. 다음 단계는 텍스트 데이터를 정규화시켜주는 것인데, 텍스트를 정규화시키는 과정으로는 크게 토큰화, 필터링, 불용어 제거, 오타 수정, 그리고 어근(단어의 원형)추출 정도가 되겠다. 각 단계별로 간단히 하나씩 살펴보자.
- 토큰화(Tokenization) : 문서를 문장 단위로, 문장을 단어 단위로 쪼개는 것을 말한다. 주로 사용되는 방법으로 N-gram 방법이 있는데 N-gram에 대한 개념은 여기를 참고하자.
- 필터링, 불용어 제거, 철자 수정 : 말 그대로 불필요한 단어 즉, 텍스트로부터 주요한 정보를 얻는 것에 영향을 미치지 않는 단어들을 제거한다. 영어의 불용어에 대한 예시로는 'he', 'is', 'will' 등이 되겠다.
- 어근 추출 : Stemming이라고도 한다. 또 다른 방법으로는 Lemmatization 방법도 존재하는데, 이 두개 중 Lemmatization이 더욱 더 정교한 방법이다. 정교하다란, 예를 들어, classifies 라는 단어의 어근을 추출할 때 Stemming은 단순히 어미를 제거해 classif 라고 어근을 추출하지만 Lemmatization은 classify로 제대로 어근을 추출한다.(물론 classifies를 실제로 수행해본 것은 아니니 Lemmatization이 더욱 더 정교한 방법이라는 주장에 힘을 실어줄 가상의 예시일 뿐이다.)
이제 텍스트 데이터들을 보기 좋게 만들었다. 불필요한 단어들도 제거를 했다. 그렇다면 이제 머신러닝 모델에 input 으로 집어넣기만 하면 될 것 같다! 하지만 문제가 생겼다. 예전에도 말했다시피 머신러닝 모델은 컴퓨터에서 동작하고 컴퓨터는 곧 숫자형태의 데이터 밖에 인지를 못한다. 그렇다면 어떻게 텍스트 데이터를 숫자형태로 바꾸어서 머신러닝 모델이 알아듣도록 변형해줄까?
이런 과정에서 생겨난 개념이 Bag-of-Word(BOW), Tf-idf 등 이다. 이에 대해 자세한 설명은 여기를 참고하자. 그래서 텍스트를 숫자로 변형해주는 과정을 Feature Vecorizer(피처 벡터화)라고 한다. 피처 즉, 텍스트를 벡터화시키는 과정에서 크게 두 가지 방법이 존재한다. 단순히 여러개의 문서에 발생하는 단어의 빈도수에 기반한 CountVectorizer 방법, 이에 반해 "여러개의 문서 모두 다 많이 등장하는 단어는 정보를 추출하는 데에 별로 영향을 주지 않을거야"라는 사고에 기반한 Tf-idf(Term frequency - Inverse document frequency) Vectorizer 방법이 있다.
이제 텍스트를 피처 벡터화시켜서 컴퓨터가 알아들을 수 있는 방법으로 표현했다. 이제 머신러닝 모델의 input 데이터로 집어넣기 위해 적절한 모델을 설정해주고 학습/검증/테스트 데이터를 분할해 하이퍼라미터 튜닝을 하고 모델 성능을 평가하는 과정을 거치면 된다.
이렇게 자연어 처리에 대한 개괄적인 내용에 대해 알아보았다. 다음 포스팅 부터는 본격적으로 텍스트 분류, 감성분석 등 텍스트를 활용 분야에 대한 실습을 해보는 컨텐츠를 업로드 하려 한다.
'Data Science > 추천시스템과 NLP' 카테고리의 다른 글
[NLP] Collaborative Filtering(Recommendation) (0) | 2020.08.26 |
---|---|
[NLP] Contents-based Recommendation(컨텐츠 기반 추천) (3) | 2020.08.26 |
[NLP] 문서 군집화(Clustering)와 문서간 유사도(Similarity) 측정하기 (0) | 2020.08.20 |
[NLP] LDA를 활용한 Topic Modeling 구현하기 (0) | 2020.08.18 |
[NLP] 텍스트 분류와 감성(Sentiment)분석 구현하기 (5) | 2020.08.17 |