자연어처리 특징 추출 - 사이킷런

Dae Hee Lee·2021년 7월 20일
0

NLP-tensorflow2

목록 보기
2/10
post-thumbnail

자연어처리에서 특징을 추출한다는 것은 텍스트 데이터의 단어, 문장들을 어떠한 값으로 바꿔주는 것을 의미한다. 즉, 기계가 인식할 수 있도록 수치화 시켜주는 것이다.
사이킷런에는 다음 세 가지 방법으로 특징 추출이 가능하다.

  • CountVectorizer
  • TfidfVectorizer
  • HashingVectorizer

CountVectorizer

텍스트 데이터에서 등장한 횟수를 기준으로 벡터화시키는 방법이다. 단어를 기준으로 횟수를 셀 수도 있고, 문자 하나하나씩 셀 수도 있으며 보통 단어를 기준으로 측정한다.

여기서 횟수를 센다 라는 뜻은 먼저 지정된 단어 사전을 기준으로 주어진 문장이 사전에서 몇 번 등장하는지를 의미한다.

따라서 가장 먼저 Countvectorizer 객체를 생성한 뒤 단어 사전 생성을 위해 fit 함수를 사용한다.

from sklearn.feature_extraction.text import CountVectorizer
text_data = ['사과 바나나 자동차', '바나나 자동차 기차',
    '자동차 기차 사과 포도', '바다 사과 기차 여름']
    
countvec = CountVectorizer()

countvec.fit(text_data)
print(countvec.vocabulary_)

결과는 다음과 같이 나온다.

{'기차': 0, '바나나': 1, '바다': 2, '사과': 3, '여름': 4, '자동차': 5, '포도': 6}

단어 사전이 생성되어 각 단어별 인덱스 번호가 생성되었다.
그 다음, 원하는 문장을 벡터화 해보자.

sentence = [text_data[0]]
print(countvec.transform(sentence).toarray())
[[0 1 0 1 0 1 0]]

다시 말하면, 0번 째 인덱스인 '기차'는 0개, 1번 째 인덱스인 '바나나'는 1개, ... 이런 식으로 단어 사전 개수만큼 Array를 생성하게되는 것이다.

기본적으로 CountVectorizer는 개수만 세기 때문에 빈도 수 외에 별 의미가 없다. 하지만 자주 등장하는 단어가 주요하게 쓰이는 경우도 있고, 특징 추출의 기본이기 때문에 알아두어야한다.

HashingVectorizer

설명을 보고 아마 이런 생각이 들었겠지만, CountVectorzier는 모든 데이터에 대해 단어 사전을 구축해야하기 때문에, 데이터의 수가 많아질수록 비효율적이다. 따라서 Hash 함수를 이용하여 실행 시간을 크게 감축시킬 수 있다. 그리고 이 때 사용하는 모듈이 바로 HashingVectorizer 이다.

TfidfVectorizer

한편, TfidfVectorizer는 위의 두 모듈과 달리, 벡터화 알고리즘이 단순히 빈도수만 계산하지 않는다. TF(Term Frequency)DF(Document Frequency)의 Inverse의 곱 형태로, 해당 문서에서 자주 등장하는 단어가 다른 문서에도 많이 등장할수록 그 값이 작아지고, 다른 문서에서는 적게 등장할수록 값이 커지는 형태를 가진다.

이는 CountVectorizer의 큰 문제점인 조사나 지시대명사 등과 같은 의미없는 단어에 높은 값을 부여하는 문제를 해결할 수 있다는 점에서 매우 유용한 방법이다.

HashingVectorizer와 TfidfVectorizer모두 위의 CountVectorizer와 같은 형태로 동작한다.

from sklearn.feature_extraction.text import HashingVectorizer
from sklearn.feature_extraction.text import TfidfVectorizer
text_data = ['사과 바나나 자동차', '바나나 자동차 기차',
    '자동차 기차 사과 포도', '바다 사과 기차 여름']
    
hashvec = HashingVectorizer()
tfidfvec = TfidfVectorizer()

hashvec.fit(text_data)
tfidfvec.fit(text_data)

sentence = [text_data[0]]
print(hashvec.transform(sentence).toarray())
print(tfidfvec.transform(sentence).toarray())

많은 sklearn모듈들이 fit - transform의 형태를 가지고 있는데, 오늘 알아본 자연어 특징 추출 모듈 역시 마찬가지였다.
자연어 처리 문제를 시작하기에 앞서 가장 기본적인 세 가지 특징 추출 모듈을 알아보았다. 다음 번에는 자연어처리의 또다른 기초가 되는 토크나이징에 대해서 알아보겠다.

profile
Today is the day

0개의 댓글