Skip to main content

문서 단어 행렬

문서 단어 행렬

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

단어 통계

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

문서 단어 행렬 Document Term Matrix

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

토큰화 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_URLURL 주소
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')

퀴즈