you know I want your love. because I love you.
다음의 문장을 아래와 같이 나타낼 수 있다.
단어 벡터 : [2, 1, 2, 1, 2, 1, 1]
단어 사전 : {you : 0, know : 1 , I : 2, want : 3, love : 4, because : 5, your : 6}
2
는 you
임을 나타낸다.정부가 코로나19 위기 단계 하향 여부를 5월 초 결정하기로 했습니다.
각종 지원을 정상화하면서도 고위험군은 보호하기 위해 마련했다고 중대본은 설명했습니다.
"손 씻기, 환기 및 소독, 기침 예절 등 개인 및 공동체가 지켜야 할 기본 수칙을 일상에서 실천해달라"고 당부했습니다.
you know I want your love. because I love you
know you your you want I love because love I
단어 시퀀스 : [0 1 2 3 6 4 5 2 4 0]
단어 사전 : {you : 0, know : 1 , I : 2, want : 3, love : 4, because : 5, your : 6}
문서 1
안녕?
문서 2
제가 LA에 있을때는 말이죠... (중략) ... 태균이가 어 선배님 정말 오랜만입니다. 잘지냈습니까? 이러는거에요 ... (후략)
안녕 = [1 1]
LA = [0 0]
오랜만입니다 = [0.5 0.5]
잘 지냈습니까 = [-0.5 -0.5]
오랜만입니다 + 잘지냈습니까 = [0 0]
으로 나타낼 수 있는데 이는 LA
와 전혀 상관이 없다.안녕 = [0.8 0.8]
LA = [-2 -2]
오랜만입니다 = [0.6 0.6]
잘 지냈습니까 = [0.1 0.1]
오랜만입니다 + 잘지냈습니까 = [0.7 0.7]
로 안녕
과 유사한 값을 갖게 된다.
예시에서는 단 2개의 벡터로 이를 나타냈지만, 실제 모델에서는 관습적으로 128 또는 256차원의 벡터를 사용한다.
이러한 임베딩 기법 덕분에 Input 데이터의 크기를 줄이면서도 정보의 손실 및 왜곡 없이 단어를 모델에 넣을 수 있게 된다.
# 정규식 라이브러리 불러오기
import re
# 숫자, 알파벳, 한글이 아닌 모든 문자를 띄어쓰기로 변환
def stopwords(text):
return re.sub('[^0-9a-zA-Zㄱ-ㅣ가-힣()\[\]]', ' ' ,text)
x_train = x_train.apply(stopwords)
x_test = x_test.apply(stopwords)
# Countvectorizer 및 Kkma 토크나이저 불러오기
from sklearn.feature_extraction.text import TfidfVectorizer
from konlpy.tag import Kkma
# vectorizer 선언 (unigram)
tokenizer = Kkma()
vectorizer = TfidfVectorizer(tokenizer=tokenizer.morphs, ngram_range=(1, 1))
# 벡터화
x_train_uni = vectorizer.fit_transform(x_train)
x_test_uni = vectorizer.transform(x_test)
# vectorizer 선언 (bigram)
vectorizer = CountVectorizer(tokenizer=tokenizer.morphs, ngram_range=(2, 2))
# 벡터화
x_train_bi = vectorizer.fit_transform(x_train)
x_test_bi = vectorizer.transform(x_test)
kkma 형태소 분석기를 통해 토큰화한 문장을 TfidfVectorizer
에 넣어 TF-IDF 행렬을 구하였다.
TF-IDF가 중요하지 않은 단어를 잘 구분해 줄 것이라 믿고 별도의 불용어 처리는 하지 않았다.
# 필요 라이브러리 불러오기
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 꼬꼬마 형태소 분석기를 이용해 토큰화합니다.
tokenizer = Kkma()
x_train_token = [tokenizer.morphs(sent) for sent in x_train]
x_test_token = [tokenizer.morphs(sent) for sent in x_test]
# 문자열 상태인 토큰을 시퀀스로 바꾸어 줍니다.
seq_train = Tokenizer(filters='', lower=True)
seq_test = Tokenizer(filters='', lower=True)
seq_train.fit_on_texts(x_train)
seq_test.fit_on_texts(x_test)
x_train_seq = seq_train.texts_to_sequences(x_train)
x_test_seq = seq_test.texts_to_sequences(x_test)
# 128 정도로 설정해보자.
x_train_pad = pad_sequences(x_train_seq, maxlen=128, padding='pre', truncating='post')
x_test_pad = pad_sequences(x_test_seq, maxlen=128, padding='post', truncating='post')