3. CountVector

Eunji·2025년 12월 11일

1. Count

1.1 Generate CountVector

  • 영어와 동일하게 CountVectorizer의 자체 토크나이저 사용
  • 의미적으로 같은 단어 취급 필요
    • E.g., 'cg', 'cg가', 'cg는'
    • E.g., '감동', '감동과', '감동도'
  • 영어를 대상으로 하는 기본 토크나이저는 적합하지 않으므로 KoNLPy 사용
  • 형태소 분석을 하더라도 전체 형태소를 사용하는 경우 필요 없는 단어들도 보임

품사 태깅 결과를 통해 josa나 Punctuation은 뺌

1. Tokenizer function

  • CountVectorizer는 tokenizer를 함수 형태로 지정 가능
  • Tokenizer 매개변수에 my_tokenizer 함수 지정

2. fit_transform()

  • CountVectorizer에서 tokenizer로 매번 my_tokenizer를 호출하므로 영어와 달리 시간 약간 소요
  • 위에서 의미적으로 묶어야 하는 '감동'의 문제는 해결
  • 전체 데이터셋으로 feature 뽑아내기

3. Sparsity

  • 희소 행렬에서 값이 있는 비율은 0.75%밖에 안 됨
  • NLTK의 영화 리뷰에 비해 훨씬 적은 값
    • NLTK의 리뷰는 비교적 길고 사용된 단어가 많은 반면 다음 영화의 리뷰는 짧은 것이 대부분
  • max_features: 빈도수 지정
  • 영어와의 차이점은 한글에 대한 countvector 생성은 형태소 분석기를 tokenizer로 지정해준다는 것 외에 큰 차이 없음

1.2 CountVector

  • 문서로부터 특성을 추출하는 하나의 방법
  • 추출한 벡터는 ML 기법을 적용하기 위한 입력으로 사용되어 문서 분류 등 다양한 분야에 활용
  • 그 이전에 문서 간의 유사도를 측정하는 데에도 사용됨
    • 주어진 문서와 가장 유사한 문서를 말뭉치에서 검색하는 데에 사용

Cosine Similarity

  • 두 벡터가 이루는 각도의 코사인 값
  • 두 개의 벡터가 있을 때 벡터의 방향성만 비교하는 방법
    • 단어별 빈도는 최솟값이 0이므로 각 벡터는 1사분면에만 존재
    • 두 벡터 간 각도 차이가 90도를 넘어가지 않는다는 것을 의미
      • 가장 가까우면(0도) - 1
      • 가장 멀면(90도) - 0

CountVector가 필요하므로 새로 만든 문서에 대해서 CountVector로 변환하고 cosine_similarity를 적용해 유사도 계산

1.3 TF-IDF

  • CountVector에서 빈도는 일종의 가중치
    • 빈도가 높을수록 중요한 단어로 취급
  • 모든 문서에 다 들어있는 단어는 별로 중요하지 않다.

Term Frequency - Inverse Cocument Frquency

  • 단어 빈도 - 역문서 빈도
  • 단어의 빈도에 그 단어가 출현한 문서의 역수를 곱하는 방법
    • 단어의 빈도를 그 단어가 나타난 문서의 수로 나눠준 것
    • 단어가 나타난 문서의 수가 많을수록 이 값은 작아짐
  • df(d,t)df(d, t): 문서 d에 단어 t가 나타난 횟수, CountVector
  • df(t)df(t): 전체 문서 중에서 단어 t를 포함하는 문서 수
  • idf(t)idf(t): df(t)df(t)의 역수를 바로 쓸 수도 있으나, log scale과 smoothing(+1) 적용한 공식
  • ndn_d: 전체 문서 수

IDF에 log를 쓰는 이유?

  • log를 씌우지 않으면, 회귀 단어들에 엄청난 가중치가 부여될 수 있음
  • log를 씌워서 이러한 격차를 줄임

log 안의 식에서 분모에 1을 더하는 이유?

  • 특정 단어가 전체 문서에서 등장하지 않을 경우에 분모가 0이 되는 상황 방지

TfidVectorizer

  • 텍스트로부터 바로 TF-IDF 행렬 생성
  • 원본 문서인 두 번째 문서 잘 찾아냄

2. BOW

  • 문서 분류
    • 주어진 문서에 대해 미리 정의된 클래스로 분류
      • 뉴스 기사를 정치, 경제, 연예, 스포츠 등 분야로 분류 가능
      • 메일의 내용을 분석해 스팸 메일 여부 결정

2.1 Dataset

  • Subset
    • 지도 학습을 진행하기 위해 train과 test로 분류
  • Remove
    • headers, footers, quotes에 토픽의 이름이 쓰여 있어 힌트가 되는 경우가 있으므로 제거
  • .data
    • 문서의 본문
  • .target
    • 레이블(토픽)

2.2 Feature Extraction

  • newsgroups_train, newsgroups_test
    • .data와 .target을 이용해 X_train, X_test와 Y_train, Y_test 추출
  • max_features는 2000개로 제한
  • min_df는 minimum document frequency로 단어가 최소 해당 개수만큼 문서에 등장해야 함을 의미
  • max_df는 많은 문서에서 공통으로 나타나는 단어를 제외하기 위해 사용
    • 0.5: 문서의 50%를 초과해 나타나는 단어 제외

CountVector를 이용한 특성 추출

CountVectorizer 기능

  • 어떤 단어들이 얼마나 등장하는지 확인
    • 의미 없어 보이는 숫자, 정규화되지 않은 결과가 포함되어 있을 수 있음

2.3 Naive Bayes Classifier

  • 지도 학습: 회귀, 분류
  • 비지도 학습: 클러스터링, 차원 축소

문서 분류는 지도 학습(xx: text, yy: category) 중 하나로, 나이브 베이즈, 로지스틱 회귀분석, 릿지 회귀분석, 라쏘 회귀분석 등을 사용할 수 있다.

  • scikit learn은 sklearn.naive_bayes에서 나이브 베이즈를 위한 클래스 제공
    • 그 중 MultinomialNB를 이용해 뉴스그룹기사 분류
    • MultinomialNB: 이산적인 특성 값들을 분류할 때 사용
      • 이산적: 연속적인 값이 아닌 값으로 CountVector도 해당
  • fit(): 주어진 특성 데이터와 레이블을 이용해 학습
    • X_train_cv: CountVector로 추출된 특성
    • y_train: 해당 문서에 대한 분류
  • score(): 정확도 반환
  • predict()
    • 주어진 텍스트에 대해 분류를 예측하고 싶은 경우
    • 실제 카테고리를 알고 싶다면 newsgroups_train.target_names 이용
  • predict_proba()
    • 예측 확률을 보고싶은 경우

2.4 Logistic Regression

  • Regression
    • 종속 변수와 독립 변수 간의 관계를 구체적인 함수로 나타내어 향후 예측 모델에 사용
  • Logistic Regression
    • 회귀 분석에 기반한 분류 알고리즘
    • 예측 값이 연속적인 값이 아니고 class에 해당할 때 사용
  • scikit learn에서 LogisticRegression class 제공
    • 객체 선언
    • fit(): 학습
    • score(): 정확도 확인
    • predict(): 예측
    • coef_로 내부 값 확인

Train set score vs. Test set score

  • 추정해야 할 계수가 vector의 크기만큼 존재하므로 과적합이 발생하기 쉽고 많은 데이터셋 필요

Lasso Regression

  • 특성의 수를 줄이는 방법 \rightarrow feature selection
  • L1 norm을 규제항으로 사용함으로써 0에 가까운 계수를 0으로 만들어 분류 영향을 거의 미치지 않는 단어 제거
  • 남는 단어들로 분류의 이유에 대해 설명 가능

Overfitting이 줄지만 정확도도 줄어들 수 있음 \rightarrow 다양한 시도를 통해 적절한 지점 찾기

  • C: 정규화 정도
  • C가 커질수록 정규화 정도 약해짐
  • coef_: 카테고리별 특성 계수 확인

Ridge Regression

  • 정규화를 이용해 각 특성에 대한 계수가 지나치게 커지는 것 방지
  • 목적함수에 추정할 계수(parameter)에 대해 L2 norm(규제항)을 추가하여 모형의 과적합 방지

sklearn.linear_model.RidgeClassifier 패키지를 이용해 학습 후 평가

  • alpha: 정규화 정도 조절
  • alpha가 커질수록 정규화 비중이 커져 계수의 변화 더 많이 억제
    • 너무 커질 경우 학습 자체가 잘 안 될 수 있기에 적잘한 alpha 값 찾는 것 중요

2.5 Decision Tree

  • 결정 트리: DecisionTreeClassifier
  • 랜덤 포레스트: RandomForestClssifier
  • 그래디언트 부스팅: GradientBoostingClassifier

결정트리도 분류를 위한 머신러닝 알고리즘 중 하나로 문서 분류에도 사용해 볼 수 있다.

profile
갓생호소인

0개의 댓글