[파이썬] 텍스트 분류를 위한 클래스 간 상관관계 고려

텍스트 분류는 자연어 처리 및 기계 학습 분야에서 많이 사용되는 작업입니다. 이 작업을 수행하기 위해서는 클래스 간 상관관계를 고려해야 합니다. 즉, 어떤 단어나 문장이 특정 클래스와 관련이 있는지를 파악하는 것이 중요합니다.

Python은 클래스 간 상관관계를 고려하여 텍스트 분류를 할 수 있는 다양한 라이브러리와 알고리즘을 제공합니다. 이 글에서는 몇 가지 예를 들어 설명하겠습니다.

1. 나이브 베이즈 분류기(Naive Bayes Classifier)

나이브 베이즈 분류기는 간단하고 빠른 속도로 텍스트 분류를 수행할 수 있는 알고리즘입니다. 이 분류기는 베이즈 정리를 기반으로 하며, 문서 내의 단어들이 서로 독립적이라고 가정합니다(따라서 “나이브”라고 불립니다).

from sklearn.naive_bayes import MultinomialNB
from sklearn.feature_extraction.text import CountVectorizer

# 학습 데이터 준비
X_train = ["I like to watch movies", "I prefer reading books"]
y_train = ["movie", "book"]

# 텍스트를 벡터로 변환
vectorizer = CountVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)

# 나이브 베이즈 분류기 학습
nb_classifier = MultinomialNB()
nb_classifier.fit(X_train_vectorized, y_train)

# 예측하기
X_test = ["I enjoy watching movies"]
X_test_vectorized = vectorizer.transform(X_test)
y_pred = nb_classifier.predict(X_test_vectorized)

2. 서포트 벡터 머신(Support Vector Machine)

서포트 벡터 머신은 기본적으로 이진 분류를 위한 알고리즘입니다. 다만, 텍스트 분류에서는 다중 클래스 분류를 위해 확장하여 사용할 수 있습니다. 서포트 벡터 머신은 클래스 간의 경계를 찾아내는 분류기로, 각 클래스 간의 상관관계를 고려하여 분류 결과를 도출합니다.

from sklearn.svm import SVC
from sklearn.feature_extraction.text import TfidfVectorizer

# 학습 데이터 준비
X_train = ["I like to watch movies", "I prefer reading books"]
y_train = ["movie", "book"]

# 텍스트를 벡터로 변환
vectorizer = TfidfVectorizer()
X_train_vectorized = vectorizer.fit_transform(X_train)

# 서포트 벡터 머신 학습
svm_classifier = SVC()
svm_classifier.fit(X_train_vectorized, y_train)

# 예측하기
X_test = ["I enjoy watching movies"]
X_test_vectorized = vectorizer.transform(X_test)
y_pred = svm_classifier.predict(X_test_vectorized)

위의 코드에서는 문장을 TF-IDF 벡터로 변환하는 TfidfVectorizer를 사용했습니다. 이는 단어의 중요도를 고려하여 벡터를 생성하기 때문에 정확한 분류를 도와줍니다.

3. 딥러닝을 이용한 분류 모델

딥러닝은 텍스트 분류 작업에서 우수한 성능을 보여주는 방법 중 하나입니다. 특히 순환 신경망(RNN)이나 변형된 버전인 LSTM(Long Short-Term Memory)을 사용하면, 문장 내의 단어들 간의 상관관계를 보다 잘 반영할 수 있습니다.

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, LSTM, Dense

# 학습 데이터 준비
X_train = ["I like to watch movies", "I prefer reading books"]
y_train = ["movie", "book"]

# 텍스트를 시퀀스 데이터로 변환
tokenizer = tf.keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(X_train)
X_train_sequences = tokenizer.texts_to_sequences(X_train)

# 시퀀스 데이터를 패딩하여 동일한 길이로 맞춤
X_train_padded = tf.keras.preprocessing.sequence.pad_sequences(X_train_sequences)

# 딥러닝 모델 생성
model = Sequential()
model.add(Embedding(len(tokenizer.word_index), 128, input_length=X_train_padded.shape[1]))
model.add(LSTM(64))
model.add(Dense(1, activation="sigmoid"))

# 모델 학습
model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(X_train_padded, y_train, epochs=10)

# 예측하기
X_test = ["I enjoy watching movies"]
X_test_sequences = tokenizer.texts_to_sequences(X_test)
X_test_padded = tf.keras.preprocessing.sequence.pad_sequences(X_test_sequences, maxlen=X_train_padded.shape[1])
y_pred = model.predict_classes(X_test_padded)

위의 코드는 LSTM을 사용한 딥러닝 분류 모델로, 텍스트 문장을 시퀀스 데이터로 변환하고 패딩하여 동일한 길이로 맞춘 뒤 학습하는 과정을 보여줍니다. 결과로는 각 클래스에 대한 예측 확률을 출력합니다.

이렇게 클래스 간 상관관계를 고려하여 텍스트 분류를 수행할 수 있습니다. 여러분은 위의 예제 코드를 참고하여 자신만의 텍스트 분류 모델을 구축해보세요!