단어문서행렬과 형태소 분석

Python을 통한 단어문서행렬과 형태소 분석


수강중

3. 단어 문서 행렬 실습

데이터 다운로드

링크를 클릭하여 데이터를 다운로드 받는다.

colab의 경우 아래 명령을 입력한다.

wget -c https://raw.githubusercontent.com/euphoris/datasets/master/imdb.xlsx

데이터 열기

pandas를 이용해 imdb.xslx 파일을 연다. index_col=0은 파일에서 0번 컬럼이 행 번호를 나타냄을 뜻한다.

import pandas as pd

df = pd.read_excel('imdb.xlsx', index_col=0)

데이터를 확인한다.

df.head()
review sentiment
0 A very, very, very slow-moving, aimless movie ... 0
1 Not sure who was more lost - the flat characte... 0
2 Attempting artiness with black & white and cle... 0
3 Very little music or anything to speak of. 0
4 The best scene in the movie was when Gerardo i... 1

데이터의 형태를 확인한다. 총 748행, 2열이다.

df.shape
(748, 2)

TDM 만들기

scikit-learn 라이브러리에서 단어문서행렬을 만드는 CountVectorizer 모듈을 사용한다.

from sklearn.feature_extraction.text import CountVectorizer

CountVectorizer는 토큰이 문서별로 몇 번 등장했는지 행렬로 정리해준다. 특별히 토큰화 방법을 지정하지 않으면, 빈 칸을 기준으로 토큰을 구분한다.

  • max_features: 단어문서행렬에 포함시킬 최대(max)의 단어(feature) 수를 말한다. 즉, 빈도 순으로 최대 500 단어까지 포함한다.
  • stop_words: 분석에서 제외할 불용어를 설정하는 옵션이다. stop_words=english로 설정하면 영어의 경우 관사, 전치사 등을 제외한다. 다른 언어는 리스트 등의 형태로 불용어 목록을 넘겨주어야 한다.
cv = CountVectorizer(max_features=500, stop_words='english')

dfreview 컬럼을 바탕으로 단어 문서 행렬을 만든다.

tdm = cv.fit_transform(df['review'])

만들어진 tdm의 형태를 확인해보면 74행, 500열이 된다.

tdm.shape
(748, 500)

단어 목록

cv.get_feature_names()로 단어 목록을 확인한다. 단어 목록이 tdm이 아닌 cv에 저장되는 것에 주의.

cv.get_feature_names()[:10]
['10',
 '20',
 '90',
 'absolutely',
 'acted',
 'acting',
 'action',
 'actor',
 'actors',
 'actress']

단어별 총 빈도

  • 단어별 총 빈도를 계산한다.
  • .sum() 메소드는 합계를 낸다.
    • axis=0: 열별 합계
    • axis=1: 행별 합계
tdm.sum(axis=0)  # 단어별 총빈도
matrix([[ 29,   3,   6,   9,   3,  43,   7,  10,  19,   3,   3,  10,   3,
           4,   3,   4,   9,   3,   3,   3,   6,   3,   4,   3,  13,   4,
           3,   5,   3,   8,   5,   3,  14,  71,   4,  11,   4,   6,   8,
          25,  18,  10,   5,  10,   4,   3,   4,  10,   3,   3,   6,   7,
           3,   4,  10,   5,   3,  18,   6,   8,  24,  35,   4,   3,   7,

문서별(각 문장별) 단어 수를 계산한다. 각 행이 문서이므로 행별 합계를 낼 경우, 문서별 총 단어수를 구할 수 있다.

tdm.sum(axis=1)  # 문서별 총 단어 수
matrix([[  5],
        [  5],
        [ 12],
        [  3],
        [  6],

각 단어의 총빈도를 데이터 프레임으로 만들어 word_count라고 한다. .sum의 결과가 행렬 형태이므로 ._flat을 사용하여 컬럼에 들어갈 수 있는 형태로 변환한다.

word_count = pd.DataFrame({
    '단어': cv.get_feature_names(),
    '빈도': tdm.sum(axis=0).flat
})

.sort_values()를 이용해 빈도 순으로 정렬을 한다. ascending=TRUE을 하면 오름차순으로 정렬한다. 생략하거나 False로 하면 내림차순 정렬.

word_count.sort_values('빈도', ascending=False).head()
단어 빈도
284 movie 182
153 film 163
33 bad 71
225 just 63
178 good 58

단어 빈도 저장

나중에 분석을 위해서 CSV로 저장한다.

word_count.to_csv('word_count.csv')