TF-IDF를 통해 sentence classification 해보기
/* 2017.7.7 by 3months.*/
TF-IDF 는 TF/DF 이며, TF(Term Frequency)와 DF(Document Frequency)는 아래와 같이 정의된다.
TF : 현재 문서에서 단어 A가 나타난 횟수
DF : 모든 문서에서 단어 A가 나타난 총 횟수
예를 들어 문서1에서 Mars라는 단어가 3회 나타났고, 모든 문서를 통틀어서 5번 나왔다고 하면
TF-IDF 값은 3/5 = 0.6이다.
문서1에서 Have라는 단어가 100회 나타났고, 모든 문서를 통틀어서는 100000번 나왔다고 하면
TF-IDF 값은 100/100000 = 0.001 이다.
이러한 방식으로 어떠한 단어에 대한 TF-IDF 값을 통해 문서를 feature화 할 수 있고, 이것은 특정 단어의 상대적인 빈도를 나타내주는 값이므로 합리적으로 그 문서를 나타낼 수 있는 feature가 된다.
TF-IDF 모델로 sentence classification
from sklearn.feature_extraction.text import TfidfVectorizer sentences = ['This is the first document.', 'This is the second document.', 'And the third one.', 'Is this the first document?'] vect = TfidfVectorizer() X = vect.fit_transform(sentences) X.todense()
위와 같이 4개의 문장이 있다고 해보자. 그러면 sklearn 라이브러리에서 제공하는 함수를 통해 이를 tfidf vector로 만들 수 있다. 각각의 sentence에 이것을 적용하면 결과 X는 매트릭스가 될 것이다.
y = [1,2,3,4]
위와같이 label을 임의로 정의해보자.
from sklearn.linear_model import SGDClassifier model = SGDClassifier(loss='logloss') model.fit(X, y)
tf-idf vectorization을 통해 sentence의 feature를 정의했으면 다시 sklearn의 라이브러리를 이용해 classifier를 만들고, 적합을 시키면된다. 여기서는 SGDClassifier (Stochastic Gradient Descent)라는 linear classifier를 사용하였는데, 아무 classifier나 사용해도된다. (ex LogisticRegression 등등)
X_pred = vect.transform(['My new document third'])
y_pred = model.predict(X_pred)
이제 테스트 데이터를 위와 같이 정의하고 구축한 모델로 예측해보자.
print y_pred
결과
[3]
구축한 모델은 해당 문장을 3번으로 분류했다. third라는 단어가 포함돼서 그런 것 같다. 만약 테스트 데이터에 second라는 단어나 first를 포함시켜보면 모델이 다른 label로 분류한다는 것을 확인할 수 있다.
'Data science' 카테고리의 다른 글
XGBoost 모델에서의 변수선택 (0) | 2017.09.03 |
---|---|
머신러닝 - 수식 없이 이해하는 Gaussian Mixture Model (GMM) (4) | 2017.08.04 |
머신러닝 - Recommendation System, Low Rank Matrix Factorization (0) | 2017.07.07 |
머신러닝 - Recommendation System, Collaborative Filtering 기초 (0) | 2017.07.05 |
머신러닝 - Recommendation System, Contents Base Recommendations (0) | 2017.07.05 |