본문 바로가기

텍스트 마이닝

BOW 기반의 문서 분류 (6)

반응형

5.7 카운트 기반의 문제점과 N-gram을 이용한 보완

5.7.1 통계로는 알 수 없는 문맥 정보

  • BOW는 단어들이 쓰여진 순서에 따른 문맥 정보를 이용할 수 없음
  • BOW는 단어들의 순서를 무시하고, 단어가 사용된 횟수를 기반으로 문서에 대한 벡터 만듬

5.7.2 N-gram의 이해

  • N-gram: n개의 연속적인 단어들의 나열
  • 하나의 토큰이 두개 이상의 단어로 구성될 수 있음

5.7.3 N-gram을 이용한 문서 분류

from nltk.corpus import stopwords
from sklearn.feature_extraction.text import TfidfVectorizer
from nltk.corpus import stopwords

cachedStopWords = stopwords.words("english")
tfidf = TfidfVectorizer(token_pattern= "[a-zA-Z']{3,}", # 토큰화를 위한 정규식
                        decode_error ='ignore',
                        lowercase=True,
                        stop_words = stopwords.words('english'),
                        max_df=0.5,
                        min_df=2)
X_train_tfidf = tfidf.fit_transform(X_train)
X_test_tfidf = tfidf.transform(X_test)

print(X_train_tfidf.shape)

## (2034, 11483)
from sklearn.linear_model import RidgeClassifier
ridge_clf = RidgeClassifier() #릿지 분류기 선언
ridge_clf.fit(X_train_tfidf, y_train) #학습
print('Train set score: {:.3f}'.format(ridge_clf.score(X_train_tfidf, y_train)))
print('Test set score: {:.3f}'.format(ridge_clf.score(X_test_tfidf, y_test)))

"""
Train set score: 0.976
Test set score: 0.765
"""
tfidf = TfidfVectorizer(token_pattern= "[a-zA-Z']{3,}",
                        decode_error ='ignore',
                        lowercase=True,
                        stop_words = stopwords.words('english'),
                        ngram_range=(1, 2), # 바이그램 설정
                        max_df=0.5,
                        min_df=2)
X_train_tfidf = tfidf.fit_transform(X_train)
X_test_tfidf = tfidf.transform(X_test)

print(X_train_tfidf.shape)

## (2034, 26550)
bigram_features = [f for f in tfidf.get_feature_names_out() if len(f.split()) > 1]
print('bi-gram samples:', bigram_features[:10])

ridge_clf.fit(X_train_tfidf, y_train) #학습
print('Train set score: {:.3f}'.format(ridge_clf.score(X_train_tfidf, y_train)))
print('Test set score: {:.3f}'.format(ridge_clf.score(X_test_tfidf, y_test)))

"""
bi-gram samples: ["'cause can't", "'em better", "'expected errors'", "'karla' next", "'nodis' password", "'official doctrine", "'ok see", "'sci astro'", "'what's moonbase", 'aas american']
Train set score: 0.976
Test set score: 0.773
"""
tfidf = TfidfVectorizer(token_pattern= "[a-zA-Z']{3,}",
                        decode_error ='ignore',
                        lowercase=True,
                        stop_words = stopwords.words('english'),
                        ngram_range=(1, 3),
                        max_df=0.5,
                        min_df=2)
X_train_tfidf = tfidf.fit_transform(X_train)
X_test_tfidf = tfidf.transform(X_test)
print(X_train_tfidf.shape)

trigram_features = [f for f in tfidf.get_feature_names_out() if len(f.split()) > 2]
print('tri-gram samples:', trigram_features[:10])

ridge_clf.fit(X_train_tfidf, y_train) #학습
print('Train set score: {:.3f}'.format(ridge_clf.score(X_train_tfidf, y_train)))
print('Test set score: {:.3f}'.format(ridge_clf.score(X_test_tfidf, y_test)))

"""
(2034, 32943)
tri-gram samples: ["'em better shots", "'expected errors' basically", "'karla' next one", "'nodis' password also", "'official doctrine think", "'ok see warning", "'what's moonbase good", 'aas american astronautical', 'ability means infallible', 'able accept donations']
Train set score: 0.976
Test set score: 0.775
"""

 

 

 

 

 

※ 해당 내용은 <파이썬 텍스트 마이닝 완벽 가이드>의 내용을 토대로 학습하며 정리한 내용입니다.

반응형

'텍스트 마이닝' 카테고리의 다른 글

BOW 기반의 문서 분류 (8)  (0) 2023.07.07
BOW 기반의 문서 분류 (7)  (0) 2023.07.06
BOW 기반의 문서 분류 (5)  (0) 2023.07.04
BOW 기반의 문서 분류 (4)  (0) 2023.07.03
BOW 기반의 문서 분류 (3)  (0) 2023.07.02