문서 단어 행렬
문서 단어 행렬
- 주요 개념:
- 문서 단어 행렬
- 토큰화
- 형태소 분석
단어 통계
- 단어 사용의 패턴에는 여러 가지 정보가 포함
- 개인: "나"를 많이 쓰는가, "너"를 많이 쓰는가?
- 정치: 대통령 연설문에 어떤 단어가 많이 나오는가?
- 경제: 기업의 실적보고에 어떤 단어가 많이 나오는가?
- 제품: 고객 리뷰에 어떤 단어가 많이 나오는가?
문서 단어 행렬 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')