5 글 보임 - 1 에서 5 까지 (총 5 중에서)
-
글쓴이글
-
2025년 5월 15일 00:39 #139313

오형선참가자부족하지만 제가한거 올립니다
import tensorflow as tf import numpy as np from sklearn.model_selection import train_test_split from tensorflow.keras.preprocessing.text import Tokenizer from tensorflow.keras.preprocessing.sequence import pad_sequences
raw['review'] = raw['review'].str.replace('[^ㄱ-ㅎㅏ-ㅣ가-힣0-9 ]', '', regex=True) raw.drop_duplicates(subset=['review'], inplace=True)unique_review = raw['review'].tolist() unique_review = ''.join(unique_review)
tokenizer = Tokenizer(char_level=True, oov_token='<OOV>') unique_review = raw['review'].tolist() tokenizer.fit_on_texts(unique_review)
train_seq = tokenizer.texts_to_sequences(unique_review)
Y = raw['label'].tolist() raw['length'] = raw['review'].str.len()
X = pad_sequences(train_seq, maxlen=100, padding='pre') trainX, valX, trainY, valY = train_test_split(X, Y, test_size=0.2, random_state=42)
trainY = np.array(trainY, dtype=np.float32) valY = np.array(valY, dtype=np.float32)
model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(100,)), tf.keras.layers.Embedding(len(tokenizer.word_index) + 1, 16), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128)), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(1, activation='sigmoid') ])model.compile( loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'] )model.fit( trainX, trainY, epochs=5, batch_size=64, validation_data=(valX, valY) )model.summary()
2025년 10월 19일 12:18 #142998
박상빈참가자오형선님 답변에 조금 추가해서 prediction까지 만들었습니다. ------- model.py -------
import pandas as pd import numpy as np import tensorflow as tf
raw = pd.read_table('censor/reviews.txt', names=['rating', 'review']) raw['label'] = np.where(raw['rating'] > 3, 1, 0)raw['review'] = raw['review'].str.replace('[^ㄱ-ㅎㅏ-ㅣ가-힣0-9 ]', '', regex=True) raw.drop_duplicates(subset=['review'], inplace=True)reviews = raw['review'].tolist() # unique_letters = ''.join(unique_letters) # unique_letters = sorted(list(set(unique_letters)))
from tensorflow.keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer(char_level=True, oov_token='<OOV>') tokenizer.fit_on_texts(reviews)
import json print("Tokenizer has been fit. Saving it now...") tokenizer_json = tokenizer.to_json() with open('censor/tokenizer.json', 'w', encoding='utf-8') as f: f.write(json.dumps(tokenizer_json, ensure_ascii=False))print("SUCCESS: 'censor/tokenizer.json' saved.") print("You can stop this script now. You DO NOT need to re-run model.fit().") exit()train_seq = tokenizer.texts_to_sequences(reviews)
Y = raw['label'].tolist()
raw['length'] = raw['review'].str.len() # print(raw.describe()) # print(raw['length'][raw['length']<140].count())
from tensorflow.keras.preprocessing.sequence import pad_sequences
X = pad_sequences(train_seq, maxlen=100)
from sklearn.model_selection import train_test_split
trainX, valX, trainY, valY = train_test_split(X, Y, test_size=0.2, random_state=42)
trainY = np.array(trainY, dtype=np.float32) valY = np.array(valY, dtype=np.float32)
model = tf.keras.models.Sequential([ tf.keras.layers.Input(shape=(100,)), tf.keras.layers.Embedding(len(tokenizer.word_index) + 1, 16), tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(128)), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(1, activation='sigmoid') ])
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(trainX, trainY, batch_size=64, validation_data=(valX, valY), epochs=100, verbose=2)
model.save('censor/model.keras')model.summary() ------- predict.py -------
from tensorflow.keras.preprocessing.sequence import pad_sequences from tensorflow.keras.preprocessing.text import tokenizer_from_json from tensorflow.keras.preprocessing.text import Tokenizer
import json import re import tensorflow as tf
with open('censor/tokenizer.json', 'r', encoding='utf-8') as f: data = json.load(f) tokenizer = tokenizer_from_json(data)model = tf.keras.models.load_model('censor/model.keras')new_reviews = [ "이 영화 정말 최고였어요! 배우들 연기 대박!", "시간 아깝네요. 비추합니다.", "그냥 그저 그랬음", "LSTM도 외국 아저씨들이 만든 기술입니다.", "서양애들이 만든 LSTM을 가져다 써서 뭔가 만들어내는 정도에 그치지 말고", "여러분도 LSTM 같은거 만들어낼 수 있습니다.", "여러분들은 심심하시면 나중에 LSTM 보다 나은 레이어같은걸 직접 만드는 인재가 되어보십시오.", "하지만 한국은 전통적으로 기초과학 그런거 연구하는 나라가 아닙니다.", "외국 기술 그대로 써서 빨리 성과내고 논문 찍어내서 어디 기업 들어가는게 언제나 랩실의 목표입니다.", ]
cleaned_reviews = [re.sub(r'[^ㄱ-ㅎㅏ-ㅣ가-힣0-9 ]', '', review) for review in new_reviews] print(f"Cleaned: {cleaned_reviews}")new_seq = tokenizer.texts_to_sequences(cleaned_reviews) print(f"Tokenized: {new_seq}")new_X = pad_sequences(new_seq, maxlen=100) print(f"Padded shape: {new_X.shape}")predictions = model.predict(new_X) print(f"Raw predictions (probabilities): {predictions}")predicted_labels = (predictions > 0.5).astype(int)
print(f"Predicted labels (1=Positive, 0=Negative): {predicted_labels.flatten()}")for review, label in zip(new_reviews, predicted_labels.flatten()): sentiment = "선플" if label == 1 else "악플" print(f"{review} -> {sentiment}")돌리면 이렇게 나옵니다 Cleaned: ['이 영화 정말 최고였어요 배우들 연기 대박', '시간 아깝네요 비추합니다', '그냥 그저 그랬음', '도 외국 아저씨들이 만든 기술입니다', '서양애들이 만든 을 가져다 써서 뭔가 만들어내는 정도에 그치지 말고', '여러분도 같은거 만들어낼 수 있습니다', '여러분들은 심심하시면 나중에 보다 나은 레이어같은걸 직접 만드는 인재가 되어보십시오', '하지만 한국은 전통적으로 기초과학 그런거 연구하는 나라가 아닙니다', '외국 기술 그대로 써서 빨리 성과내고 논문 찍어내서 어디 기업 들어가는게 언제나 랩실의 목표입니다'] Tokenized: [[4, 2, 419, 184, 2, 62, 133, 2, 261, 5, 289, 9, 3, 2, 40, 163, 56, 2, 225, 22, 2, 67, 224], [45, 140, 2, 7, 588, 16, 3, 2, 64, 162, 65, 11, 6], [34, 106, 2, 34, 84, 2, 34, 482, 72], [14, 2, 425, 284, 2, 7, 84, 548, 56, 4, 2, 26, 402, 2, 22, 587, 53, 11, 6], [13, 196, 285, 56, 4, 2, 26, 402, 2, 52, 2, 12, 127, 6, 2, 175, 13, 2, 509, 12, 2, 26, 56, 9, 115, 8, 2, 62, 14, 17, 2, 34, 135, 15, 2, 133, 5], [69, 109, 91, 14, 2, 2, 51, 24, 41, 2, 26, 56, 9, 823, 2, 86, 2, 30, 44, 11, 6], [69, 109, 91, 56, 24, 2, 193, 193, 10, 45, 59, 2, 27, 164, 17, 2, 2, 29, 6, 2, 27, 24, 2, 236, 4, 9, 51, 24, 147, 2, 178, 278, 2, 26, 100, 8, 2, 57, 60, 12, 2, 74, 9, 29, 687, 45, 95], [10, 15, 26, 2, 37, 284, 24, 2, 75, 230, 169, 49, 25, 2, 22, 416, 153, 630, 2, 34, 188, 41, 2, 225, 20, 10, 8, 2, 27, 39, 12, 2, 7, 693, 11, 6], [425, 284, 2, 22, 587, 2, 34, 67, 25, 2, 175, 13, 2, 181, 33, 2, 158, 153, 115, 5, 2, 992, 79, 2, 429, 9, 115, 13, 2, 9, 202, 2, 22, 400, 2, 56, 9, 12, 8, 32, 2, 550, 50, 27, 2, 941, 123, 148, 2, 381, 532, 53, 11, 6]] Padded shape: (9, 100) 1/1 ━━━━━━━━━━━━━━━━━━━━ 0s 114ms/step Raw predictions (probabilities): [[9.9977332e-01] [5.6013891e-07] [1.5455307e-04] [8.9372462e-01] [2.0476698e-04] [9.9206418e-01] [1.7318060e-05] [3.3871007e-07] [9.9975896e-01]] Predicted labels (1=Positive, 0=Negative): [1 0 0 1 0 1 0 0 1] 이 영화 정말 최고였어요! 배우들 연기 대박! -> 선플 시간 아깝네요. 비추합니다. -> 악플 그냥 그저 그랬음 -> 악플 LSTM도 외국 아저씨들이 만든 기술입니다. -> 선플 서양애들이 만든 LSTM을 가져다 써서 뭔가 만들어내는 정도에 그치지 말고 -> 악플 여러분도 LSTM 같은거 만들어낼 수 있습니다. -> 선플 여러분들은 심심하시면 나중에 LSTM 보다 나은 레이어같은걸 직접 만드는 인재가 되어보십시오. -> 악플 하지만 한국은 전통적으로 기초과학 그런거 연구하는 나라가 아닙니다. -> 악플 외국 기술 그대로 써서 빨리 성과내고 논문 찍어내서 어디 기업 들어가는게 언제나 랩실의 목표입니다. -> 선플
-
글쓴이글
5 글 보임 - 1 에서 5 까지 (총 5 중에서)
- 답변은 로그인 후 가능합니다.
