반응형
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 |