scikit-learn library를 이용하여 자연어 처리를 할 수 있는 대표적인 class인 Count Vectorizer와 TFIDFvectorizer를 알아보고자 한다.
scikit-learn의 서브패키지 중 feature_extraction과 feature_extraction.text라는 문서 전처리용 클래스를 제공하고 있다.
DicVectorizer | 단어의 수를 세어놓은 사전에서 BOW 인코딩 벡터를 만든다 |
CountVectorizer | 모든 문서의 단어 토큰을 생성하고 각 단어의 수를 세어 BOW 인코딩 벡터를 만든다 |
TFIDFVectorizer | CountVectorizer와 비슷하나 TF-IDF 방식으로 단어의 가중치를 조절하여, 문서 구별능력이 뛰어난 단어에게 큰 가중치를 문서구별능력이 떨어지는 단어에게 작은 가중치를 주어 BOW 인코딩 벡터를 만든다. |
HashingVectorizer | 해시함수(Hash Function)을 이용하여 적은 메모리, 빠른 속도로 BOW 인코딩 벡터를 만든다. |
※ BOW인코딩이란?
Bag of Words = BOW
- 단어 T1이 문서 Document 안에 없으면 = 0
- 단어 T1이 문서 Document 안에 있으면 = 1
Count Vectorizer
CountVectorizer는 문서 내용을 토큰 리스트로 변환하고, 각 문서에서 토큰의 출현빈도를 계산한다. 각 문서를 bow encoding vector로 변환하여 각문서에 많이 사용된 단어(term)들의 개수를 세고 vectoizer 한다.
from sklearn.feature_extraction.text import CountVectorizer
all_codu = [
'This is the first document.',
'This is the second second document.',
'And the third one.',
'Is this the first document?',
'The last document?',
]
vect = CountVectorizer()
vect.fit(all_codu)
vect.vocabulary_
먼저 [all_docu]라는 문장 5개가 들어있는 리스트를 만들어준다.
문장 5개가 들어있는 리스트를 CountVectorizer()함수에 넣어 fit 해주면, 사용된 각 단어의 개수가 counting이 되어있는 점을 확인할 수 있다.
Count Vectorizer는 stop_wors, max_df, min_df, ngram_range, tokenizer 등 여러 argument를 이용하여 단어들의 counting 조건을 자유롭게 정하여 사용할 수 있다는 특징을 가지고 있다.
TFIDFVectorizer
TFIDF란 Term Frequency Inverse Document Frequency는 인코딩은 단어를 갯수 그대로 카운트하지 않고 모든 문서에 공통적으로 들어있는 단어의 경우 문서 구별 능력이 떨어진다고 보아 가중치를 축소하는 방법이다.
단어들의 집합이라고 할 수 있는 문서(d = document)와 단어(t : term)에 대하여 계산한다.
- tf(d, t) = term frequency, 특정한 단어의 빈도수를 말한다.
- idf(t) = Inverse Document Frequency, 특정한 단어가 들어가 있는 문서의 수에 반비례하는 수를 말한다.
- n : 전체 문서의 수를 말한다.
- df(t) : 단어 t를 가진 문서의 수를 말한다.
from sklearn.feature_extraction.text import TfidfVectorizer
tfidv = TfidfVectorizer().fit(all_docu)
tfidv.transform(all_docu).toarray()
Hashing Trick
countvectorizer를 실행할 때 처리할 문서의 크기가 엄청 커지면 속도가 느려지거나 메모리가 부족하여 실행히 불가능할 수 있다. 이럴 경우 Hashing Vectorizer를 이용하여 해시 함수를 사용하여 단어에 대한 인덱스 번호를 생성하기 때문에 사용 메모리와 실행 시간을 절약할 수 있다.
참고 블로그
댓글