Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[14주차] Sejong AI Challenge 문제2 #13

Open
mingxoxo opened this issue Mar 19, 2021 · 1 comment
Open

[14주차] Sejong AI Challenge 문제2 #13

mingxoxo opened this issue Mar 19, 2021 · 1 comment
Assignees

Comments

@mingxoxo
Copy link
Member

https://www.kaggle.com/c/sejong-ai-challenge-p2/overview

@mingxoxo mingxoxo self-assigned this Mar 19, 2021
@mingxoxo
Copy link
Member Author

출처 : https://bkshin.tistory.com/129

CountVectorizer

단어 feature에 값을 부여할 때, 각 문서에서 해당 단어가 나타나는 횟수, 즉 Count를 부여하는 경우 카운트 벡터화라고 한다. 값이 높을수록 중요한 단어로 인식한다.

from sklearn.feature_extraction.text import CountVectorizer
corpus = ['you know I want your love. because I love you.']
vector = CountVectorizer()
print(vector.fit_transform(corpus).toarray()) # 코퍼스로부터 각 단어의 빈도 수를 기록한다.
print(vector.vocabulary_) # 각 단어의 인덱스가 어떻게 부여되었는지를 보여준다.

출력 결과

[[1 1 2 1 2 1]]
{'you': 4, 'know': 1, 'want': 3, 'your': 5, 'love': 2, 'because': 0}

you와 want가 2번씩 있으므로 중요한 단어로 인식한다.
CountVectorizer는 기본적으로 2자리 이상의 문자에 대해서만 토큰으로 인식하기 때문에 I는 없어졌다.

CountVectorizer에서 제공하는 불용어를 사용하여 제거할 수 있다.

vect = CountVectorizer(stop_words="english")

TF-IDF

카운트 기반 벡터화는 카운트 값이 높을수록 중요한 단어로 인식하기 때문에 불용어와 같은 모든 문서에서 자주 쓰일 수 밖에 없는 단어들이 중요하다고 인식될 수 있다. 이런 문제를 보완하기 위해 TF-IDF(Term Frequency - Inverse Document Frequency) 벡터화를 사용한다.

TF-IDF는 개별 문서에서 자주 등장하는 단어에 높은 가중치를 주되,
모든 문서에서 자주 등장하는 단어에는 페널티를 주고, 해당 문서에서만 자주 등장하는 단어에 높은 가중치를 주는 방식이다.
그렇게 함으로써 해당 단어가 실질적으로 중요한 단어인지 검사한다.
문서의 양이 많을 경우에는 일반적으로 카운트 기반의 벡터화보다 TF-IDF 방식의 벡터화를 사용한다.

image

from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
    'you know I want your love',
    'I like you',
    'what should I do ',    
]
tfidfv = TfidfVectorizer().fit(corpus)
print(tfidfv.transform(corpus).toarray())
print(tfidfv.vocabulary_)

출력 결과

[[0.         0.46735098 0.         0.46735098 0.         0.46735098 0.         0.35543247 0.46735098]
 [0.         0.         0.79596054 0.         0.         0.         0.         0.60534851 0.        ]
 [0.57735027 0.         0.         0.         0.57735027 0.         0.57735027 0.         0.        ]]
{'you': 7, 'know': 1, 'want': 5, 'your': 8, 'love': 3, 'like': 2, 'what': 6, 'should': 4, 'do': 0}

카운트 기반 벡터화인 CountVectorizer는 단순히 빈도를 기반으로 표현을 해주지만
TF-IDF 벡터화는 다른 문장에서의 단어 빈도도 고려하여 해당 단어의 중요도를 표현한다.
따라서 CountVectorizer보다는 TF-IDF를 일반적으로 더 많이 쓴다.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant