scikit-learn, 사이킷런 머신러닝 라이브러리 - 특징 추출

김지원·2022년 11월 30일
0

NLP(자연어 처리)

목록 보기
15/15

💡 사이킷런을 이용한 특징 추출

scikit-learn 모듈 중 특징 추출 모듈에 대해 알아보자.

자연어 처리에서 특징 추출이란,
👉텍스트 데이터에서 단어나 문장들을 어떤 특징 값으로 바꿔주는 것을 의미한다.
즉, 기존의 문자를 모델에 데이터로서 적용할 수 있도록 📌수치화하는 것이다.

사이킷런을 사용해 텍스트 데이터를 수치화하는 세 가지 방법이 있다. 모두 텍스트를 벡터로 만드는 방법이다.

  • CountVectorizer : 단순히 각 텍스트에서 횟수를 기준으로 특징을 추출
  • TfidVectorizer : TF-IDF라는 값을 사용해 텍스트에서 특징 추출
  • HashingVectorizer : CountVectorizer와 동일한 방법, 하지만 텍스트 처리 시 해시 함수 사용하여 실행 시간 단축, 텍스트 크기 클수록 이걸 사용하는 것이 효율적

🧩 CountVectorizer

텍스트 데이터에서 횟수를 기준으로 특징 추출하는 방법이다.
어떤 단위의 횟수를 셀 것인지는 선택 사항이다. (단어, 문자 등)

보통 단어를 기준으로 한다.

CountVecotrizer을 사용하는 방법은 아래와 같다.

  1. 객체를 만든다
  2. 이 객체에 특정 텍스트 적합시키기 🚩(횟수를 셀 단어의 목록을 만드는 과정)
  3. 횟수를 기준으로 해당 텍스트 벡터화

📗단어 사전의 단어에 대해서 횟수를 세서 해당 횟수를 벡터 값으로 만든다.

from sklearn.feature_extraction.text import CountVectorizer

text_data=['나는 배가 고프다', '내일 점심 뭐먹지', '내일 공부 해야겠다', '점심 먹고 공부해야지']

# 객체 생성
count_vectorizer=CountVectorizer()

# 생성한 객체에 fit 함수 사용해 데이터를 적용하면 자동으로 단어 사전 생성
count_vectorizer.fit_transform(text_data)
print(count_vectorizer.vocabulary_)

단어 사전을 보면 각 단어에 대해 숫자들이 사전 형태로 구성되어 있다.

{'나는': 3, '배가': 7, '고프다': 0, '내일': 4, '점심': 8, '뭐먹지': 6, '공부': 1, '해야겠다': 9, '먹고': 5, '공부해야지': 2}

단어 사전을 구성했으니 이제 텍스트 데이터를 실제 벡터로 만들면 아래처럼 나온다.

# 각 단어가 한 번씩 나왔으므로 1 값을 가진다. 
sentence=[text_data[0]]
print(count_vectorizer.transform(sentence).toarray())
# Output
[[1 0 0 1 0 0 0 1 0 0]]

직관적이고 간단한 방법이지만,
❗단순히 횟수만을 특징으로 잡기 때문에 큰 의미가 없지만 자주 사용되는 단어들(조사 혹은 지시대면서 등) 이 높은 특징 값을 가지기 때문에 적절한 방법이 아닐 수 있다.

이러한 문제를 해결해주는 TF-IDF 방식을 살펴보자.

🧩 TfidfVectorizer

Tf-IDF라는 특정한 값을 사용해서 텍스트 데이터의 특징을 추출하는 방법이다.

TF(Term Frequency) : 특정 단어가 하나의 데이터 안에서 등장하는 횟수
DF(Document Frequency) : 문서 빈도 값으로, 특정 단어가 여러 데이터에 자주 등장하는지를 알려주는 지표, IDF는 이 값에 역수를 취해서 구할 수 있으며, 특정 단어가 다른 데이터에 등장하지 않을수록 값이 커진다는 것을 의미한다.

그리고 TF-IDF는 위 두 값을 곱해서 사용하므로

💡어떤 단어가 해당 문서에 자주 등장하지만 다른 문서에는 많이 없는 단어일수록 높은 값을 가지게 된다.

조사, 지시대명사의 경우 TF-IDF에서 IDF 값이 작아지므로 특징을 잘 추출할 수 있다.

from sklearn.feature_extraction.text import TfidfVectorizer

# 객체 생성
tfidf_vectorizer=TfidfVectorizer()

# 동일하게 단어 사전을 만든 후 단어 사전의 목록을 출력해보자.
tfidf_vectorizer.fit(text_data)
print(tfidf_vectorizer.vocabulary_)

# 벡터화 값 출력해보자.
sentence=[text_data[3]]
print(tfidf_vectorizer.transform(sentence).toarray())
[[0.         0.         0.61761437 0.         0.         0.61761437
  0.         0.         0.48693426 0.        ]]

이처럼 TF-IDF 값으로 특징을 추출한 TfidfVectorizer를 사용하는 것이 일반적으로 더 좋은 결과를 낸다.

출처: 텐서플로2와 머신러닝으로 시작하는 자연어 처리

profile
Make your lives Extraordinary!

0개의 댓글