[파이썬] 특성 추출 - Bag of Words ( 자연어 처리 / 벡터화 )

2021. 1. 20. 05:18GPT

728x90

 

 

 

 

특성 추출 : 원시 데이터에서 핵심 특성을 추출하는 과정.

                   가공한 토큰들을 컴퓨터가 이해할 수 있는 벡터 데이터로 바꾸는 과정.

 

 ◎ Bag of Words : 문서 내 모든 단어들 (토큰)을 가방 하나에 모두 집어넣고 사용.

                          자주 언급된 단어일수록 가방에서 나올 확률이 높아진다.

                          중요한 것은 단어의 등장 빈도이며, 단어의 순서는 상관없음.

 

    · 문장 - "나는 학교에 간다. 나는 회사에 간다."
              이 문장으로 단어 사전을 구성하면 다음과 같다. 단어는 오름차순의 가나다순으로 정렬.


     · 사전: {'간다', '나', '학교', '회사'}
             이 사전 순서에 따라 각 단어가 문장에서 몇 번 발생했는지 빈도 수를 기록.


    → 이 예에 따르면 문서 내에 ‘간다’와 ‘나’는 2번 발견되었고 ‘학교’와 ‘회사’는 1번씩 발견되었다.
        {'간다': 2, '나': 2, '학교': 1, '회사': 1}

 

 

 

▶ 단어의 빈도수를 세는 작업에는 collections.Counter  이용.

from konlpy.tag import Okt
from collections import Counter
import pandas as pd

voc = '형태소 란 문장을 구성하는 의미 요소 중 가장 작은 단위를 말한다.'
okt_pos = Okt().pos(voc, norm=True, stem=True)    # 형태소 분석
words = [x for x, y in okt_pos if y in ['Noun']]  # 명사만 추출

counter = Counter(words)   # 빈도수 기반
print(counter)

 

 

 

 

 

 

▶ 문서-단어 행렬이란, 문서마다 각 단어가 몇 번씩 등장했는지 그 빈도를 세서 표 형태로 정리.

   sklearn의 CountVectorizer 사용함.

from sklearn.feature_extraction.text import CountVectorizer
import pandas as pd

corpus = [
    '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()
document_term_matrix = vect.fit_transform(corpus)     # 문서-단어 행렬 

#-------------------------------------------------------------------------------
vect.fit(corpus)                                      # 단어사전 생성
print(vect.get_feature_names())
 
vect.transform(corpus)                                # 문서-단어 행렬 (희소행렬)
print(vect.transform(corpus).toarray())               # 문서-단어 행렬 (numpy 배열)  
 
pd.DataFrame(vect.transform(corpus).toarray(), columns=vect.get_feature_names())
                                                      # 데이터 프레임으로 변환

 

 fit 을 사용하면 전체 문서에 대해, 단어사전을 만듦. (모든 단어들의 리스트를 만든 후에 인덱스 부여)

 transform 은 단어 사전에 기반하여, 문서-단어 행렬을 만듦.

 

 

 


▶  Bag of Words (BOW)의  단점

 

 

문맥 의미 반영 부족 :

  단어의 순서를 고려하지 않기 때문에 문맥적인 의미 (Semantic Context) 가 무시됨.

 

 

문서 내, 표현의 희귀도 무시 :

  많이 언급될수록 가중치가 높게 책정되어, 정작 중요한 키워드 탐색은 어려워짐.

 →  TF-IDF 적용하여 해결.

 

 

[파이썬] 특성 추출 - TF-IDF ( 자연어 처리 / 벡터화 )

 ◎ TF - IDF ( Term Frequency - Inverse Document Frequency ) : 단어의 빈도(Term Frequency)와 역 문서 빈도(Inverse Document Frequency)를 토대로, 특정 문서 내에 어떤 단어가 얼마나 중요한 지를..

python-explorer.tistory.com

 

 

희소 행렬 문제 - 문서 단어 행렬 (Document-Term Matrix)

 벡터화하면 희소 행렬 형태의 데이터가 만들어지는데, 문장이 굉장히 많은 문서에서 벡터화를 하면 칼럼이 매우 많아진다. 문서마다 서로 다른 단어로 구성되기에 단어가 문서마다 나타나지 않는 경우가 많고, 대부분의 칼럼은 0으로 채워지게 된다.

 행렬에서 대부분의 값이 0으로 채워진 행렬을 희소 행렬(Sparse Matrix)라고 하며, 이것은 머신러닝의 성능을 떨어뜨리기 때문에, 구두점, 빈도수가 낮은 단어, 불용어를 제거하고, 어간이나 표제어 추출을 통해 단어를 정규화하여 단어 집합의 크기를 줄인다.

 

 →  단어임베딩 적용하여 해결.

 

[파이썬] 특성추출 - 단어임베딩 ( 자연어처리 / 벡터화 ) - word2vec

※ 단어 임베딩 ( Word Embedding )  원-핫 인코딩( one-hot encoding ) 방식에서는 텍스트의 단어를 벡터로 표현하며, 단어에 해당하는 항목만이 1이고, 다른 모든 항목은 0으로 표기한다. 이 방식에서는

python-explorer.tistory.com

 

 

 

반응형