[파이썬][scikit-learn] scikit-learn에서 NLP 알고리즘

자연어 처리(Natural Language Processing, NLP)는 인간의 언어와 관련된 컴퓨터 과학의 분야로, 텍스트 데이터를 이해, 분석, 처리하는 기술을 다룹니다. scikit-learn은 파이썬에서 자연어 처리 알고리즘을 개발하기 위한 강력한 라이브러리입니다. 이 블로그 포스트에서는 scikit-learn을 사용하여 NLP 알고리즘을 구현하는 방법에 대해 알아보겠습니다.

1. 텍스트 전처리 (Text Preprocessing)

텍스트 분석을 위해서는 먼저 텍스트 데이터를 사전에 처리해야 합니다. 이 과정은 주로 토큰화(tokenization), 정제(cleaning), 정규화(normalization) 등의 작업을 포함합니다. scikit-learn은 이러한 텍스트 전처리를 위해 다양한 도구를 제공합니다.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

# 텍스트 데이터
corpus = ["This is a sample sentence.",
          "Here is another example sentence.",
          "I love using scikit-learn for NLP!"]

# CountVectorizer를 사용하여 단어를 토큰화
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(corpus)

# 토큰화 된 단어들의 빈도수 계산
transformer = TfidfTransformer()
X = transformer.fit_transform(X)

print(X.toarray())

위의 예제에서는 CountVectorizer를 사용하여 문장을 단어로 토큰화하고, TfidfTransformer를 사용하여 단어의 빈도수를 계산합니다. 최종적으로, 텍스트 데이터는 희소 행렬로 표현됩니다.

2. 문서 분류 (Document Classification)

문장이나 문서를 분류하는 것은 NLP의 중요한 작업 중 하나입니다. scikit-learn은 다양한 분류 알고리즘을 제공하며, 이를 사용하여 문서 분류 작업을 수행할 수 있습니다.

from sklearn.datasets import fetch_20newsgroups
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn import metrics

# 뉴스그룹 데이터셋 로드
categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
data_train = fetch_20newsgroups(subset='train', categories=categories, shuffle=True, random_state=42)
data_test = fetch_20newsgroups(subset='test', categories=categories, shuffle=True, random_state=42)

# TfidfVectorizer를 사용하여 문서 벡터화
vectorizer = TfidfVectorizer()
X_train = vectorizer.fit_transform(data_train.data)
X_test = vectorizer.transform(data_test.data)

# 다항 분류법(Multinomial Naive Bayes)을 사용하여 문서 분류
clf = MultinomialNB()
clf.fit(X_train, data_train.target)
predicted = clf.predict(X_test)

# 정확도 평가
print("Accuracy:", metrics.accuracy_score(data_test.target, predicted))

위의 코드에서는 fetch_20newsgroups 함수를 사용하여 뉴스그룹 데이터셋을 로드하고, TfidfVectorizer를 사용하여 문서를 벡터화합니다. 그리고 MultinomialNB 분류기를 사용하여 문서를 분류하고, 정확도를 평가합니다.

3. 감성 분석 (Sentiment Analysis)

감성 분석은 텍스트의 감정이나 의견을 파악하는 작업입니다. scikit-learn은 감성 분석을 위한 다양한 알고리즘을 제공하며, 훈련 데이터를 사용하여 감정을 분류하고 예측하는 작업을 수행할 수 있습니다.

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.pipeline import Pipeline
from sklearn.svm import LinearSVC
from sklearn.datasets import load_files
from sklearn.model_selection import train_test_split
from sklearn import metrics

# 영화 리뷰 데이터셋 로드
reviews_train = load_files("movie_reviews/train/")
reviews_test = load_files("movie_reviews/test/")

# 텍스트 데이터와 레이블 분리
X_train, X_test = reviews_train.data, reviews_test.data
y_train, y_test = reviews_train.target, reviews_test.target

# Count Vectorizer와 SVM 분류기를 사용한 감성 분석 파이프라인 생성
pipeline = Pipeline([
    ('vect', CountVectorizer()),
    ('clf', LinearSVC()),
])

# 파이프라인을 사용하여 감성 분석 모델 학습
pipeline.fit(X_train, y_train)

# 테스트 데이터 예측
predicted = pipeline.predict(X_test)

# 정확도 평가
print("Accuracy:", metrics.accuracy_score(y_test, predicted))

위의 코드에서는 load_files 함수를 사용하여 영화 리뷰 데이터셋을 로드하고, CountVectorizer와 LinearSVC를 사용하여 감성 분석 분류기를 생성합니다. 그리고 파이프라인을 사용하여 모델을 학습시키고 테스트 데이터를 예측하여 정확도를 평가합니다.

scikit-learn은 다양한 NLP 알고리즘을 구현하고 사용자 친화적인 API를 제공하여 자연어 처리를 더욱 쉽고 효과적으로 수행할 수 있도록 도와줍니다. NLP 작업을 수행할 때는 scikit-learn을 적극적으로 활용해 보세요!