일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 동적계획법
- pandas
- 조합
- 튜플
- 어려웠던 문제
- 2017 카카오 코드
- 메뉴리뉴얼
- 에라토스테네스의 체
- Java
- HashMap
- 순열
- 쿼드압축 후 개수세기
- 보이어무어
- 점프와 순간이동
- 문자열
- python
- 완전탐색
- Stack
- 알고리즘
- 프로그래머스
- dfs
- 규칙찾기
- HashSet
- 최소공배수
- Dynamic Programming
- 완전 탐색
- 영문자 확인
- fragment identifier
- 반복문
- 후위 표기법
- Today
- Total
csmoon1010의 SW 블로그
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(5) 본문
02. 텍스트 전처리(Text preprocessing)
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
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)
'데이터&인공지능 > 자연어처리' 카테고리의 다른 글
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(7) (0) | 2020.02.13 |
---|---|
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(6) (0) | 2020.02.13 |
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(4) (0) | 2020.02.12 |
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(3) (0) | 2020.02.11 |
자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문 공부하기(2) (0) | 2020.02.09 |