본문 바로가기
IT/Scraping

자연어 처리하기: NLTK

by Cyber_ 2025. 3. 7.

자연어 툴킷

자연어 툴킷 Natural Language Toolkit(NLTK)은 영어 텍스트의 부분 부분을 식별하고 태깅하도록 설계된 파이썬 라이브러리 모음입니다.

 

NLTK의 설치 가이드는 http://www.nltk.org/install.html 을 참고하시면 됩니다.

NLTK를 사용한 통계적 분석

NLTK는 텍스트에서 단어 숫자, 단어 빈도, 어휘 다양도 같은 통계적 정보를 생성할 때 아주 유용합니다. 필요한 것이 비교적 단순한 계산, 예를 들어 텍스트 섹션에서 고유한 단어 숫자를 세는 것 같은 것이라면 NLTK는 좀 과할수 있습니다.

 

NLTK 분석은 항상 Text 객체로 시작합니다. 다음과 같은 방법으로 단순한 파이썬 문자열을 Text 객체로 바꿀 수 있습니다.
word_tokenize 함수는 파이썬에서 문자열로 인식하는 텍스트는 무엇이든 받을 수 있습니다.

from nltk import word_tokenize
from nltk import Text

tokens = word_tokenize('Here is some not very interesting text')
text = Text(tokens)

 

NLTK에 내장된 몇 권의 책을 다음과 같이 임포트해서 사용해볼 수 있습니다.

from nltk.book import *

 

Text 객체는 일반적인 파이썬 배열과 거의 비슷하게 조작할 수 있습니다.

 

 

텍스트를 빈도분포 객체(frequency distribution)객체에 넘겨, 가장 많이 쓰인 단어는 무엇인지, 다양한 단어들의 빈도가 어느 정도인지 알 수 있습니다.

from nltk import FreqDist
fdist = FreqDist(text6) # nltk.book으로 가져온 text6, "몬티 파이튼과 성배"
fdist.most_common(10)
fdist['Grail']

 

nltk는 2-그램(바이그램), 3-그램(트라이그램) 을 만들고, 검색하고 목록으로 만들 수 있습니다.

from nltk import bigrams
bigrams = bigrams(text6)
bigramsDist = FreqDist(bigrams_
bigramsDist[('sir', 'Robin')]

 

ngrams 함수는 텍스트 객체를 분리해 두 번째 매개변수로 지정한 n-그램으로 나눕니다. 빈도분포와 텍스트 객체, n-그램은 모두 로프에서 사용할 수 있습니다.

from nltk import ngrmas
fourgrmas = ngrmas(text6,4)
fourgrmasDist = FreqDist(fourgrams)
fourgrmasDist[('father', 'smelt', 'of', 'elderberries')]

NLTK를 사용한 사전적 분석

NLTK는 문장을 분석하는 것 외에도 단어의 문맥과 내장된 방대한 사전으로 그 의미를 찾는 걸 도울 수 있습니다. 기본적인 수준에서, NLTK는 문장의 각 부분을 분석할 수 있습니다. 단, 펜 트리뱅크의 태그를 암기할 필요성이 있습니다. 텍스트의 태그를 붙일 때 등위 접속사를 나타내는 CC 처럼 쉽게 이해되는 것도 있지만, 불변화사를 나타내는 RP 처럼 혼란스러운 것도 있습니다.

from nltk.book import *
from nltk import word_tokenize
from nltk import pos_tag

text = word_tokenize('Strange women lying in ponds distributing swrods 'is no basis for a system of goverment.')
words = pos_tag(text)
print(words)

 

각 단어는 튜플(단어, 태그)로 나뉩니다.

NLTK는 영어의 문맥 자유 문법context-free grammer에 따라 문장의 각 부분을 판단합니다.

 

 

웹 스크레이핑을하다 보면 검색에 관련된 문제를 자주 겪게 됩니다. 예를 들어 어떠 사이트의 텍스트를 수집한 후 거기서 google이라는 단어를 찾되, 고유명사가 아니라 동사로 사용된 것만 찾고 싶을 때가 있을 겁니다. 아니면 반대로, 구글을 가리키는 단어만 찾고 있는데, 작성자가 대소문자를정확하게 쓰기만 바라기는 어려울 때도 있을 겁니다.이럴 때 pos_tag 함수가 대단히 유용합니다.

from nltk import word_tokenize, sent_tokenize, pos_tag
sentences = set_tokenize("Google is one of the best compaines in the world. Iconstantly google myself to see qht I'm up to.")
nouns = ['NN', 'NNS', 'NNP', 'NNPS']

for sentence in sentences:
    if "google" in sentence.lower():
        taggedWords = pos_tag(word_tokenize(sentence))

        for word in taggedWords:
            if word[0].lower() == "google" and word[1] nouns:
                print(sentence)