NLP

[NLP#1] 자연어 처리란? - thesaurus

j.d 2023. 5. 12. 13:07

NLP 포스팅에서는 자연어 처리의 정의와 방법에 대해 알아보도록 하겠습니다. 

 

다음 글까지는 신경망에 대한 지식은 필요 없지만  이후 글의 주제인 추론 기반 방법으로 넘어가게 되면 딥러닝의 개념이 적용되게 됩니다.

 

따라서 해당 지식을 학습하시고 오면 이해하시는데 큰 도움이 될 것입니다.

※ 딥러닝도 추후 다루도록 하겠습니다.

 


NLP란?

NLP란 Natural Language Processing의 약자로 직역하면 '자연어 처리'를 의미합니다.

자연어(natural language)는 한국어와 영어 등 우리가 평소에 쓰는 말을 뜻합니다.

 

따라서 NLP의 목표는 컴퓨터가 사람의 말을 이해할 수 있도록 가공하는 것입니다.

 

왜 자연어라고 말하는 걸까요?

 

우리가 사용하는 말은 시간, 장소, 주변 사람 등 많은 조건들에 의해서 변형되거나 유연하게 바뀌게 됩니다.

하지만 프로그래밍 언어는 그렇지 않죠. 정해진 문법에 맞추어 입력해줘야 합니다. 토씨 하나라도 틀리면 바로 오류가 발생하는 특성 때문에 '딱딱한 언어'라고 부르고 있습니다. 

그렇기 때문에 이러한 '부드러움'을 컴퓨터에게 이해시키기란 어려운 도전입니다. 

하지만 지금은 많은 연구자 분들이 개발하신 기술로 인해 일상에서 널리 사용되고 있습니다.

 

현재 가장 Hot한 언어 모델인 'chat-GPT'가 있습니다. 또한 금융 어플 등에서 볼 수 있는 ai 챗봇들도 NLP를 포함하고 있습니다.

 

자연어를 컴퓨터에게 이해시키기 위해서는 '단어의 의미'를 정확하게 전달하는 것이 매우 중요합니다.

이를 위한 방법에는 크게 아래와 같은 방법들이 있습니다.

  • thesaurus를 활용한 방법
  • 통계 기반 기법
  • 추론 기반 기법

thesaurus

단어의 의미를 나타낼 수 있는 가장 첫 번째 방법은 수작업으로 정의하는 것을 생각할 수 있습니다.

단어 간 관계가 어떻게 생성되어 있는지를 알려준다면 컴퓨터도 의미를 파악할 수 있을 수 도 있습니다.

 

이렇듯 thesaurus란 유의어 사전으로 동의어나 유의어가 한 그룹으로 분류되어 있습니다.

 

또한 상위와 하위, 전체와 부분 등 다양한 관계까지 정의해둔 경우도 있습니다.

 

자연어 처리 분야에서 가장 유명한 thesauruss은 WordNet입니다. 

WordNet은 프리스턴 대학교에서 1985년부터 구축하기 시작한 전통 있는 thesaurus로 지금까지 다양한 NLP 분야에 활용되고 있습니다. 

 

하지만 thesaurus는 다음과 같은 문제점을 가지고 있습니다.

  • 시간의 변화에 대응하기 힘들다
  • 인건비가 많이 든다
  • 단어 간 미묘한 차이를 표현할 수 없다

 

따라서 이후에는 수작업으로 단어 간의 관계를 정의하는 것이 아니라 자동으로 추출하거나 학습할 수 있는 기술을 개발하게 됩니다. 이를 위해 이후 포스팅 내용들인 '통계 기반 기법'과 '추론 기반 기법'들이 등장하게 됩니다. 

 


이제 가장 유명한 thesaurus인 WordNet을 Python을 통해 이용해보도록 하겠습니다.

 

WordNet은 nltk패키지를 통해 사용할 수 있습니다.

※코랩을 가정하고 코드를 작성하도록 하겠습니다.

!pip install nltk
import nltk
nltk.download('wordnet')
from nltk.corpus import wordnet

간단하게 pen를 검색해보도록 하겠습니다.

wordnet.synsets("pen")

현재 WordNet에는 pen을 크게 6가지의 뜻으로 정의하고 있습니다. (정확하게는 6개의 동의어 집합이라고 할 수 있습니다.)

예를 들어 pen.n.01은 pen이라는 명사의 첫번째 의미(그룹)을 나타냅니다.

 

pen.n.01를 의미하는 뜻을 확인해보겠습니다.

※ 연구자가 확인하기 위한 정의일뿐 컴퓨터가 이해하는데는 사용되지 않습니다.

pen = wordnet.synset("pen.n.01")
pen.definition()

또한 해당 그룹을 이루는 동의어를 살펴볼 수 있습니다.

pen.lemma_names()
pen2 = wordnet.synset('pen.n.02')
pen2.lemma_names()

result of pen1, pen2

원래 여러가지 동의어들이 나오는데 지금 pen1, pen2에는 'pen'으로만 이루어져있고 정의만 다르게 분류된 것 같습니다.

 

그리고 네트워크를 형성하기 위해 상하 관계를 살펴보겠습니다.

 

pen.hypernym_paths()[0]

결과를 보면 아래와 같은 경로로 pen이 형성되는 것을 알 수 있습니다. 

이를 통해 WordNet의 네트워크는 위로 갈수록 추상적이고, 아래로 갈수록 구체적이 되도록 단어들을 배치했습니다.

 

마지막으로 단어 간 유사도를 확인해보겠습니다.(간단하게 pencil과 car로 비교하겠습니다.)

car = wordnet.synset("car.n.01")
pencil = wordnet.synset("pencil.n.01")

pen.path_similarity(car)
pen.path_similarity(pencil)

유사도를 확인했을 때, pencil이 car보다 3배 정도 유사하다는 것을 알 수 있었습니다. 

 


이번 시간에는 NLP의 정의와 단어를 이해시키기 위한 가장 초기 방법인 thesaurus에 대해 알아보았고, 마지막으로 코드 구현을 통해 현재 가장 유명한 thesaurus인 WordNet을 이용해보았습니다. 

 

다음시간부터는 수작업이 아닌 자동으로 의미를 추출시키는 방법을 알아보록 하겠습니다.

 

포스팅 내용중  다른 생각이 있는 분 혹은 수정해야할 부분이 있으시면 댓글을 통해 그 의견을 나눠보면 너무 좋을 것 같습니다.

 

 본 포스팅의 내용은 밑바닥부터 시작하는 딥러닝2를 참고하였습니다.

'NLP' 카테고리의 다른 글

[LLM#1] What? How? 트랜스포머(Transformer)  (6) 2024.11.15
[NLP#5] LSTM  (0) 2023.07.02
[NLP#4] 순환 신경망(RNN)  (0) 2023.06.28
[NLP#3] 추론 기반(word2vec)  (0) 2023.05.17
[NLP#2] 통계 기반  (0) 2023.05.15