scikit-learn
모듈 중 특징 추출 모듈에 대해 알아보자.
자연어 처리에서 특징 추출이란,
👉텍스트 데이터에서 단어나 문장들을 어떤 특징 값으로 바꿔주는 것을 의미한다.
즉, 기존의 문자를 모델에 데이터로서 적용할 수 있도록 📌수치화하는 것이다.
사이킷런을 사용해 텍스트 데이터를 수치화하는 세 가지 방법이 있다. 모두 텍스트를 벡터로 만드는 방법이다.
CountVectorizer
와 동일한 방법, 하지만 텍스트 처리 시 해시 함수 사용하여 실행 시간 단축, 텍스트 크기 클수록 이걸 사용하는 것이 효율적CountVectorizer
텍스트 데이터에서 횟수를 기준으로 특징 추출하는 방법이다.
어떤 단위의 횟수를 셀 것인지는 선택 사항이다. (단어, 문자 등)
보통 단어를 기준으로 한다.
CountVecotrizer
을 사용하는 방법은 아래와 같다.
- 객체를 만든다
- 이 객체에 특정 텍스트 적합시키기 🚩(횟수를 셀 단어의 목록을 만드는 과정)
- 횟수를 기준으로 해당 텍스트 벡터화
📗단어 사전의 단어에 대해서 횟수를 세서 해당 횟수를 벡터 값으로 만든다.
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와 머신러닝으로 시작하는 자연어 처리