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 함수 지정
- 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): 문서 d에 단어 t가 나타난 횟수, CountVector
- df(t): 전체 문서 중에서 단어 t를 포함하는 문서 수
- idf(t): df(t)의 역수를 바로 쓸 수도 있으나, log scale과 smoothing(+1) 적용한 공식
- nd: 전체 문서 수
IDF에 log를 쓰는 이유?
- log를 씌우지 않으면, 회귀 단어들에 엄청난 가중치가 부여될 수 있음
- log를 씌워서 이러한 격차를 줄임
log 안의 식에서 분모에 1을 더하는 이유?
- 특정 단어가 전체 문서에서 등장하지 않을 경우에 분모가 0이 되는 상황 방지
TfidVectorizer
- 텍스트로부터 바로 TF-IDF 행렬 생성
- 원본 문서인 두 번째 문서 잘 찾아냄
2. BOW
- 문서 분류
- 주어진 문서에 대해 미리 정의된 클래스로 분류
- 뉴스 기사를 정치, 경제, 연예, 스포츠 등 분야로 분류 가능
- 메일의 내용을 분석해 스팸 메일 여부 결정
2.1 Dataset
- Subset
- 지도 학습을 진행하기 위해 train과 test로 분류
- Remove
- headers, footers, quotes에 토픽의 이름이 쓰여 있어 힌트가 되는 경우가 있으므로 제거
- 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
- 지도 학습: 회귀, 분류
- 비지도 학습: 클러스터링, 차원 축소
문서 분류는 지도 학습(x: text, y: 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
- 특성의 수를 줄이는 방법 → feature selection
- L1 norm을 규제항으로 사용함으로써 0에 가까운 계수를 0으로 만들어 분류 영향을 거의 미치지 않는 단어 제거
- 남는 단어들로 분류의 이유에 대해 설명 가능
Overfitting이 줄지만 정확도도 줄어들 수 있음 → 다양한 시도를 통해 적절한 지점 찾기
- C: 정규화 정도
- C가 커질수록 정규화 정도 약해짐
- coef_: 카테고리별 특성 계수 확인
Ridge Regression
- 정규화를 이용해 각 특성에 대한 계수가 지나치게 커지는 것 방지
- 목적함수에 추정할 계수(parameter)에 대해 L2 norm(규제항)을 추가하여 모형의 과적합 방지
sklearn.linear_model.RidgeClassifier 패키지를 이용해 학습 후 평가
- alpha: 정규화 정도 조절
- alpha가 커질수록 정규화 비중이 커져 계수의 변화 더 많이 억제
- 너무 커질 경우 학습 자체가 잘 안 될 수 있기에 적잘한 alpha 값 찾는 것 중요
2.5 Decision Tree
- 결정 트리: DecisionTreeClassifier
- 랜덤 포레스트: RandomForestClssifier
- 그래디언트 부스팅: GradientBoostingClassifier
결정트리도 분류를 위한 머신러닝 알고리즘 중 하나로 문서 분류에도 사용해 볼 수 있다.