Professional Documents
Culture Documents
09 - 1 - 텍스트 분류
09 - 1 - 텍스트 분류
09 - 1 - 텍스트 분류
컴퓨터공학과 황준하
Contents
2. 텍스트의 토큰화
4. 단어 임베딩
5. 텍스트의 긍정 / 부정 예측하기
2/15
자연어 처리 : 텍스트 분류
1. 텍스트 데이터와 딥러닝
[[0,0,0,0,0,0,1,0,0]] 0
[[0,0,0,0,0,0,0,1,0], [0,0,0,0,0,0,0,0,1]] 0
RNN 데이터와 유사 Flatten 학습 가능
RNN 학습 가능 3/15
자연어 처리 : 텍스트 분류
1. 텍스트 데이터와 딥러닝
어간화 등
참 잘 만든 영화다
◦ 토큰화 토큰화
단어 단위로 분리
“ 참” , “ 잘” , “ 만든” , “ 영화다”
◦ 인덱스 생성 토큰 인덱스 생성 ( 숫자와 매치 )
숫자와 매치시킴
2, 8, 15, 22
◦ 0~1 사이로 변환 one-hot 인코딩 또는 임베딩
one-hot 인코딩
[[0, 0, 1, 0, 0, 0, 0, 0],
단어 임베딩 [0, 0, 0, 0, 1, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 1, 0],
◦ x 데이터마다 다른 길이 [0, 0, 0, 0, 0, 0, 0, 1]]
패딩 (0) 길이 동일하게 조정
4/15
자연어 처리 : 텍스트 분류
2. 텍스트의 토큰화
“ 텍스트의 토큰화”의 의미
keras.preprocessing.text 모듈
◦ text_to_word_sequence() 함수
from tensorflow.keras.preprocessing.text import
text_to_word_sequence
print(f" 원문 : {text}")
print(f" 토큰화 : {result}")
원문 : 해보지 않으면 해낼 수 없다
토큰화 : [' 해보지 ', ' 않으면 ', ' 해낼 ', ' 수 ', ' 없다 ']
5/15
자연어 처리 : 텍스트 분류
2. 텍스트의 토큰화
단어 인덱스 :
{' 토큰화 ': 1, ' 텍스트의 ': 2, ' 딥러닝에서 ': 3, ' 먼저 ': 4, ' 각 ': 5,
' 단어를 ': 6, ' 나누어 ': 7, ' 합니다 ': 8, ' 단어로 ': 9, ' 해야 ': 10, '
인식됩니다 ': 11, ' 한 ': 12, ' 결과는 ': 13, ' 사용 ': 14, ' 할 ': 1
6/15
5, ': 수
자연어 처리 ': 분류
텍스트 16, ' 있습니다 ': 17}
2. 텍스트의 토큰화
9/15
자연어 처리 : 텍스트 분류
3. 단어의 one-hot 인코딩
tokenizer.texts_to_sequences(doc) 함수
import tensorflow as tf
텍스트
from 데이터를
tensorflow 인덱스
import keras데이터로 변환
from tensorflow.keras.preprocessing.text import Tokenizer
◦ x = tokenizer.texts_to_sequences(doc)
doc = [" 오랫동안 꿈꾸는 이는 그 꿈을 닮아간다 "]
one-hot 인코딩으로 변환
tokenizer = Tokenizer()
◦ keras.utils.to_categorical(x, num_classes= 단어수 +1)
tokenizer.fit_on_texts(doc)
print(tokenizer.word_index)
x = tokenizer.texts_to_sequences(doc) # 인덱스로 변환
print(x)
word_size = len(tokenizer.word_index) + 1
x = keras.utils.to_categorical(x, num_classes=word_size) # one-
hot 인코딩으로 변환
{' 오랫동안 ': 1, ' 꿈꾸는 ': 2, ' 이는 ': 3, ' 그 ': 4, ' 꿈을 ': 5, '
print(x) 닮아간다 ': 6}
[[1, 2, 3, 4, 5, 6]]
[[[0. 1. 0. 0. 0. 0. 0.]
[0. 0. 1. 0. 0. 0. 0.]
[0. 0. 0. 1. 0. 0. 0.]
[0. 0. 0. 0. 1. 0. 0.]
[0. 0. 0. 0. 0. 1. 0.] 10/15
자연어 처리 : 텍스트 분류
3. 단어의 one-hot 인코딩
11/15
자연어 처리 : 텍스트 분류
4. 단어 임베딩
단어 임베딩
one-hot 인코딩 표현을 짧은 벡터로 표현
◦ 예 , 15 개 단어의 one-hot 벡터 . 즉 , 16 개 0/1
4 개의 값으로 표현한다면 ? 단어 임베딩
12/15
자연어 처리 : 텍스트 분류
4. 단어 임베딩
단어 임베딩 레이어
Embedding 레이어
x = layers.Embedding(word_size, 8, input_length=4)
(inputs)
◦ word_size : 단어 개수 + 1 (one-hot 인코딩 비트 개수 )
◦ 8 : 8 개의 실수로 표현
◦ input_length=4 : 한 예제 (example) 의 최대 단어 개수
◦ 참고 : 가중치 개수
word_size * 8
one-hot 인코딩 (word_size) 을 8 개의 값으로 매핑시키는 작업
13/15
자연어 처리 : 텍스트 분류
5. 텍스트의 긍정 / 부정 예측하기
텍스트의 긍정 / 부정 예측하기
프로그램
◦ 09_1_1_ 영화 리뷰 긍정 _ 부정 예측하기 .ipynb
◦ 가상의 데이터 대상
docs = [" 너무 재밌네요 ", " 최고예요 ", " 참 잘 만든 영화예요 ",
" 추천하고 싶은 영화입니다 ", " 한번 더 보고싶네요 ",
" 글쎄요 ", " 별로예요 ", " 생각보다 지루하네요 ",
" 연기가 어색해요 ", " 재미있어요 "]
14/15
자연어 처리 : 텍스트 분류
연습 문제
네이버 영화 리뷰 감성 분석 ( 긍정 / 부정 )
데이터 : 네이버 영화 리뷰 전처리 후 데이터
◦ 원본 : https://github.com/e9t/nsmc/
◦ 제공 데이터 : 전처리 후 데이터
학습 데이터 : preprocessed_ratings_train.csv
열 : preprocessed_document, label
preprcessed_document : 리뷰 내용
label : 1( 긍정 ), 0( 부정 )
145393 개
검증 데이터 : preprocessed_ratings_test.csv
48852 개
실험 : 학습 데이터로 학습하고 검증 데이터로 검증하면서
검증 데이터의 accuracy 의 추세를 분석하라 .
15/15
자연어 처리 : 텍스트 분류
연습 문제
[ 참고 ] 네이버 영화 리뷰 감성 분석
데이터 읽기 (x_train(docs), y_train 만들기 )
preprocessed_train_data =
pd.read_csv("preprocessed_ratings_train.csv")
preprocessed_test_data =
pd.read_csv("preprocessed_ratings_test.csv")
docs =
preprocessed_train_data["preprocessed_document"].values
print(docs[:10]) # 확인
y_train = preprocessed_train_data["label"].values
tokenizer.texts_to_sequence(docs) 에서 에러 발생 시
- 에러 : IOPub data rate exceeded. ...
JupyterLab 실행 시 다음 옵션을 추가하여 실행
jupyter lab “ 폴더” --NotebookApp.iopub_data_rate_limit=1.0e10
16/15
자연어 처리 : 텍스트 분류