인공신경망 만들기
#keras: 딥러닝 프레임워크
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, SimpleRNN
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
#Embedding: 밀집벡터 형태로 변환해준다.
# 1단계: 무조건, Sequential로 부터 객체를 생성하기
model = Sequential()
#model: 데이터를 입력받아 출력을 하기까지의 과정과 오고가는 데이터 학습을 하는 것
model.add(Dense(2, input_dim = 3, activation="softmax"))
#Dense(출력차원, input_dim =입력차원, activation=활성함수)

model.summary()
# Param #(Number Of Parameter) : 학습 시켜야 할 변수들
# ex) Param # 8 개 = 가중치 변수 3*2 + 출력에 b변수 2개
#

#입력, 히든 계층은 주로 활성화 함수로 relu가 사용됨.
#입력: 4차원, 출력: 8차원
model = Sequential() #이걸 또 실행하지 않으면 이전 모델에 이어쓰기가 된다.
model.add(Dense(8, input_dim = 4, activation="relu")) #leaky relu
#Dense: fully connected layer를 구현한 클래스


model.add(Dense(6, activation="relu")) #leaky relu
#이전 레이어의 출력노드만큼 입력노드로 자동으로 들어간다.
model.add(Dense(3, activation="softmax")) #ex) 감정분류 모델을 만들고 있음. 출력: 감정 3가지
#sigmoid는 활성화 함수로 softmax는 출력층에 사용dbs
model.summary()
#딥러닝: 입력과 출력 사이에 히든 계층이 있음.


keras 자연어처리 함수
tok = Tokenizer()
train="Can I look around?"#문장이 저장되어 있는 변수
tok.fit_on_texts([train]) #Voc 생성
tok.index_word #코퍼스가 '인덱스': '단어' 순으로 만들어짐 ex)출력 단어 4가지 존재
#새로운 문장을 인코딩
# 단어의 인덱스가 함께있는 tok.index_word의 결과가 필요
text = "Can I look at my phone after lasik" #text에는 기존 Voc에 있는 단어와 없는 단어가 함께 있다.
tok.texts_to_sequences([text]) #Can I look은 기존 Voc에 있어서 출력
seq = tok.texts_to_sequences([text])[0]
seq
#패딩: 길이가 다른 인코딩 결과를 동일하게 맞춰준다.
#모델의 입력으로 들어가야하는 길이는 반드시 동일해야한다.
#길이가 짧으면 채워넣고 길면 자르기
pad_sequences([[1,2,3],[2,3],[3,4,5,6]], maxlen = 3 )#maxlen: 길이 지정
#결과: 앞부분이 잘렸다.


pad_sequences([[1,2,3],[2,3],[3,4,5,6]], maxlen = 3, padding='post' )#padding='post': 뒤에 0추가 / 기본값은 padding='pre' : 앞에 0추가



원핫인코딩는 단어집합의 크기가 커서 유사도를 구하는데 시간이 오래걸리고 어려움.
-> 문제해결: 임베딩벡터
원핫인코딩 : 메모리 많이 차지, 대부분 0, 1 또는 0
임베딩벡터 : 메모리 적게 차지, 값이 실수로 출력
ex) 1만 차원 원핫 벡터 -> 10차원 임베딩 벡터
차원을 대폭 줄여서 나타낼 수 있다.
임베딩벡터 만들기
model.add(Embedding(사전의 크기, 출력차원, 입력데이터의 길이))
ex)
model.add(Embedding(vocab_size = 10000, output_dim = 10, input_length = 3))
신경망 구조로 훈련하기 - 뉴스 카테고리 추측 모델만들기
11000편의 뉴스본문과 12가지의 카테고리를 가지고 본문에 등장하는 단어들을 바탕으로 카테고리의 종류를 데이터 셋으로 하여 모델을 생성하여 만든 모델에 새로운 기사 내용을 입력해 train셋을 가지고 학습한 것과 새로운 기사 내용을 비교해서 어떤 카테고리에 있는 기사인지 추측하기
신경망 - 새로운 뉴스기사가 입력되었을때 기존에 학습된 신경망 구조를 통해서 가중치 등의 연산을 해서 마지막에 softmax를 이용해 도출한 결과
import pandas as pd
from sklearn.datasets import fetch_20newsgroups #뉴스기사 데이터셋
import matplotlib.pyplot as plt #시각화 라이브러리
from tensorflow.keras.utils import to_categorical
news = fetch_20newsgroups(subset='train')
news.keys()
#'data'(본문), 'filenames', 'target_names(본문에 대한 카테고리)', 'target', 'DESCR' : 총 5개의 key
news.data #뉴스 기사만 출력된다.
len(news.data) #11314
news.target_names #뉴스카테고리 이름들
news.data[9] #9번 인덱스 기사 본문
news.target[9] #9번 인덱스 기사의 카테고리 번호
news.target_names[9] #9번 인덱스 기사의 카테고리
4장 판다스 데이터 분석 — 데이터 사이언스 스쿨
.ipynb .pdf to have style consistency --> Contents
datascienceschool.net
df = pd.DataFrame(news.data, columns=['article'])
df
df['target'] = news.target
df

df['target'].value_counts().plot(kind='bar')

test = fetch_20newsgroups(subset='test', shuffle=True)
len(test.data) #7532
train_article = df['article']
train_target = df['target']
test_article = test.data
test_target = test.target
len(test_article)
len(test_target)
def pre_processing_data(trainData, testData, ty):#트레인, 테스트, 어떤 유형의 분류 문제인가
tok = Tokenizer(num_words=10000)#10000차원
tok.fit_on_texts(trainData)
xtrain = tok.texts_to_matrix(trainData, mode=ty)
xtest = tok.texts_to_matrix(testData, mode=ty)
return xtrain, xtest, tok.index_word
xtrain, xtest, indexWord = pre_processing_data(train_article, test_article, "binary")
xtrain #(11314,10000)

xtest#(7532, 10000)

indexWord
xtrain, target 데이터를 신경망으로 학습하여 분류 모델 생성 -> xtest데이터를 모델에 입력하여 예측 분류(20가지)
#to_categorical: 정수형(integer) 클래스 레이블(label)을 원-핫 인코딩(one-hot encoding) 벡터로 변환
ytrain = to_categorical(train_target, 20)
ytest = to_categorical(test_target, 20)
ytrain

신경망 만들기

#모델 - 레이어 생성
model=Sequential()
model.add(Dense(256, input_shape=(10000,), activation='relu')) #(1,)은 행의 갯수
model.add(Dense(128, activation='relu'))
model.add(Dense(20, activation='softmax'))
#모델링 환경 변수 설정
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
#모델링(트레이닝)
model.fit(xtrain, ytrain, batch_size=128, epochs=5, verbose=1, validation_split=0.1)

score=model.evaluate(xtest, ytest, batch_size=128, verbose=0)
print(score[1])

'자연어처리(NLP) & CHAT GPT > NLP' 카테고리의 다른 글
| [NLP] 워드 임베딩(Word Embedding) - 개념 (0) | 2023.08.04 |
|---|---|
| [NLP] LSTM (0) | 2023.08.03 |
| [NLP] 신경망기반 텍스트 분류 - 개념 (0) | 2023.08.01 |
| [NLP] 언어 모델링 - 실습 (0) | 2023.07.31 |
| [NLP] 중요한 정규표현식 (0) | 2023.07.30 |