Today I Learned/머신러닝

[텍스트분석] TDM (Term Document Matrix) 단어 문서 행렬

하나719 2020. 11. 27. 17:00
반응형

텍스트 분석으로 어떤걸 할 수 있을까?

예시)

 

1) 기사 분류

- 하루에도 수백개씩 나오는 기사들, 지도 학습을 통해 사회, 연예, 정치등 카테고리를 분류해줄 수 있다.

 

2) 감성 분석

- 영화 리뷰, 정책에 대한 댓글 등에서 감성을 분석해서 호감도를 알아 볼 수 있다.

 

3) 에세이 채점

- 텍스트는 객관식보다 평가할 수 있는 항목이 많고 구체적이지만 채점이 어렵다.

- 텍스트 분석으로 일관성있고 타당한 채점을 할 수 있다.

 

4) 자기소개서 분석 - 채용에 활용

- 일을 잘하는 사람의 자기소개서와 못하는 사람의 자기소개서를 분석해서 채용시 자기소개서를 분류할 수 있다.

 

이렇게 수치 데이터가 아닌 텍스트 데이터도 분석 활용 범위가 다양하다.

 

어떻게 분석할까?

TDM (Term Document Matrix)

컴퓨터는 문장을 이해할 수 없기 때문에, 문장을 숫자로 변형해주어야 합니다. 

이 방법을 Term Document Matrix (이하 TDM) 이라고 하는데, 이 과정은 텍스트 분석 과정에서 필수적이며 중요한 단계입니다.

TDM은 문서안에 포함된 단어의 빈도를 정리한 표입니다.

 

예시)

문서1: 오늘은 밥을 먹었다.

문서2: 어제도 밥, 오늘도 밥

 

  오늘 어제 먹다
문서1 1 0 1 1
문서2 1 1 2 0

이렇게 문장내에 등장하는 단어를 컬럼으로하여 빈도수를 넣어주면, 다른 분석에서 사용하는 일반적인 통계 분석 기법을 모두 사용할 수 있습니다. 

TDM은 처리가 쉬워지지만, 어순과 맥락을 무시하게 되는 것이 단점입니다.

하지만 대부분의 경우 TDM만으로 정확한 분석이 가능합니다.

 

Sparse matrix (희소행렬)

많은 문서를 하나의 TDM으로 만들면 대부분의 값은 0을 가지게 될 수 있다.

하나의 문서에는 다양한 단어들이 등장하는데 모든 문서에 그 단어들이 들어가진 않기 때문이다.

그래서 용량을 아끼기 위해서 0을 빼고 저장하는 압축 방법을 사용한다.

 

실제로 만들어보자!

영화 리뷰 데이터 출처: archive.ics.uci.edu/ml/machine-learning-databases/00331

 

Index of /ml/machine-learning-databases/00331

 

archive.ics.uci.edu

영화에 대한 리뷰 데이터셋 - 데이터프레임

[코드]

# 라이브러리 import 
from sklearn.feature_extraction.text import CountVectorizer

# 단어빈도수 세고, matrix 형태로 만들어주기
cv = CountVectorizer(max_features=500, stop_words='english')
tdm = cv.fit_transform(df['review']) # tdm 완성

  • CountVectorizer 는 토큰이 문서별로 몇 번 등장했는지 행렬로 정리해준다.

    • max_features: 단어문서행렬에 포함시킬 최대의 단어수를 말한다. (빈도순으로 짜름)

    • stop_words: 분석에서 제외할 불용어를 설정하는 옵션이며, english로 설정하면 관사, 전치사 등을 제외한다. 다른 언어는 리스트등의 형태로 불용어 목록을 넘겨주어 사용한다.

[결과]

TDM을 쳐보면, 아래처럼 테이블 형태로 나오지 않는데 출력된 메시지를 보면, sparse matrix이며, 총 3433개의 값이 들어있는걸 알 수 있다.

문서의 갯수 (row): 748 개, 단어수( columns): 500개 의 행렬에서 3433이 차지하는 비율은 1%도 되지 않는다.

그래서 Compressed( 압축된 상태) 로 제공된다.

sparse matrix

[단어 빈도수 확인하기]

TDM에서는 각 row 마다 특정 단어의 빈도수를 체크하고 있는데, 전체 데이터 셋에서 단어 빈도수 합을 살펴보자.

# 단어 목록 확인하기
cv.get_feature_names()[:50]

# 빈도수 확인하기
tdm.sum(axis=0)

# DataFrame 형태로 만들어주기
word_count=pd.DataFrame({
    '단어': cv.get_feature_names(),
    '빈도': tdm.sum(axis=0).flat
})

단어 별 빈도 count, 내림차순

TDM의 종류

1. CountVector

- 단어의 빈도수를 표기 (실습에 진행한 내용)

 

2. Binary Vector

- 단어의 등장 여부를 표기 (0 or 1)

 

3. TF-IDF (Term Frequency-Inverse Document Frequency)

정확히 Matrix는 아니고, TDM을 보완하기 위한 가중치 값

 

TF-IDF에 대해서는 다음에 문서에서 이어서 정리하겠습니다!! 🙌🏻

 

 

강의출처: mindscale.kr/course/intro-text-analysis

 

텍스트 데이터 분석

텍스트 분석이 무엇인지 알아보고, 텍스트 분석의 방법과 특징을 소개합니다.

mindscale.kr

 

반응형