본문 바로가기

딥러닝/딥러닝을 이용한 자연어처리 입문

[딥러닝 NLP] 04. 카운트 기반 단어 표현(BoW, DTM, TF-IDF)

- 이번 장에서는 자연어처리의 정보 검색과 텍스트 마이닝 분야에서 주로 사용되는 카운트 기반 텍스트 표현 방법인

DTM(Document Term Matrix), TF-IDF(Term Frequency-Inverse Document Frequency) 에 대해 살펴본다.

- 어떤 단어가 특정 문서 내에서 갖는 중요도, 문서의 핵심어 추출, 검색 엔진에서 검색 결과의 순위 결정, 문서들 간의 유사도를 구하는 등의 용도로 사용

# 04-01 다양한 단어 표현 방법

1. 국소 표현 (Local Representation) 

- 해당 단어 그 자체만 보고, 특정값을 맵핑하여 단어를 표현하는 방법

  Ex) puppy(강아지), cute(귀여운), lovely(사랑스러운)라는 단어가 있을 때 각 단어에 1번, 2번, 3번 맵핑(mapping)

- 이산 표현(Discrete Representation) 이라고도 부름

 

2. 분산 표현(Distributed Representation)

- 그 단어를 표현하고자 주변을 참고하여 단어를 표현하는 방법

  Ex) puppy라는 단어는 cute, lovely한 느낌이다로 단어를 정의 -> 단어의 뉘앙스 표현 가능!

- 연속 표현(Continuous Represnetation)이라고도 부름

 

3. 단어 표현의 카테고리화

국소 표현과 분산 표현

# 04-02 BoW : Bag of Words

1. BoW란?

-빈도수 기반 단어 표현, 순서는 고려 X

-단순 빈도수 기반이기 때문에 불용어 제거 필수

-1단계: 단어에 인덱스 부여, 2단계: 각 인덱스 위치에 등장 횟수 기록

Ex) vocabulary : {'정부': 0, '가': 1, '발표': 2, '하는': 3, '물가상승률': 4, '과': 5, '소비자': 6, '느끼는': 7, '은': 8, '다르다': 9} 일 때,

bag of words vector : [1, 2, 1, 1, 2, 1, 1, 1, 1, 1]

-용도: 자주 등장하는 단어 바탕으로 어떤 성격의 문서인지 판단하는 작업에 사용

 

2. CountVectorizer로 BoW 사용

 from sklearn.feature_extraction.text import CountVectorizer 로 간단히 실습 가능

-띄어쓰기 기준으로 자르기 때문에 한국어 적용 어려움

  ex) '물가상승률', '물가상승률은' -> 서로 다른 두 단어로 인식

 

3. 불용어 제거 방법

-CountVectorizer에서 제공하는 자체 불용어

from sklearn.feature_extraction.text import CountVectorizer

-NLTK에서 제공하는 불용어 사용

from nltk.corpus import stopwords

-사용자 정의 불용어 사용

# 04-03 문서 단어 행렬(DTM, Document-Term Matrix)

1. DTM 이란?

-DTM: 다수의 문서에서 등장하는 BoW들을 하나의 행렬로 표현( 장점: 문서간 비교 가능)

-TDM: 행과 열을 반대로 선택

DTM 예시

 

 

2. DTM의 한계

-희소표현: 원핫벡터와 같이 대부분의 값이 0인 희소표현 사용하므로 저장공간 낭비

-단순 빈도수 접근이므로 문서간 유사도 판단 한계

  ex) 문서1, 문서2, 문서3 모두 the 라는 단어 빈도수 높다고 유사한 문서는 아님

# 04-04 TF-IDF(Term  Frequency-Inverse Document Frequency)

1. TF-IDF 란?

-단어의 빈도(TF) 역문서빈도(IDF)곱하여 각 단어의 중요한 정도에 따라 가중치를 주는 방법

-용도: 문서 유사도 구하기, 검색 시스템에서 검색결과의 중요도 정하기, 문서 내 특정 단어의 중요도 구하기

 

2. 문서=d, 단어=t, 문서개수=n 일 때

-1단계 df(t) : 특정단어 t 포함 문서개수

-2단계 idf(t) : 총문서개수 n / 특정단어 t 포함 문서개수

분자=총문서개수, 분모=특정단어포함 문서개수

 

  -식에 log를 사용하는 이유: 불용어 >>>>> 자주 쓰이는 단어 >> 희귀 단어 이기 때문에 엄청난 가중치 격차 줄이기 위해서

  -분모에 1을 더하는 이유: 특정 단어가 전체 문서에서 등장하지 않아 분모가 0이 되는 상황 방지

 

-3단계 tf(d,t) : 어떤문서 d 에서 특정단어 t 의 빈도

-4단계: 2단계와 3단계를 곱해줌

-TF-IDF 값이 높다 = 모든 문서에서 자주 등장하는 단어여서 중요도 낮다 (ex. the)

-TF-IDF 값이 낮다 = 특정 문서에만 자주 등장하는 단어여서 중요도 높다

- t 라는 단어가 내가 보고자 하는 문서 내에서 많이 등장할수록 중요하고, 전체 문서에 걸쳐 많이 등장할수록 안 중요하다

 

3. TF-IDF 파이썬 구현

-사이킷런이 제공하는 TF-IDF는 기본 식에서 약간 값 조정됨. (1) IDF 분자 +1 (2) 로그항 +1 (3) TF-IDF에 L2 정규화

from sklearn.feature_extraction.text import TfidfVectorizer
tfidfv = TfidfVectorizer().fit(corpus)
tfidfv.transform(corpus).toarray()
tfidfv.vocabulary_