본문 바로가기

캐글 코드

캐글 News Detection 1탄

반응형

데이터 받기

val_data = pd.read_csv('/kaggle/input/emotion-dataset/validation.csv')
train_data = pd.read_csv('/kaggle/input/emotion-dataset/training.csv')
test_data = pd.read_csv('/kaggle/input/emotion-dataset/test.csv')

 

print("Validation data :",val_data.shape)
print("Train data :",train_data.shape)
print("Test data :",test_data.shape)

 

 

half_test_data = test_data.iloc[1000:]
test_data = test_data.iloc[:1000]

val_data = pd.concat([val_data, half_test_data], axis=0)

print("new Vald data :",val_data.shape)
print("new Test data :",test_data.shape)

데이터 나누기

#테스트 데이터를 천개단위로 나누기

half_test_data = test_data.iloc[1000:]
test_data = test_data.iloc[:1000]

 

#검증데이터와 천개의 데이터합치기
val_data = pd.concat([val_data, half_test_data], axis=0)

print("new Vald data :",val_data.shape)
print("new Test data :",test_data.shape)

 

label값에 따른 내용 붙여주기

 

labels_dict = {0:'sadness', 1:'joy', 2:'love', 3:'anger', 4:'fear', 5:'surprise'}
train_data['label_name'] = train_data['label'].map(labels_dict)
train_data.head()

 

groupby로 각라벨의 갯수출력하기

 

train_data.groupby(["label_name","label"]).size()

 

#시각화

train_data["label_name"].value_counts().plot(kind='bar',color=['yellow', '#0c0d49', '#b82f2f', '#331e1e', 'red','#00fff7'])

 

결측치 출력

 

print(train_data.isnull().sum())
print(val_data.isnull().sum())
print(test_data.isnull().sum())

 

 

토큰나이저

# Tokenizer().fit_on_texts는 텍스트에 숫자를 매핑해주는 코드

#word_index는 토큰화된 데이터를 딕셔너리로 만들어주는 코드

#stemmer.stem은 어간 추출방식임 (형태소분석의 일종임)

tokenizer1 = Tokenizer()
tokenizer1.fit_on_texts(all_list)
word_index1 = tokenizer1.word_index

print("Nombre of words without Stemming:",len(word_index1))

stemmer = PorterStemmer()
stemmed_words = [stemmer.stem(word) for word in word_index1.keys()]

tokenizer2 = Tokenizer()
tokenizer2.fit_on_texts(stemmed_words)
word_index2 = tokenizer2.word_index

print("Nombre of words with Stemming:",len(word_index2))

 

 

#data.interrows는 데이터를 하나의 객체로 묶어두는 코드임 (일반적으로 반복문을 통해서 빼내는 역활을 함) 

#texts_to_sequences는 토크나이저에있는 딕셔너리로 값을 매핑해줌

def preprocess_data(data):
    new_data = []
    for index, row in data.iterrows():
        test_split = row['text'].split()
        stemmed_words2 = [stemmer.stem(word) for word in test_split]
        token_list= tokenizer2.texts_to_sequences([stemmed_words2])[0]
        new_data.append([token_list,row['label']]) 
    return new_data

 

 

매핑된 숫자에 가장큰 수를 가져오기


train_X = [row[0] for row in new_train_data]
train_y = [row[1] for row in new_train_data]

length_of_longest_sentence = len(max(train_X, key=len))
print(length_of_longest_sentence)
print(max(train_X, key=len))

 

원 핫 인코딩

 

# Convert labels to one-hot encoding
train_y_one_hot = to_categorical(train_y, num_classes=16000)
val_y_one_hot = to_categorical(val_y, num_classes=16000)

 

모델학습

# Embedding은 단어를 100개의 숫자로 표현하는 방식임

숫자 16000은 단어의 최대갯수를 의미

66은  입력할 차원수를 의미

model = Sequential()
model.add(Embedding(16000, 100, input_length=66))
model.add(Bidirectional(LSTM(150)))
model.add(Dense(16000, activation='softmax'))
adam = Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
history = model.fit(train_X, train_y_one_hot, epochs=25, verbose=1,validation_data=(val_X,val_y_one_hot))
#print model.summary()
print(model)

반응형