!pip install datasets
import warnings
import matplotlib.pyplot as plt
from datasets import load_dataset
from konlpy.tag import Mecab
from konlpy.tag import Komoran
from sklearn.feature_extraction.text import CountVectorizer, TfidfVectorizer
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import accuracy_score
sentiment_data = load_dataset("sepidmnorozy/Korean_sentiment")
warnings.filterwarnings('ignore')
print("Data type: ", type(data))
print("Data structure: ", data)
print("Data keys: ", data.keys())
print(data['train'][0])
결과
Data type: <class 'datasets.dataset_dict.DatasetDict'> Data structure: DatasetDict({ train: Dataset({ features: ['label', 'text'], num_rows: 36000 }) test: (위와 유사) validation: (위와 유사) }) Data keys: dict_keys(['train, 'test', 'validation'])
{'label': 1, 'text': '역시 명작 어렸을때 봤을때도 재밌었고 지금 봐도 몇억배 이상으로 재밌어요'}
train_data = data['train']
dev_data = data['validation']
test_data = data['test']
plt.hist(data['train']['label'], color='red')
plt.hist(data['validation']['label'], color = 'blue')
plt.hist(data['test']['label'], color = 'green')
fit
transform
fit_transform
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(1, 3))
vectorizer.fit(train_data['text'])
print(vectorizer.vocabulary_)
print(len(vectorizer.vocabulary_))
train_vectors = vectorizer.transform(train_data['text'])
dev_vectors = vectorizer.transform(dev_data['text'])
test_vectors = vectorizer.transform(test_data['text'])
print(train_data[0]['text'])
print(train_vectors)
sample_num = 0 # 확인하고 싶은 샘플 번호
sample_origin = train_data[sample_num] # 확인하고 싶은 샘플의 원래 문장
sample_transform = train_vectors[sample_num] # 확인하고 싶은 샘플의 transform된 결과
sample_inverse_transform = vectorizer.inverse_transform(sample_transform) # 확인하고 싶은 샘플의 transform된 결과를 다시 단어의 조합으로 바꾼 결과
print('Original Input: {}\nTransformed: {}\nInv-transformed: {}'.format(sample_origin, sample_transform, sample_inverse_transform))
결과
Original Input: {'label': 0, 'text': "큰 의미없이 연결'만' 되는 살인들."} Transformed: (0, 124544) 1 (0, 124606) 1 (0, 224501) 1 (0, 306290) 1 (0, 306293) 1 (0, 306294) 1 (0, 350325) 1 (0, 350328) 1 (0, 350329) 1 Inv-transformed: [array(['되는', '되는 살인들', '살인들', '연결', '연결 되는', '연결 되는 살인들', '의미없이', '의미없이 연결', '의미없이 연결 되는'], dtype='<U140')]
from sklearn.svm import LinearSVC
svm = LinearSVC()
svm.fit(train_vectors, train_data['label'])
print(svm.coef_) # weights
print(svm.intercept_) # bias
5-fold 교차 검증 구현
from sklearn.model_selection import cross_val_score
all_data = train_data['text'] + dev_data['text'] + test_data['text']
all_label = train_data['label'] + dev_data['label'] + test_data['label']
all_vectorizer = vectorizer.transform(all_data)
scores = cross_val_score(svm, all_vectors, all_label, cv=5)
print('All scores: ', scores)
print('Average: {:.2f}%'.format(scores.mean()*100)) # 5번의 스코어 평균 출력
print('Standard Deviation: {:.6f}'.format(scores.std()))
탐색하고자 하는 하이퍼파라미터와 시도해볼만한 값을 조합해서 테스트
from sklearn.model_selection import GridSearchCV
param_grid = [{'max_iter':[500, 1000, 5000], 'C':[1, 10, 100]}] # max_iter & c를 변동 하이퍼파라미터로 설정
grid_search = GridSearchCV(svm, param_grid, cv=3)
grid_search.fit(train_vectors, train_data['label'])
print(grid_search.cv_results_['mean_test_score']) # 파라미터 서치 결과
print(grid_search.best_params_) # 최고의 모델 파라미터
# 파라미터 서치 결과 출력
for mean_score, params in zip(grid_search.cv_results_['mean_test_score'], grid_search.cv_results_['params']):
print(mean_score, params)
RandomizedSearchCV
각기 다른 형태의 오차를 만드는 여러 모델을 함께 사용
최적의 하이퍼파라미터를 갖는 모델을 최종 모델로 선택하고 test 실행 결과 확인
from sklearn.metrics import accuracy_score
final_model = grid_search.best_estimator_
pred_results = final_model.predict(test_vectors)
accuracy = accuracy_score(test_data['label'], pred_results)
print("Accuracy: {.2f}%".format(accuracy * 100))
자연어처리에 대표적으로 쓰이는 피쳐
from sklearn.feature_extraction.text import CountVectorizer
vectorizer = CountVectorizer(ngram_range=(1, 3)) # ngram_range 파라미터 수정
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer()
from google.colab import drive
drive.mount('/content/drive')
%cd ./drive/MyDrive/Colab\ Notebooks/
! git clone https://github.com/SOMJANG/Mecab-ko-for-Google-Colab.git
%cd ./Mecab-ko-for-Google-Colab
!bash install_mecab-ko_on_colab_light_220429.sh
from konlpy.tag import Mecab
mecab = Mecab()
example_sentence = '실용자연어처리 실습 진행중입니다.'
print(mecab.morphs(sentence))
print(mecab.nouns(sentence))
print(mecab.pos(sentence))
train_data = train_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})
dev_data = dev_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})
test_data = test_data.map(lambda example: {'label': example['label'], 'text': ' '.join(mecab.morphs(example['text']))})