1) 특수 문자 제거 hi와 hi!를 같은 단어로 처리 2) stopword 제거 is, the와 같이 의미보다는 문법적 기능을 가진 단어 제거 노이즈 제거와 같음 3) stemming love, loved, loves가 모두 같은 love로 처리 되도록 단어의 공통된 형태로 변환 normalize(정규화)와 같음
2) konlpy등으로 tokenizing을 먼저 하고, CountVectorizer의 옵션을 조절하여 vectorizing만 수행
nouns=[]fordocindocuments:nouns.append(okt.nouns(doc))cv=CountVectorizer(tokenizer=lambdax:x,lowercase=False)# lowercase 인자를 꼭 False로 해야 에러가 안난다.
X=cv.fit_transform(nouns)
2번 방법으로 하면 토큰화된 결과를 한 번 확인할 수 있음
N-grams
연속된 N개의 단어를 기준으로 텍스트 분석을 수행
TF-IDF
상대적으로 자주 발생하는 단어가 더 중요하다는 점을 반영
단순한 빈도수가 아니라 상대적 빈도수가 중요하다
(특정 단어 빈도수) / (전체 단어 빈도수) * log (데이터 내 총 문서의 개수/데이터 내 특정 단어가 들어간 문서의 개수)
모든 문서에서 전반적으로 나타나는 단어의 점수를 줄여줌 (ex. 그러나, 그리고 등)
fromsklearn.feature_extraction.textimportTfidfVectorizer# TfidfVectorizer을 불러옵니다. (stop_words 는 영어로 설정)
vectorizer=TfidfVectorizer(stop_words='english')X=vectorizer.fit_transform(df_clean['Review Text'].str.lower())
importosos.environ['TF_CPP_MIN_LOG_LEVEL']='2'importtensorflowastffromtensorflow.kerasimportlayers,Sequentialfromtensorflow.keras.optimizersimportAdamfromtensorflow.keras.datasetsimportimdbfromtensorflow.keras.preprocessing.sequenceimportpad_sequencesdefload_data(num_words,max_len):# imdb 데이터셋을 불러옵니다. 데이터셋에서 단어는 num_words 개를 가져옵니다.
(X_train,y_train),(X_test,y_test)=imdb.load_data(num_words=num_words)# 단어 개수가 다른 문장들을 Padding을 추가하여
# 단어가 가장 많은 문장의 단어 개수로 통일합니다.
X_train=pad_sequences(X_train,maxlen=max_len)X_test=pad_sequences(X_test,maxlen=max_len)returnX_train,X_test,y_train,y_testdefbuild_rnn_model(num_words,embedding_len):model=Sequential()# TODO: [지시사항 1번] 지시사항에 따라 모델을 완성하세요.
model.add(layers.Embedding(input_dim=num_words,output_dim=embedding_len))model.add(layers.SimpleRNN(16))model.add(layers.Dense(1,activation="sigmoid"))returnmodeldefmain(model=None,epochs=5):# IMDb 데이터셋에서 가져올 단어의 개수
num_words=6000# 각 문장이 가질 수 있는 최대 단어 개수
max_len=130# 임베딩 된 벡터의 길이
embedding_len=100# IMDb 데이터셋을 불러옵니다.
X_train,X_test,y_train,y_test=load_data(num_words,max_len)ifmodelisNone:model=build_rnn_model(num_words,embedding_len)# TODO: [지시사항 2번] 모델 학습을 위한 optimizer와 loss 함수를 설정하세요.
optimizer=Adam(learning_rate=0.001)model.compile(optimizer=optimizer,loss="binary_crossentropy",metrics="accuracy")# TODO: [지시사항 3번] 모델 학습을 위한 hyperparameter를 설정하세요.
hist=model.fit(X_train,y_train,epochs=epochs,batch_size=100,validation_split=0.2,shuffle=True,verbose=2)# 모델을 테스트 데이터셋으로 테스트합니다.
test_loss,test_acc=model.evaluate(X_test,y_test,verbose=0)print()print("테스트 Loss: {:.5f}, 테스트 정확도: {:.3f}%".format(test_loss,test_acc*100))returnoptimizer,histif__name__=="__main__":main()
### for문 이용
lines=[]withopen("sample.txt")asf:forrowinf:lines.append(f.strip())### readlines() 이용
lines2=[]withopen("sample2.txt")asf:lines2=f.readlines()# 여러 줄 읽기
lines2=[x.strip()forxinlines2]# 줄바꿈 문자 제거
Normalize
최대 1, 최소 0이 되도록 선형 정규화 각 feature 별로 (column 별) 최솟값을 빼고 최댓값으로 나누기
foriinrange(X.shape[1]):# feature의 개수만큼 반복 = 13
X[:,i]-=np.min(X[:,i])# 해당 열의 minimum을 일괄적으로 빼기
X[:,i]/=np.max(X[:,i])# 해당 열의 max 값으로 전체 열을 나누기
returnX
Scikit-learn
fromsklearn.model_selectionimporttrain_test_split
Regression
Linear Regression
fromsklearn.linear_modelimportLinearRegressionlrmodel=LinearRegression()lrmodel.fit(train_x,train_y)beta_0=lrmodel.coef_[0]# lrmodel로 구한 직선의 기울기
beta_1=lrmodel.intercept_# lrmodel로 구한 직선의 y절편
print("beta_0: %f"%beta_0)print("beta_1: %f"%beta_1)print("Loss: %f"%loss(X,Y,beta_0,beta_1))pred=lrmodel.predict(test_x)socre=lr_mode.score(test_x,test_y)
defkmeans(X,num_clusters,initial_centroid_indices):importtimeN=len(X)centroids=X[initial_centroid_indices]labels=np.zeros(N)whileTrue:is_changed=False# 라벨이 바뀌었는지
foriinrange(N):distances=[]forcentroidincentroids:distances.append(distance(X[i],centroid))iflabels[i]!=np.argmin(distances):is_changed=Truelabels[i]=np.argmin(distances)# 클러스터 0, 1, 2 중 하나
# print(labels)
### 새 중심점 계산
forkinrange(num_clusters):x=X[labels==k][:,0]y=X[labels==k][:,1]x=np.mean(x)y=np.mean(y)centroids[k]=[x,y]ifnotis_changed:breakreturnlabels### 유클리드 거리 norm
defdistance(x1,x2):returnnp.sqrt(np.sum((x1-x2)**2))
importtensorflowastfimportnumpyasnpimportmatplotlib.pyplotaspltimportmatplotlibasmplfrommpl_toolkits.mplot3dimportAxes3Dimportosos.environ['TF_CPP_MIN_LOG_LEVEL']='2'np.random.seed(100)tf.random.set_seed(100)# 비선형 데이터 샘플 생성
x_data=np.linspace(0,10,100)y_data=1.5*x_data**2-12*x_data+np.random.randn(*x_data.shape)*2+0.5# print(x_data)
# print(x_data.shape) # (100, )
# 모델 정의
model=tf.keras.models.Sequential([(tf.keras.layers.Dense(20,input_dim=1,activation='relu'),)tf.keras.layers.Dense(20,activation='relu'),tf.keras.layers.Dense(1)])model.compile(loss='mean_squared_error',optimizer='adam')history=model.fit(x_data,y_data,epochs=500,verbose=1)predictions=model.predict(x_data)