[python] NLTK를 사용해 문서의 토픽을 추론하는 방법은 무엇인가요?

NLTK(Natural Language Toolkit)는 Python에서 자연어 처리를 위한 라이브러리입니다. NLTK를 사용하면 문서의 텍스트를 토큰화하고, 단어의 빈도를 계산하고, 문서의 유사도를 측정하고, 문서의 토픽을 추론하는 등 다양한 자연어 처리 작업을 수행할 수 있습니다. 이 중에서 문서의 토픽을 추론하는 방법에 대해서 알아보겠습니다.

모델링 방법에는 여러 가지가 있지만, 대표적인 방법 중 하나는 Latent Dirichlet Allocation(LDA)입니다. LDA는 문서 집합에서 숨겨진 토픽을 추론하는 확률적 생성 모델 중 하나로, 각 문서에서 단어의 분포를 통해 문서가 어떤 토픽과 관련이 있는지를 추론합니다.

먼저, NLTK를 설치하고 필요한 모듈을 임포트합니다.

pip install nltk
import nltk
nltk.download('stopwords')
nltk.download('punkt')

다음으로, 문서 집합을 불러옵니다. 여기서는 단순히 텍스트 문서의 리스트로 가정하겠습니다.

documents = [
    '첫 번째 문서입니다.',
    '두 번째 문서는 좀 더 길고 복잡합니다.',
    '세 번째 문서는 첫 번째와 비슷하지만 다른 토픽을 가지고 있습니다.',
    '네 번째 문서는 첫 번째와 두 번째의 토픽을 혼합하고 있습니다.'
]

NLTK의 텍스트 전처리 기능을 사용해 문서를 토큰화하고 정제합니다. 이 단계에서는 단어 토큰화, 불용어 제거, 형태소 분석 등이 포함될 수 있습니다.

from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize

# 불용어 제거를 위한 영어 불용어 목록 다운로드
nltk.download('stopwords')

stopwords = set(stopwords.words('english'))

# 텍스트 전처리 함수
def preprocess_text(text):
    # 문서를 소문자로 변환
    text = text.lower()
    # 단어 토큰화
    tokens = word_tokenize(text)
    # 불용어 제거
    tokens = [token for token in tokens if token not in stopwords]
    # 형태소 분석 등 추가 전처리 작업 가능
    return tokens

# 전처리된 문서 리스트
preprocessed_documents = [preprocess_text(doc) for doc in documents]

이제 LDA 모델을 만들고 문서 집합에서 토픽을 추론할 수 있습니다.

from gensim import corpora
from gensim.models import LdaModel

# 단어 사전 생성
dictionary = corpora.Dictionary(preprocessed_documents)

# 문서-단어 행렬 생성
corpus = [dictionary.doc2bow(doc) for doc in preprocessed_documents]

# LDA 모델 학습
lda_model = LdaModel(corpus=corpus, id2word=dictionary, num_topics=2)

# 문서에서 토픽 추론
for index, doc in enumerate(corpus):
    topic_weights = lda_model[doc]
    print(f"문서 {index+1}의 토픽 추론 결과: ", topic_weights)

위의 코드에서는 2개의 토픽으로 LDA 모델을 학습하고, 각 문서에 대한 토픽 추론 결과를 출력하고 있습니다.

LDA를 사용해 문서의 토픽을 추론하는 방법에 대해 알아봤습니다. NLTK와 Gensim 라이브러리를 활용하면 쉽게 토픽 모델링을 할 수 있습니다. 보다 정확한 토픽 추론을 위해 더 많은 문서와 더 복잡한 전처리 과정을 적용할 수도 있습니다.

참고 자료: