반응형

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로 분류한다는 것을 확인할 수 있다.


반응형
반응형