본문 바로가기

공부노트

12/19, 열아홉 번째 날의 TIL(NLP)

NLP 교재를 e-book으로 읽어보고 있는데, 매주 4개의 챕터씩 읽고 노션에 정리를 하는 중이다. 반복해서 읽고 검색하다 보니 거의 이해를 할 수 있었고, 어떤 내용이 중요한지 어떤 문제가 있는지도 알게 되어 좋았다.


1. NLP

  • 자연어(Natural language) : 우리가 일상에서 사용하는 언어
  • 자연어 처리(Natural language processing) : 자연어의 의미를 분석하여 컴퓨터가 처리할 수 있도록 하는 일
  • 사용분야 : 음성 인식, 내용 요약, 번역, 사용자의 감성 분석, 텍스트 분류 작업, 챗봇 등
  • 구체적 예시 : 구글 어시스턴트, 파파고, Grammarly(영어 문법 수정), Otter.ai(회의 내용 요약) 등

오늘날 자연어는 다양한 분야에서 사용되고 있고, 이는 우리 생활 속에서 많은 편의를 제공한다. 파파고나 구글 어시스턴트 등을 사용한 경험이 있을텐데 이는 모두 자연어 처리를 기반으로 한 것이다.

자연어 처리를 위해서 텐서플로우, 케라스, Gensim, 사이킷런 등을 사용할 수 있는데 한국어에 대해서 자연어 처리 시스템을 사용하고 싶다면 NLKT나 KoNLPy등을 사용하는 것이 좋다.

 

한국어는 영어와 다르게 교착어(조사, 어미 등을 붙여서 말을 만드는 언어) 이기 때문에, 전처리 방식이나 단어의 의미가 영어와 많이 다르기 때문이다. 또, 한국어는 어순에 크게 영향을 받지 않는 점도 크다.

나는 저녁에 밥을 먹었다. 밥을 나는 저녁에 먹었다. 저녁에 나는 밥을 먹었다. 어순이 달라져도 의미는 다 동일하기 때문에 이런 점에서 한국어는 자연어 처리를 하기가 어렵다.

 

텍스트 전처리라는 것은 풀고자 하는 문제의 용도에 맞게 텍스트를 사전에 처리하는 작업인데, 데이터 전처리와 마찬가지로 전처리를 제대로 하지 않으면 뒤의 처리 기법들이 제대로 동작하지 않거나 성능이 많이 저하될 수 있다.

 

주어진 코퍼스(언어 데이터)을 토큰이라 불리는 단위로 나누는 작업을 토큰화(Tokenizer)라고 하는데, 토큰은 의미 있는 단위가 될 수 있으며 단어, 형태소, 문자, 문장, 서브워드 등이 될 수 있다.

ex) 나는, 밥을 먹었다, 먹, 었다, 그리고 산책을 했다, un, beliv, able 등등

 

토큰의 기준이 단어인 경우를 단어 토큰화라고 하며 구두점이나 띄어쓰기를 기준으로 잘라내는 경우도 있다. 하지만 이렇게 단순한 기준으로 토큰화를 진행할 경우에는 의미를 잃어버리는 경우가 있을 수 있다.(1998.09)나, (P.h.D) 같은 경우

그리고 한글의 경우 띄어쓰기가 없는 문장이나 한 단어가 나눠져 있는 경우도 있으므로 띄어쓰기로 단어 토큰의 구분이 어렵다.

 

토큰화 경우 고려해야 할 사항으로는, 위와 같이 구두점이나 특수 문자를 단순 제외해서는 안되고 줄임말과 단어 내에 띄어쓰기가 있는 경우가 있다. New York, rock 'n' roll 등 이 그 예시이다.

 

문장을 단위로 토큰화 할 경우에는 ?, ! 로 구분하면 특정 경우에 문장의 끝이 아닐 수 있기 때문에 사용하는 코퍼스의 언어, 특수문자 사용 용도에 따라 규칙을 정의해서 사용해야 하며, nltk.tokenize - sent_tokenize가 문장 구분을 잘 하고 한국어의 경우 KSS가 있다.

 

데이터를 정제하는 것은 갖고 있는 코퍼스로부터 노이즈데이터를 제거하는 것인데, 이는 토큰화 전, 후에도 계속 이루어지며 그 중간에서 합의점을 찾기도 한다. 규칙에 기반한 표기가 다른 단어들을 통합하기도 하고(USA, US), 대, 소문자를 통합하기도 한다. 하지만 이 경우 회사 이름, 사람 이름 등은 대문자 유지를 해야 하며 다른 고려사항들도 많으나 코퍼스 내의 단어들을 바꾸는게 실용적인 경우가 많다.

불필요한 단어의 제거도 정제의 한 종류인데, 등장 빈도가 매우 적거나 길이가 짧은 단어는 크게 의미가 없기 때문이다. 영어의 경우 평균 단어 길이가 6~7, 한국어의 경우 2~3이므로 영어의 경우에는 짧은 단어 제거가 효과적이다.


e-book을 정리하면서 NLP에 대한 내용들을 계속 정리중인데, 이는 어디에서나 사용중이므로 필수 지식이라서 꼼꼼하게 기록하고 알아두려고 한다. 오늘 튜터님께 논문과 코드가 함께 있는 사이트도 추천받았는데, 이해를 다 하진 못해도 LLM 관련 글을 찾아서 볼 예정이다. 내일도 화이팅