🌐 해당 카테고리에 작성하는 글은 모두 안상준, 유원준 <딥 러닝을 이용한 자연어 처리 입문> 를 요약했습니다.
🌐 비전공자 개발자가 자연어 처리 대학원에 가고싶어 공부한 기록들입니다.
🌐 해당 실습은 구글의 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로만 표현하기 때문에 단어 간 유사성을 전혀 찾아내지 못함
➡이러한 단점을 해결하기 위해 단어의 잠재 의미를 반영하여 다차원 공간에 벡터화 하는 기법으로 크게 두 가지
- 카운트 기반의 벡터화 방법인 LSA(잠재 의미 분석), HAL
- 예측 기반으로 벡터화하는 NNLM, RNNLM, Word2Vec, FastText
- 카운트 기반과 예측 기반 두 가지 방법을 모두 사용하는 방법으로 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) 수동으로 분리하기
'혼자 공부중 > NLP' 카테고리의 다른 글
자연어 처리 / 텍스트 전처리 기법2 (0) | 2024.07.30 |
---|---|
텍스트 전처리 기법(정규화, 어간 추출, 표제어 추출) (0) | 2024.07.27 |
자연어 처리란? (+텍스트 전처리 기법들) (0) | 2024.07.27 |