onnnzeoz

🌐 해당 카테고리에 작성하는 글은 모두 안상준, 유원준 <딥 러닝을 이용한 자연어 처리 입문> 를 요약했습니다.
🌐 비전공자 개발자가 자연어 처리 대학원에 가고싶어 공부한 기록들입니다.
🌐 해당 실습은 구글의 collab을 통해 실시했습니다.
🌐 전 내용과 이어집니다.
https://onnnzeoz.tistory.com/103

자연어 처리 / 텍스트 전처리 기법2

🌐 해당 카테고리에 작성하는 글은 모두 안상준, 유원준  를 요약했습니다.🌐 비전공자 개발자가 자연어 처리 대학원에 가고싶어 공부한 기록들입니다.🌐 해당 실습은 구글의 collab을 통해

onnnzeoz.tistory.com

 

 

02-07 패딩(Padding)

자연어 처리를 하다보면 문장의 길이들이 다 다를 수 있으나 기계가 병렬 연산을 하기 위해서는 여러 문장의 길이를 동일하게 맞춰주는 작업이 필요함.
숫자 0을 사용하고 있다면 **제로 패딩(zero padding)**이라고 합니다.

import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer

preprocessed_sentences = [['barber', 'person'], ['barber', 'good', 'person'], ['barber', 'huge', 'person'], ['knew', 'secret'], ['secret', 'kept', 'huge', 'secret'], ['huge', 'secret'], ['barber', 'kept', 'word'], ['barber', 'kept', 'word'], ['barber', 'kept', 'secret'], ['keeping', 'keeping', 'huge', 'secret', 'driving', 'barber', 'crazy'], ['barber', 'went', 'huge', 'mountain']]

tokenizer = Tokenizer()
tokenizer.fit_on_texts(preprocessed_sentences)
encoded = tokenizer.texts_to_sequences(preprocessed_sentences)
print(encoded)

max_len = max(len(item) for item in encoded)
print('최대 길이 :',max_len)

for sentence in encoded:
    while len(sentence) < max_len:
        sentence.append(0)

padded_np = np.array(encoded)
padded_np

—결과

array([[ 1,  5,  0,  0,  0,  0,  0],
       [ 1,  8,  5,  0,  0,  0,  0],
       [ 1,  3,  5,  0,  0,  0,  0],
       [ 9,  2,  0,  0,  0,  0,  0],
       [ 2,  4,  3,  2,  0,  0,  0],
       [ 3,  2,  0,  0,  0,  0,  0],
       [ 1,  4,  6,  0,  0,  0,  0],
       [ 1,  4,  6,  0,  0,  0,  0],
       [ 1,  4,  2,  0,  0,  0,  0],
       [ 7,  7,  3,  2, 10,  1, 11],
       [ 1, 12,  3, 13,  0,  0,  0]])

이것도 Numpy라는 애쓰면 한 줄이면 끝남

padded = pad_sequences(encoded, padding='post')
padded

02-08 원-핫 인코딩(One-Hot Encoding)

문자를 숫자로 바꾸는 기법 중 1개
단어 집합에 있는 단어들을 가지고, 문자를 숫자. 더 구체적으로는 벡터로 바꾼다
가장 먼저 서로 다른 단어들의 집합인 단어 집합을 만들어야 한다

from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.utils import to_categorical

text = "나랑 점심 먹으러 갈래 점심 메뉴는 햄버거 갈래 갈래 햄버거 최고야"

tokenizer = Tokenizer()
tokenizer.fit_on_texts([text])
print('단어 집합 :',tokenizer.word_index)

이렇게 정수 인코딩을 하고, 이렇게 생성된 단어 집합에 있는 단어들로만 구성된 서브텍스트를 만듦

sub_text = "점심 먹으러 갈래 메뉴는 햄버거 최고야"
encoded = tokenizer.texts_to_sequences([sub_text])[0]
print(encoded)

그 결과
[2, 5, 1, 6, 3, 7]
이걸 이제 케라스의 to_categorical()을 통해 원-핫 인코딩을 수행하면

[[0. 0. 1. 0. 0. 0. 0. 0.] # 인덱스 2의 원-핫 벡터
 [0. 0. 0. 0. 0. 1. 0. 0.] # 인덱스 5의 원-핫 벡터
 [0. 1. 0. 0. 0. 0. 0. 0.] # 인덱스 1의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 1. 0.] # 인덱스 6의 원-핫 벡터
 [0. 0. 0. 1. 0. 0. 0. 0.] # 인덱스 3의 원-핫 벡터
 [0. 0. 0. 0. 0. 0. 0. 1.]] # 인덱스 7의 원-핫 벡터

원-핫 인코딩의 한계는
단어가 늘어날 수록 벡터 저장 공간이 부족함(=벡터의 차원이 늘어남)
단어가 1000개가 있으면 이 1000개의 단어들은 각각 1000개의 차원을 가진 벡터가 됨
또한 0과 1로만 표현하기 때문에 단어 간 유사성을 전혀 찾아내지 못함
➡이러한 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화 하는 기법으로 크게 두 가지

  1. 카운트 기반의 벡터화 방법인 LSA(잠재 의미 분석), HAL
  2. 예측 기반으로 벡터화하는 NNLM, RNNLM, Word2Vec, FastText
  3. 카운트 기반과 예측 기반 두 가지 방법을 모두 사용하는 방법으로 GloVe

02-09 데이터의 분리(Splitting Data)

지도학습(머신러닝을 학습시키고 평가하기)을 위한 데이터 분리작업

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split

<훈련 데이터>
X_train : 문제지 데이터
y_train : 문제지에 대한 정답 데이터.
<테스트 데이터>
X_test : 시험지 데이터.
y_test : 시험지에 대한 정답 데이터.
 
X, y 분리하기.
1) zip 함수를 이용하여 분리하기
zip()함수는 동일한 개수를 가지는 시퀀스 자료형에서 각 순서에 등장하는 원소들끼리 묶어주는 역할을 합니다.

X, y = zip(['a', 1], ['b', 2], ['c', 3])
print('X 데이터 :',X)
print('y 데이터 :',y)

//결과
X 데이터 : ('a', 'b', 'c')
y 데이터 : (1, 2, 3)

2) 데이터프레임을 이용하여 분리하기
3) Numpy를 이용하여 분리하기
 

테스트 데이터 분리하기

1) 사이킷 런을 이용하여 분리하기

# 임의로 X와 y 데이터를 생성
X, y = np.arange(10).reshape((5, 2)), range(5)

print('X 전체 데이터 :')
print(X)
print('y 전체 데이터 :')
print(list(y))

//결과
X 전체 데이터 :
[[0 1]
 [2 3]
 [4 5]
 [6 7]
 [8 9]]
y 전체 데이터 :
[0, 1, 2, 3, 4]

# 7:3의 비율로 훈련 데이터와 테스트 데이터 분리
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1234)

print('X 훈련 데이터 :')
print(X_train)
print('X 테스트 데이터 :')
print(X_test)

//결과
X 훈련 데이터 :
[[2 3]
 [4 5]
 [6 7]]
X 테스트 데이터 :
[[8 9]
 [0 1]]

2) 수동으로 분리하기

profile

onnnzeoz

@onnnzeoz

비전공자의 개발 공부 일지입니다 💦 국비 풀스택 과정 수강중