SpaCy를 활용한 텍스트 분류(Classification) 작업

SpaCy는 강력한 NLP (자연어 처리) 라이브러리로, 텍스트 분석 작업을 쉽게 처리할 수 있도록 도와줍니다. 특히 SpaCy는 텍스트 분류 작업에 매우 유용한 기능을 제공합니다. 이번 글에서는 SpaCy를 사용하여 텍스트 분류 작업을 어떻게 수행하는지 살펴보겠습니다.

문제 정의

텍스트 분류는 주어진 텍스트를 사전에 정의된 범주 또는 클래스에 할당하는 작업입니다. 예를 들어, 스팸 메일 필터링, 감성 분석, 토픽 분류 등이 텍스트 분류의 예입니다. 이번 예제에서는 영화 리뷰를 긍정과 부정 두 가지 클래스로 분류하는 작업을 수행해보겠습니다.

데이터 수집

영화 리뷰 데이터를 수집해야 합니다. 이를 위해 Kaggle과 같은 온라인 데이터셋에서 영화 리뷰 데이터셋을 다운로드하거나 직접 크롤링할 수 있습니다. 데이터셋을 열어보면 텍스트와 해당 리뷰의 클래스(긍정 또는 부정)가 포함되어 있어야 합니다.

데이터 전처리

다운로드 또는 수집한 데이터를 열어서 필요한 전처리를 수행합니다. 이 단계에서는 리뷰 텍스트를 토큰화하고, 불필요한 문자를 제거하고, 불용어를 처리하는 등의 작업을 수행합니다. SpaCy는 텍스트 전처리를 위한 다양한 기능을 제공합니다. 예를 들어, nlp.tokenizer를 사용하여 텍스트를 토큰화하고, is_stop 속성을 사용하여 불용어를 제거할 수 있습니다.

import spacy

nlp = spacy.load("en_core_web_sm")

text = "This is an example sentence."
tokens = nlp(text)

for token in tokens:
    if not token.is_stop:
        print(token.text)

모델 학습

전처리가 완료된 데이터로부터 모델을 학습합니다. SpaCy는 텍스트 분류를 위해 CNN (컨볼루션 신경망) 기반의 모델을 제공합니다. 모델 학습에는 토큰화된 텍스트와 해당 리뷰의 클래스를 입력으로 사용합니다.

import spacy
import random
from spacy.util import minibatch, compounding

nlp = spacy.load("en_core_web_sm")

# 데이터셋 로드
train_data = [("This movie is great.", {"cats": {"POSITIVE": 1, "NEGATIVE": 0}}),
              ("The acting was terrible.", {"cats": {"POSITIVE": 0, "NEGATIVE": 1}}),
              # ... 추가적인 데이터
             ]

# 훈련을 위한 설정
n_iter = 20
dropout = 0.2
batch_size = 8

# 텍스트 분류 파이프라인 생성
textcat = nlp.create_pipe("textcat", config={"exclusive_classes": True})
nlp.add_pipe(textcat)

# 클래스 등록
textcat.add_label("POSITIVE")
textcat.add_label("NEGATIVE")

# 훈련
optimizer = nlp.begin_training()
for _ in range(n_iter):
    random.shuffle(train_data)
    losses = {}
    batches = minibatch(train_data, size=batch_size)
    for batch in batches:
        texts, labels = zip(*batch)
        nlp.update(texts, labels, sgd=optimizer, drop=dropout, losses=losses)
    print("Losses:", losses)

모델 평가

학습된 모델을 사용하여 새로운 텍스트를 분류합니다. 분류 결과를 평가하여 모델의 성능을 확인합니다.

test_data = [("This movie was excellent.", {"cats": {"POSITIVE": 1, "NEGATIVE": 0}}),
             ("I didn't like it at all.", {"cats": {"POSITIVE": 0, "NEGATIVE": 1}}),
             # ... 추가적인 데이터
            ]

correct = 0
total = 0
for text, label in test_data:
    doc = nlp(text)
    predicted_label = max(doc.cats, key=doc.cats.get)
    if predicted_label == label:
        correct += 1
    total += 1

accuracy = correct / total
print("Accuracy:", accuracy)

결론

이제 SpaCy를 사용하여 텍스트 분류 작업을 수행하는 방법을 알게 되었습니다. SpaCy의 강력한 기능과 편리한 API를 활용하면 텍스트 분류 작업을 간단하게 처리할 수 있습니다. 추가적으로 전처리나 하이퍼파라미터 조정 등을 통해 성능을 더욱 향상시킬 수 있습니다.

#NLP #텍스트분석