NLP Count Vectorizer, TF-IDF Vectorizer란?

  • by

컴퓨터는 데이터를 숫자로 인식한다.

따라서 NLP 모델에서는 단어를 숫자화해야 합니다.

이때 사용하는 방법으로 Count Vectorizer와 TF-IDF Vectorizer를 사용하는 방법이 있다.

이 두 가지 방법을 살펴보고 각각의 장점과 단점을 살펴 보겠습니다.

Count Vectorizer

ex). Text1과 Text2를 NLP와 CV로 분류하였다.

이때 영단어를 수치화시켜야 한다.

Text1 = “Natural Language Processing is a subfield of AI”
tag1 = "NLP"

Text2 = “Computer Vision is a subfield of AI”
tag2 = "CV"

대응하는 Text1과 Text2를 Count Vectorizer를 진행하면 다음과 같이 된다.


Count Vectorizer 결과

Count Vectorizer 장점

– 단어의 빈도에 따라 어떤 단어가 중요한지 알 수 있습니다.

Count Vectorizer의 단점

– 어떤 단어가 더 중요하고 그렇게 중요하지 않은지를 구별하는 것은 어렵습니다.

– corpus가 많이 나온 단어를 통계적으로 가장 중요하다고 판단할 것이다.

– 단어들 사이의 언어적 유사성을 인식하기 어렵다.

TF-IDF

TF-IDF는 Term Frequency – Inverse Document Frequency의 약자로, 단어의 빈도뿐만 아니라 통계적으로 단어가 얼마나 의미가 있는지를 나타낼 수 있다.

예를 들어, 문서에 ‘NLP’나 ‘CV’와 같은 경우에는 많이 나오지 않을 수 있습니다.

그러나 is와 같은 단어는 빈도가 높고 수많은 문서에도 포함된다.

이러한 중요도가 낮은 단어는 삭제하고 실제로 의미있는 값을 찾는 방법입니다.

즉, TF-IDF는 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하고 특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 판단합니다.

수식 소리
다음과 같습니다.


idf = ln((1+N)/(1+df))+1

TF-IDF 값이 낮으면 중요도가 낮고, TF-IDF 값이 클 경우 중요도가 크다.

예를 들어 보겠습니다.


이때 번역 문서의 빈도는 다음과 같습니다.

로그를 취할 때 마치 기존의 값에 곱해 값의 사이즈를 조정하는 정수로서 기능합니다.

다양한 프로그래밍 언어로 패키지에서 지원하는 TF-IDF 로그는 거의 자연 로그를 사용합니다.


IDF는 여러 문서에 등장한 단어의 가중치를 낮추는 역할을 합니다.

tf-idf를 구해 보면, 구한 idf에 tf를 각각 곱합니다.

이때 문서 3의 바나나만 2이므로 2×0.287682를 하여 0.575364의 값을 얻게 됩니다.

문서 3에서 바나나는 두 번 나와 조금 더 중요하다고 판단했기 때문입니다.


Counter Vectorizer에서 들었던 예로 진행을 시도하면

Text1 = “Natural Language Processing is a subfield of AI”
tag1 = "NLP"

Text2 = “Computer Vision is a subfield of AI”
tag2 = "CV"


from sklearn.feature_extraction.text import TfidfVectorizer as tf_idf
import pandas as pd
tfidf = tf_idf(norm = None)
tfidf.fit((Text1, Text2))
x= tfidf.transform((Text1)).toarray()
y= tfidf.transform((Text2)).toarray()
columns = tfidf.get_feature_names()
df1 = pd.DataFrame(x, columns= columns, index= ("Text1"))
df2 = pd.DataFrame(y, columns= columns, index= ("Text2"))
df = pd.concat((df1,df2))
df("tag") = ("NLP", "CV")
df


다음과 같은 결과가 나옵니다.

이와 같이 구한 값으로 각 단어를 피처로 판단하여 분류 모델을 개발하면 된다

두 가지 예를 들었지만 Text1과 Text2의 경우 idf를 계산할 때 N에 1을 추가했습니다.

그러나 바나나를 사용한 예에서는 사용하지 않았습니다.

나도 신경이 쓰여 추가적으로 조사한 결과, 스무딩을 위해서 1을 더해 준다고 합니다.

모든 값에 더해 주므로 크게 문제는 없는 것 같지만. 정확하다고는 보기 어려운 것 같습니다.

왜냐하면 이 경우 노이즈가 발생할 가능성이 있기 때문입니다.

Counter Vectorizer의 단점

– 언어적 의미와 유사성을 알기가 어렵습니다.

NLP 모델을 학습하려면 단어 간의 관계를 알아야 합니다.

두 방법 모두 단어 간의 관계를 가르치지 않습니다.

따라서 word2 vec과 Glove의 두 가지 방법으로 word-embedding을 진행합니다.

참고 URL: https://iamgeekydude.com/2022/12/16/count-vectorizer-vs-tfidf-vectorizer-sklearn-nlp/

Count Vectorizer vs TFIDF Vectorizer (sklearn) – NLP – 기키 듀드

Difference between Count Vectorizer and TFIDF is that in-spite of both being frequency based TFIDF also looks at identifying important words.

iamgeekydude.com

https://wikidocs.net/31698

04-04 TF-IDF(Term Frequency-Inverse Document Frequency)

이번에는 DTM 내의 각 단어의 중요도를 계산할 수 있는 TF-IDF의 가중치에 대해 설명합니다.

TF-IDF를 사용하면 기존 DTM을 사용하는 것보다 많습니다 …

wikidocs.net