인공지능(AI)/자연어처리(NLP)

[NLTK] 자연어 처리를 위한 패키지

계속지나가기 2023. 10. 24. 13:59
반응형

자연어처리(NLP, Natural Language Processing)를 위해서는 각 테스크에 맞는 전처리(preprocessing)과정이 필수적으로 필요합니다. 본 게시글에서는 전처리를 위한 패키지인 NLTK를 간단한 예제와 함께 알아보도록 하겠습니다.

 

 

NLTK에서는 다양한 기능을 제공하지만, 본 글에서는 아래의 기능 위주로 다룹니다 

  • Searching Text
  • Word Statistics

 

Searching Text


NLTK에서 제공하는 텍스트 예제로 진행하기 위해,  book을 불러오도록 하겠습니다.

import nltk
from nltk.book import *

NLTK에서 book을 불러올 경우 아래의 9개의 책의 텍스트를 불러올 수 있습니다.

text1에 저장된 Moby-Dick으로 nltk를 적용해봅시다

 

1. concordance

언어학에서 concordance란 일반적으로 그 단어가 사용된 환경(문단)에 대한 인용이라는 뜻을 가집니다. 이 뜻과 비슷하게 NLTK에서 제공하는 concordance기능을 사용하면 text에 있는 특정 단어가 어떤 문맥에서 몇번 사용되었는지 쉽게 확인할 수 있습니다.

text1.concordance("sad")
text1.concordance("happy")

각각에 대한 결과는 아래와 같습니다.

2. dispersion_plot

전체 텍스트에 나타나는 특정 단어의 빈도를 시각화하고 싶다면 dispersion_plot을 사용하면 됩니다. y축은 text1의 문장 길이, x 축은 지정한 단어로,  그래프에 나타난 stripe는 n번째 문장에 지정 단어가 등장한다라고 해석 가능합니다.

text1.dispersion_plot(["sad", "happy"])

 

좀 더 자주 등장하는 단어로 찍어보게되면 아래와 같이 빽빽한 stripe 그래프가 나타납니다.

text1.dispersion_plot(["he", "she", "they", "I"])

 

Word Statistics


1. FreqDist()

FreqDist() 기능을 사용하면 text가 가지고 있는 단어 관련 통계를 더 쉽게 확인할 수 있습니다.

fdist1 = FreqDist(text1)

fdist1.most_common(50) 
fdist1['whale']
fdist1.plot(50, cumulative=True)
  • FreqDist.most_common(N) :  가장 높은 빈도수의 N개의 단어를 확인할 수 있습니다.
  • FreqDist[WORD] : WORD의 빈도수를 확인할 수 있습니다.
  • FreqDist.plot(N, cumulative=True): 가장 높은 빈도수의 N개의 단어의 누적빈도수 분포를 시각화할 수 있습니다.

추가로, 특정 길이 이상의 단어 중 특정 빈도 수 이상의 단어를 보고 싶다면 아래와 같이 사용하시면 됩니다. 예시는 길이가 12 글자 이상 단어 중 text에 15번 이상 등장한 단어를 알파벳 순으로 정렬한 결과입니다. 문장에 자주 사용되는 접속부사 등이 결과로 나온 것을 확인할 수 있습니다.

fdist1 = FreqDist(text1)
words = sorted(w for w in set(text1) if len(w) >= 12 and fdist1[w] >= 15)

2. collocation & n-grams

언어학에서 collocation이란 궁합이 잘 맞아 같이 붙어다니는 단어나 말들을 뜻하는데, 이 뜻과 비슷하게 NLTK에서 제공하는 collocation을 사용하면 특정 단어와 자주 쓰이는 단어 조합을 확인할 수 있습니다.

 

text1에서 자주 같이 등장하는 단어 예시를 collocations() 함수로 확인할 수 있는데, 예시에서는 "White Whale", "Father Mapple"과 같은 고유명사가 자주 같이 사용되는 것을 확인할 수 있습니다. 기본적으로 nltk에서 제공하는 collcation은 bigram으로 제공됩니다.

text1.collocations()

 

 

반응형