csmoon1010의 SW 블로그

자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(5) 본문

데이터&인공지능/자연어처리

자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(5)

csmoon1010 2020. 2. 12. 20:17

02. 텍스트 전처리(Text preprocessing)

wikidocs.net/book/2155

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

6) 정수 인코딩(Integer Encoding)

컴퓨터는 숫자를 더 잘 처리할 수 있으므로 텍스트를 숫자로 바꾸는 기법들이 자주 사용된다.

이 때 필요한 전처리가 "각 단어를 고유한 정수 맵핑"시키는 것이다. 이 떄 인덱스를 부여할 때 보통 랜덤보다는 전처리 또는 빈도수가 높은 단어들 기준으로 정렬하여 부여한다.

 

1. 정수 인코딩(Integer Encoding)

단어를 빈도수 순으로 정렬하여 단어 집합(vocabulary)을 만들고 높은 것부터 순서대로 낮은 숫자부터 정수를 부여한다.

(1) dictionary 이용하기

- 문장 단위 토큰화 --> 문장별 정규화&정제(소문자화, 불용어 제거, 길이 2이하 제거) --> 사전 추가

- 각 단어 별 빈도수

- 빈도수가 높은 순으로 정렬 & 인덱스 부여(단, 빈도수가 1인 단어는 제외된 상태)

- 빈도수 상위 n개만 이용

- 각 문장의 토큰화된 단어들을 정수로 인코딩. 단, word_to_index에 없는 단어는 OOV(Out-Of-Vocabulary)로 인코딩

(2) Counter 사용하기

- 각 문장의 문자 토큰화 결과를 하나의 리스트(words)로 합침

- Counter를 통해 빈도수 계산

- 빈도수 상위 5개 추출 후 높은 빈도수부터 낮은 정수 인덱스 부여

- 문장별 인코딩은 (1)과 같음

(3) NLTK의 FreqDist 사용하기

- 각 단어별 빈도수 계산하기

- 빈도수 상위 5개 추출 후 높은 빈도수부터 낮은 정수 인덱스 부여(enumerate 사용 case)

**enumerate : 순서가 있는 자료형(list, set, tuple, dictionary, string)을 입력으로 받아 인덱스를 순차적으로 함께 리턴

 

2. 케라스(Keras)의 텍스트 전처리

케라스에서는 정수 인코딩을 위한 전처리 도구로 토크나이저를 제공한다.

- fit_on_texts를 통해 단어 빈도수가 높은 순부터 정수 인덱스를 부여하고 word_index를 통해 확인

--> 지정할 필요없이 자동으로 해줌

cf> 각 단어의 빈도수의 확인 : tokenizer.word_counts

- 각 정제된 단어들을 정해진 인덱스로 변환(상위 5개가 아닌 ver)

- 상위 5개 단어만 사용하여 빈도수 지정

(방법1) Tokenizer에 num_words를 지정하기

**num_words : 숫자를 0부터 카운트하기 때문에 1~5번을 이용하기 위해선 +1해준다!

word_index와 word_counts에서는 삭제되지 않음

(방법2) for문 이용해 직접 삭제

word_index와 word_counts에서도 삭제

하지만, 상위 5개에 들어가지 않는 단어는 아예 삭제 된다.

 

- 상위 5개 단어만 + OOV로 보존

Tokenizer에 oov_token으로 'OOV'를 추가해주면 된다.

단, 여기서 'OOV'는 인덱스 1로 인코딩된다.

 

7) 원-핫 인코딩(One-hot encoding)

문자를 숫자로 바꾸는 기법 중 하나이다. 이 기법이 단어를 표현하는 가장 기본적이고 필수적인 표현방법이다.

- 단어 집합(vocabulary) : 서로 다른 단어들의 집합(단어의 변형 형태도 다른 단어로 간주)

단어 집합을 만들고 정수 인코딩을 진행하여 최종적으로 "벡터"로 변환해야 한다.

 

1. 원-핫 인코딩(One-hot encoding)이란?

- 원-핫 벡터(One-hot vector)

벡터의 차원 = 단어 집합의 크기 / 1 = 표현하고 싶은 단어의 인덱스 / 0 = 다른 인덱스

- 과정 :

(1) 각 단어에 고유한 인덱스 부여(정수 인코딩)

(2) 표현하고 싶은 단어의 인덱스는 1, 나머지는 0

- 예제 :

2. 케라스를 이용한 원-핫 인코딩

케라스의 to_categorical()을 이용하면 좀 더 편하게 원-핫 인코딩을 진행할 수 있다.

정수 인코딩에서 이용했던 fit_on_texts로 토큰화 후 각 토큰에 인덱스를 부여하고 texts_to_sequence를 통해 text에 정수 인코딩을 한다. 그 뒤로 to_categorical에 인코딩한 결과를 넣어주면 위와 같이 원-핫 벡터가 나온다.

 

3. 원-핫 인코딩의 한계

- 단어의 개수가 늘어날 수록 벡터의 차원이 늘어나 저장 공간 측면에서 비효율적이다.

- 단어의 유사도를 표현할 수 없다.

- 단어 간 유사성을 알 수 없다. 

**해결방안 : 다차원 공간에 벡터화(단어의 잠재 의미를 반영)

카운트 기반 벡터화 : LSA(ch6), HAL

예측 기반 벡터화 : NNLM, RNNLM, Word2Vec(ch10), FastText(ch10)

둘다 이용 : GloVe(ch10)

 

Comments