logo

문서 단어 행렬

문서 단어 행렬

문서 단어 행렬

  • 주요 개념:
    • 문서 단어 행렬
    • 토큰화
    • 형태소 분석

단어 통계

  • 단어 사용의 패턴에는 여러 가지 정보가 포함
  • 개인: "나"를 많이 쓰는가, "너"를 많이 쓰는가?
  • 정치: 대통령 연설문에 어떤 단어가 많이 나오는가?
  • 경제: 기업의 실적보고에 어떤 단어가 많이 나오는가?
  • 제품: 고객 리뷰에 어떤 단어가 많이 나오는가?

문서 단어 행렬 Document Term Matrix

  • 문서별로 단어의 빈도를 정리한 표
  • 예시:
    • 문서1: 오늘은 밥을 먹었다
    • 문서2: 어제도 밥, 오늘도 밥
오늘 어제 밥 먹다
문서1 1 0 1 1
문서2 1 1 2 0
  • 비정형 데이터인 텍스트를 표 형태로 정형화
  • 정형 데이터의 다양한 통계 기법을 적용 가능
  • 처리가 단순 ↔ 어순과 맥락을 무시하는 것이 단점

토큰화 tokenization

  • 문장을 토큰(분석의 단위)으로 쪼개는 것
  • 영어의 경우 흔히 단어 단위로 토큰화
    • 단어: 홀로 쓰일 수 있는 단위
    • The apple went bad → the, apple, went, bad
  • 한국어의 경우 흔히 형태소 단위로 토큰화
    • 형태소: 의미가 있는 가장 작은 단위
    • 사과가 상했다 → 사과/N, 가/J, 상하/V, ㅆ/E, 다/E
  • 단어 분리(word segmentation): 띄어쓰기를 하지 않는 중국어, 일본어 등

형태소 분석기 kiwi 사용법

  • 빠르고 정확한 형태소 분석기
  • 설치
pip install kiwipiepy
  • 불러오기
from kiwipiepy import Kiwi
kiwi = Kiwi()

kiwi 형태소 분석

  • 형태소 분석
text = '오늘은 자연어 처리를 배우기 좋은 날이다.'
result = kiwi.tokenize(text)
result

kiwi 품사 태그

분류 태그 설명
체언(N) NNG 일반 명사
NNP 고유 명사
NNB 의존 명사 (것, 수)
NR 수사
NP 대명사 (이것, 저것)
조사(J) JKS 주격 조사 (이, 가)
JKC 보격 조사 (이, 가)
JKG 관형격 조사 (의)
JKO 목적격 조사 (을, 를)
JKB 부사격 조사 (로)
JKV 호격 조사 (야)
JKQ 인용격 조사 (라고)
JX 보조사 (은, 는)
JC 접속 조사 (와, 과)
수정사 및 독립언(M, I) MM 관형사 (어느, 한)
MAG 일반 부사 (매우)
MAJ 접속 부사 (그리고)
IC 감탄사 (와!)
어미(E) EP 선어말 어미 (-었-)
EF 종결 어미 (-다)
EC 연결 어미 (-고)
ETN 명사형 전성 어미 (-기)
ETM 관형형 전성 어미 (-는)
부호(S) SF 종결 부호 (.!?)
SP 구분 부호 (,/::)
SS 인용 부호 및 괄호 ('")
SE 줄임표 (...)
SO 붙임표 (-)
용언(V) VV 동사 (가다)
VA 형용사 (아름답다)
VX 보조 용언 (주다)
VCP 긍정 지시사 (이다)
VCN 부정 지시사 (아니다)
어근 및 접사(X) XPN 체언 접두사 (맨-)
XSN 명사 파생 접미사 (들)
XSV 동사 파생 접미사 (대다)
XSA 형용사 파생 접미사 (롭다)
XR 어근 (훌륭)
기타 (U, W) SW 기타 특수 문자
UN 분석 불능
W_HASHTAG 해시태그 (#abcd)
W_MENTION 멘션 (@abcd)
W_URL URL 주소
W_EMAIL 이메일 주소
SL 알파벳 (A-Za-z)
SH 한자
SN 숫자 (0-9)

※ 일반적으로 많이 사용하는 품사 태그

kiwi 명사 추출 함수

def extract_nouns(text):
    result = kiwi.tokenize(text)
    for token in result:
        if token.tag in ['NNG', 'NNP']:
            yield token.form
  • 사용 예시
list(extract_nouns('어제는 홍차를 마시고, 오늘은 커피를 마셨다.'))

한국어 문서 단어 행렬 만들기

#데이터
import pandas as pd
df = pd.read_excel('patents.xlsx')

# extract_nouns 함수로 토큰화하여 문서단어행렬 만들기
from sklearn.feature_extraction.text import CountVectorizer
cv= CountVectorizer (tokenizer=extract_nouns, min_df =10)
dtm = cv.fit_transform(df.abstract)

# 문서 단어 행렬의 모양 보기: 행(문서)의 개수, 열(단어)의 개수
dtm.shape

단어 빈도 데이터 프레임

words = list(cv.get_feature_names_out()) # 단어 목록
word_count = pd.DataFrame({
    '단어': words,
    '빈도': dtm.sum(axis=0).flat
})
  • 각 단어의 총빈도를 데이터 프레임으로 만들어 word_count라고 한다
  • .sum의 결과가 행렬 형태이므로 .flat을 사용하여 컬럼에 들어갈 수 있는 형태로 변환한다.

합계

  • 단어별 총빈도(axis=0: 열별 합계)
    • 바이너리 인코딩된 경우, 문서 빈도(document frequency: 해당 단어가 출현하는 문서의 수)
dtm.sum(axis=0)
  • 문서별 총 단어 수(axis=1: 행별 합계)
dtm.sum(axis=1)

빈도순 정렬

word_count.sort_values('빈도', ascending=False).head()
  • .sort_values()를 이용해 빈도 순으로 정렬을 한다.
  • ascending=TRUE을 하면 오름차순으로 정렬한다.
  • 생략하거나 False로 하면 내림차순 정렬.
  • 엑셀 파일로 저장:
word_count.to_excel('word_count.xlsx')