컴퓨터는 데이터를 숫자로 인식한다.
따라서 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의 단점
– 어떤 단어가 더 중요하고 그렇게 중요하지 않은지를 구별하는 것은 어렵습니다.
– corpus가 많이 나온 단어를 통계적으로 가장 중요하다고 판단할 것이다.
– 단어들 사이의 언어적 유사성을 인식하기 어렵다.
TF-IDF
TF-IDF는 Term Frequency – Inverse Document Frequency의 약자로, 단어의 빈도뿐만 아니라 통계적으로 단어가 얼마나 의미가 있는지를 나타낼 수 있다.
예를 들어, 문서에 ‘NLP’나 ‘CV’와 같은 경우에는 많이 나오지 않을 수 있습니다.
그러나 is와 같은 단어는 빈도가 높고 수많은 문서에도 포함된다.
이러한 중요도가 낮은 단어는 삭제하고 실제로 의미있는 값을 찾는 방법입니다.
즉, TF-IDF는 모든 문서에서 자주 등장하는 단어는 중요도가 낮다고 판단하고 특정 문서에서만 자주 등장하는 단어는 중요도가 높다고 판단합니다.
수식 소리 다음과 같습니다.
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/